aprende java con ejercicios - dam

240

Upload: others

Post on 27-Mar-2022

12 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Aprende Java con Ejercicios - DAM

Aprende Java con EjerciciosUn manual para aprender a programar en Java desde cero conmultitud de ejemplos y maacutes de 200 ejercicios resueltos

Luis Joseacute Saacutenchez Gonzaacutelez

Este libro estaacute a la venta en httpleanpubcomaprendejava

Esta versioacuten se publicoacute en 2016-01-25

ISBN 978-84-608-2372-8

This is a Leanpub book Leanpub empowers authors and publishers with the LeanPublishing process Lean Publishing is the act of publishing an in-progress ebookusing lightweight tools and many iterations to get reader feedback pivot until youhave the right book and build traction once you do

copy 2014 - 2016 Luis Joseacute Saacutenchez Gonzaacutelez

Iacutendice general

Sobre este libro i

Sobre el autor ii

Centros en los que se usa este libro iii

Introduccioacuten iv

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java v

1 iexclHola mundo - Salida de datos por pantalla 111 iexclHola mundo - Mi primer programa 112 Coloreado de texto 413 Ejercicios 6

2 Variables 821 Definicioacuten y tipos de variables 8

211 Enteros (int y long) 9212 Nuacutemeros decimales (double y float) 9213 Cadenas de caracteres (String) 10

22 Operadores artimeacuteticos 1223 Asignacioacuten de valores a variables 1224 Conversioacuten de tipos (casting) 1325 Ejercicios 15

3 Lectura de datos desde teclado 1631 Lectura de texto 1632 Lectura de nuacutemeros 1733 La clase Scanner 1834 Ejercicios 22

4 Sentencia condicional (if y switch) 2541 Sentencia if 2542 Operadores de comparacioacuten 2843 Operadores loacutegicos 2944 Sentencia switch (seleccioacuten muacuteltiple) 3145 Ejercicios 35

Fernando
Resaltado

IacuteNDICE GENERAL

5 Bucles 3951 Bucle for 3952 Bucle while 4053 Bucle do-while 4154 Ejercicios 44

6 Nuacutemeros aleatorios 5161 Generacioacuten de nuacutemeros aleatorios con y sin decimales 5162 Generacioacuten de palabras de forma aleatoria de un conjunto dado 5563 Ejercicios 58

7 Arrays 6271 Arrays de una dimensioacuten 6272 Arrays bidimensionales 6673 Recorrer arrays con for al estilo foreach 7074 Ejercicios 72

741 Arrays de una dimensioacuten 72742 Arrays bidimensionales 77

8 Funciones 8081 Implementando funciones para reutilizar coacutedigo 8082 Comentarios de funciones 8283 Creacioacuten de bibliotecas de rutinas mediante paquetes 8384 Aacutembito de las variables 8785 Paso de paraacutemetros por valor y por referencia 8786 Ejercicios 92

9 Programacioacuten orientada a objetos 9591 Clases y objetos 9592 Encapsulamiento y ocultacioacuten 9693 Meacutetodos 97

931 Creiacute haber visto un lindo gatito 97932 Meacutetodos getter y setter 101933 Meacutetodo toString 105

94 Aacutembitovisibilidad de los elementos de una clase - public protected y private 10795 Herencia 108

951 Sobrecarga de meacutetodos 11296 Atributos y meacutetodos de clase (static) 11497 Interfaces 11698 Arrays de objetos 12299 Ejercicios 127

991 Conceptos de POO 127992 POO en Java 128993 Arrays de objetos 131

10Colecciones y diccionarios 133

IacuteNDICE GENERAL

101 Colecciones la clase ArrayList 1331011Principales meacutetodos de ArrayList 1331012Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de sus

elementos 1351013ArrayList de objetos 1411014Ordenacioacuten de un ArrayList 142

102 Diccionarios la clase HashMap 1461021Principales meacutetodos de HashMap 1461022Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas 147

103 Ejercicios 152

11Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 155111 Lectura de un fichero de texto 156112 Escritura sobre un fichero de texto 159113 Lectura y escritura combinadas 160114 Otras operaciones sobre ficheros 162115 Paso de argumentos por liacutenea de comandos 163116 Combinacioacuten de ficheros y paso de argumentos 166117 Procesamiento de archivos de texto 168118 Ejercicios 171

12Aplicaciones web en Java (JSP) 173121 Hola Mundo en JSP 173122 Mezclando Java con HTML 175123 Recogida de datos en JSP 179124 POO en JSP 183125 Ejercicios 188

13Acceso a bases de datos 192131 Socios de un club de baloncesto 192132 Preparacioacuten del proyecto de ejemplo 195

1321Activar la conexioacuten a MySQL 1951322Incluir la libreriacutea MySQL JDBC 197

133 Listado de socios 197134 Alta 200135 Borrado 202136 CRUD completo con Bootstrap 205137 Ejercicios 207

Apeacutendice A Ejercicios de ampliacioacuten 213

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 216Descarga e instalacioacuten 216Configuracioacuten 217Creacioacuten de un proyecto 218Depuracioacuten 221

IacuteNDICE GENERAL

Apeacutendice C Caracteres especiales 224Liacuteneas para tablas 224Bloques 224Figuras de ajedrez 224Ciacuterculos 224Flechas 224Nuacutemeros en ciacuterculos 224Dados 224Fichas de dominoacute 224Cartas 225Caras 225Horoacutescopo 225Miscelaacutenea 225

Sobre este libroldquoAprende Java con Ejerciciosrdquo es un manual praacutectico para aprender a programar enJava desde ceroNo es necesario tener conocimientos previos de programacioacuten La dificultad del libroes gradual empieza con conceptos muy baacutesicos y ejercicios muy sencillos y vaaumentando en complejidad y dificultad a medida que avanzan los capiacutetulosLa praacutectica hace al maestro Como de verdad se aprende a programar es programandodesde el principio y esa es la filosofiacutea que sigue este libro En cada capiacutetulo se explicanuna serie de conceptos de programacioacuten y se ilustran con ejemplos Al final de cadauno de los capiacutetulos se plantean ejercicios de diferente dificultadEste libro contiene maacutes de 200 ejercicios Tanto las soluciones a los ejercicios como losejemplos estaacuten disponibles en GitHub httpsgithubcomLuisJoseSanchezaprende-java-con-ejercicios y tanto los unos como los otros siguen los estaacutendares de programacioacutende Google para el coacutedigo fuente escrito en el lenguaje de programacioacuten Java1ldquoAprende Java con Ejerciciosrdquo es un libro hecho casi a medida de la asignatura ldquoProgra-macioacutenrdquo que forma parte del curriacuteculo del primer curso de los ciclos formativos DAW(Desarrollo de Aplicaciones Web) y DAM (Desarrollo de Aplicaciones Multiplataforma)pero igualmente puede ser utilizado por estudiantes de Ingenieriacutea Informaacutetica Ingenie-riacutea de Telecomunicaciones o Ciencias Matemaacuteticas en la asignatura de ldquoProgramacioacutenrdquode los primeros cursosSi tienes alguna duda o quieres hacer alguacuten comentario en relacioacuten a este libro tienesa tu disposicioacuten el grupo de Google httpsgroupsgooglecomdforumaprende-java-con-ejercicios Cualquier sugerencia para mejorar este manual seraacute bienvenida

1httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

i

Sobre el autorLuis Joseacute Saacutenchez Gonzaacutelez es Ingeniero Teacutecnico en Informaacutetica de Gestioacuten por laUniversidad de Maacutelaga (Espantildea) y funcionario de carrera de la Junta de Andaluciacuteadesde 1998 En su trabajo de profesor de Informaacutetica combina sus dos pasiones laensentildeanza y la programacioacutenEn el momento de publicar este libro es profesor del IES Campanillas (Maacutelaga) eimparte clases en el Ciclo Superior de Desarrollo de Aplicaciones WebPuedes ponerte en contacto con el autor mediante la direccioacuten de correo electroacute-nico luisjoseprofegmailcom o mediante LinkedIn (httpseslinkedincompubluis-joseacute-saacutenchez86b0834)

ii

Centros en los que se usa este librobull IES Campanillas Maacutelaga (Espantildea)bull IES Poliacutegono Sur Sevilla (Espantildea)bull IES Murgi El Ejido - Almeriacutea (Espantildea)bull IES Punta del Verde Sevilla (Espantildea)

Si eres profesor y utilizas este libro para ensentildear Java piacutedele al autor que antildeada enesta seccioacuten el nombre de tu centro educativo o empresa escribiendo un correo a ladireccioacuten luisjoseprofegmailcom indicando la localidad y el paiacutes del centro

iii

IntroduccioacutenJava es un lenguaje de programacioacuten es de hecho desde hace maacutes de 10 antildeos ellenguaje de programacioacuten maacutes utilizado en el mundo seguacuten el iacutendice PYPL2(PopularitYof Programming Language index)Los ordenadores no entienden - por ahora - el espantildeol ni el ingleacutes ni ninguacuten otroidioma natural De una forma muy simplificada podriacuteamos decir que un lenguaje deprogramacioacuten es un idioma que entiende el ordenador3 Cualquier aplicacioacuten - proce-sador de textos navegador programa de retoque fotograacutefico etc - estaacute compuesta deuna serie de instrucciones convenientemente empaquetadas en ficheros que le dicenal ordenador de una manera muy precisa queacute tiene que hacer en cada momentoJava es un lenguaje de programacioacuten estructurado y como tal hace uso de variablessentencias condicionales bucles funcioneshellip Java es tambieacuten un lenguaje de progra-macioacuten orientado a objetos y por consiguiente permite definir clases con sus meacutetodoscorrespondientes y crear instancias de esas clases Java no es un lenguaje de marcascomo HTML o XML aunque puede interactuar muy bien con ellos4Las aplicaciones Java se suelen compilar a bytecode que es independiente del sistemaoperativo no a binario que siacute depende del sistema operativo De esta forma elbytecode generado al compilar un programa escrito en Java deberiacutea funcionar encualquier sistema operativo que tenga instalada una maacutequina virtual de java (JVM)Cualquier editor simple como Nano o GEdit es suficiente para escribir coacutedigo enJava aunque se recomiendan IDEs5 como NetBeans o Eclipse ya que tienen algunascaracteriacutesticas que facilitan mucho la programacioacuten como el chequeo de erroresmientras se escribe el autocompletado de nombres de variables y funciones y muchomaacutes

2httppyplgithubioPYPLhtml3En realidad un ordenador no entiende directamente los lenguajes de programacioacuten como Java C Ruby etc Mediante una

herramienta que se llama compilador o traductor seguacuten el caso lo que hay escrito en cualquiera de estos lenguajes se convierteen coacutedigo maacutequina - secuencias de unos y ceros - que es el uacutenico lenguaje que de verdad entiende el ordenador

4El lector deberaacute tener unos conocimientos baacutesicos de HTML para entender bien y sacar provecho del capiacutetulo relativo a JSPde este mismo libro Una web excelente para aprender HTML es httpw3schoolscom

5IDE Integrated Development Enviroment (Entorno de Desarrollo Integrado)

iv

Instalacioacuten y configuracioacuten del entorno deprogramacioacuten JavaTodos los ejemplos que contiene este libro asiacute como las soluciones a los ejerciciosse han escrito sobre Linux en concreto sobre Ubuntu (httpwwwubuntucom) Noobstante todo el coacutedigo deberiacutea compilar y funcionar sin ninguacuten problema en cualquierotra plataformaEl software necesario para seguir este manual es el siguiente6

OpenJDKEl Open Java Development Kit (OpenJDK) contiene una serie de componentesque permiten desarrollar y ejecutar aplicaciones escritas en Java Incluye la maacute-quina virtual de Java (JVM) que permite ejecutar bytecode Como mencionamosen el apartado Introduccioacuten el bytecode es el ejecutable en Java El OpenJDKtambieacuten incluye el compilador javac que permite compilar el coacutedigo fuente paragenerar el bytecode En Ubuntu basta ejecutar una liacutenea en la ventana determinal para instalar el OpenJDK

$ sudo apt-get install openjdk-8-jdk

Para los sitemas operativos Mac OS X y Windows se encuentran disponiblespara su descarga los archivos de instalacioacuten del OpenJDK en la paacutegina UnofficialOpenJDK installers for Windows Linux and Mac OS X7 Otra opcioacuten consiste enutilizar el JDK oficial de Oracle que se puede descargar en el apartado Java SEDevelopment Kit 8 - Downloads8 de la web de esta misma empresa No vamos aexplicar las diferencias entre el OpenJDK y el JDK ya que se escapa al aacutembitode este libro A efectos praacutecticos todos los ejemplos contenidos en este manualfuncionan tanto con en el OpenJDK como con el JDK y los ejercicios se puedenrealizar sin problema sea cual sea el kit de desarrollo instalado

Editor de textos simplePara seguir este manual recomendamos utilizar al principio un editor de textossencillo para probar los primeros programas y realizar los primeros ejercicioscompilando en liacutenea de comandos De esta manera el lector se va familiarizandocon el proceso de edicioacuten de coacutedigo compilacioacuten y ejecucioacuten y va entendiendo loque sucede en cada paso En Ubuntu viene instalado por defecto el editor GEditel sistema operativo Mac OS X viene con TextEdit y en Windows podemos usarel programa Bloc de notas

6En la paacutegina httphelloworldcollectionde se muestra el programa Hola mundo escrito en maacutes de 400 lenguajes deprogramacioacuten

7httpsgithubcomalexkaskoopenjdk-unofficial-builds8httpwwworaclecomtechnetworkjavajavasedownloadsjdk8-downloads-2133151html

v

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java vi

GeanyUna vez que el lector ha superado la barrera de escribir sus primeros programasrecomendamos utilizar el entorno de programacioacuten Geany (por ejemplo a partirdel capiacutetulo 2) Se trata de un IDE muy ligero que permite realizar aplicacionessencillas con rapidez Mediante Geany se puede escribir el coacutedigo chequearsi contiene errores compilar y ejecutar el bytecode generado Para programaspequentildeos - por ej calcular la media de varios nuacutemeros - es recomendable utilizarGeany en lugar de un IDE maacutes complejo como Netbeans Mientras con Geanyda tiempo a escribir el coacutedigo compilar y ejecutar Netbeans todaviacutea estariacuteaarrancandoInstalacioacuten de Geany (y los plugins adicionales) en Ubuntu

$ sudo apt-get install geany

$ sudo apt-get install geany-plugins

En la seccioacuten de descargas de la paacutegina oficial de Geany9 se encuentran losficheros de instalacioacuten de este programa tanto para Mac OS X como paraWindowsUna vez instalado Geany es conveniente realizar algunos ajustes en la configu-racioacuten Presiona Control + Alt + P para abrir la ventana de preferencias Hazclic en la pestantildea Editor y luego en la pestantildea Sangriacutea Establece las opcionestal y como se indican a continuacioacuten

9httpwwwgeanyorgDownloadReleases

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java vii

Figura 01 Configuracioacuten de Geany (sangriacutea)

Tambieacuten es recomendable marcar las casillas Mostrar guiacuteas de sangriacutea y Mostrarnuacutemeros de liacutenea Estas opciones se activan en la pestantildea Mostrar

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java viii

Figura 02 Configuracioacuten de Geany (guiacuteas de sangriacutea y nuacutemeros de liacutenea)

NetbeansCuando las aplicaciones a desarrollar son maacutes complejas y sobre todo cuandoeacutestas constan de varios ficheros se recomienda utilizar Netbeans de la empresaOracle En el capiacutetulo 9 el lector ya podriacutea sacarle mucho partido al uso de esteIDE Se trata de un entorno integrado muy potente y muy usado a nivel profesionalque incluye el autocompletado de sintaxis y permite una depuracioacuten avanzadapaso a paso Netbeans se puede descargar de forma gratuita y para cualquierplataforma desde httpsnetbeansorgdownloadsDespueacutes de la instalacioacuten de Netbeans procedemos a configurar el editorPara ello seleccionamos Herramientas rarr Opciones rarr Editor A continuacioacutenseleccionamos la pestantildea Formato y en el menuacute desplegable correspondiente allenguaje de programacioacuten seleccionamos Java La configuracioacuten deberiacutea quedarcomo se indica en la imagen

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java ix

Figura 03 Configuracioacuten de Netbeans

Es muy importante que los editoresIDEs que se utilicen para esribir coacutedigoen Java se configuren adecuadamente Hemos visto coacutemo configurar Geanyy Netbeans pero si el lector decide utilizar otras herramientas deberaacuteconfigurarlas igualmente En definitiva la configuracioacutenpreferencias de lasherramientas que se utilicen deben establecerse de tal forma que se cumplanestos requisitos

bull La tecla TAB debe insertar espacios no debe insertar el caraacutecter detabulacioacuten

bull La indentacioacuten debe ser de 2 caracteres (por defecto suele estar a 4)bull La condificacioacuten de caracteres debe ser UTF-8

1 iexclHola mundo - Salida de datos por pantalla

11 iexclHola mundo - Mi primer programa

El primer programa que aprende a hacer cualquier aspirante a programador es unHolamundo 1 Es seguramente el programa maacutes sencillo que se puede escribir Se trata deun programa muestra el mensaje ldquoHola mundordquo por pantalla Abre el programa GEditque como hemos comentado en la seccioacuten Instalacioacuten y configuracioacuten del entorno deprogramacioacuten Java viene instalado por defecto en Ubuntu y teclea el siguiente coacutedigo

Muestra por pantalla la frase iexclHola mundo author Luis J Saacutenchez

public class HolaMundo Clase principalpublic static void main(String[] args)

Systemoutprintln(iexclHola mundo)

Veraacutes que en principio el texto del coacutedigo no aparece en colores El coloreado desintaxis es muy uacutetil como comprobaraacutes maacutes adelante sobre todo para detectar erroresGraba el programa como HolaMundojava Al grabar con la extensioacuten java ahora elprograma GEdit siacute sabe que se trata de un programa escrito en Java y reconoce lasintaxis de este lenguaje de forma que puede colorear los distintos elementos queaparecen en el coacutedigo

1En la paacutegina httphelloworldcollectionde se muestra el programa Hola mundo escrito en maacutes de 400 lenguajes deprogramacioacuten

1

iexclHola mundo - Salida de datos por pantalla 2

Figura 11 Programa Hola mundo escrito en el editor GEdit

Fiacutejate que el nombre que le damos al fichero es exactamente igual que la clase principalseguido de la extensioacuten java Abre una ventana de terminal entra en el directoriodonde se encuentra el fichero y teclea lo siguiente

$ javac HolaMundojava

Este comando crea HolaMundoclass que es el bytecode Para ejecutar el programateclea

$ java HolaMundo

iexclEnhorabuena Acabas de realizar tu primer programa en JavaEn la siguiente captura de pantalla puedes ver la ventana de terminal y los comandosque acabamos de describir

iexclHola mundo - Salida de datos por pantalla 3

Figura 12 HolaMundoclass es el bytecode generado (1) El resultado del programa es una liacutenea de textoescrita en pantalla (2)

La instruccioacuten que hemos utilizado para mostrar una frase por pantalla es Sys-

temoutprintln() colocando la frase entre pareacutentesis Tambieacuten se puede volcar textopor pantalla mediante Systemoutprint() La uacutenica diferencia radica en que esta uacuteltimano antildeade un salto de liacutenea al final prueacutebalo en HolaMundojava y comprueacutebalo por timismo Si lo que quieres mostrar es una palabra o una frase como en este ejemploes importante que el texto esteacute entrecomillado

bull El programa propiamente dicho estaacute dentro de lo que llamamos ldquoclaseprincipalrdquo

bull El fichero debe tener el mismo nombre que la clase principal seguido porla extensioacuten java

bull Los comentarios de varias liacuteneas se colocan entre y

bull Los comentarios de liacutenea se indican mediante

bull Para mostrar informacioacuten por pantalla se utilizan Systemoutprintln() ySystemoutprint()

iexclHola mundo - Salida de datos por pantalla 4

12 Coloreado de texto

Mostrar siempre texto blanco sobre fondo negro puede resultar muy aburrido El textoque se muestra por pantalla se puede colorear para ello es necesario insertar unassecuencias de caracteres - que indican el color con el que se quiere escribir - justoantes del propio textoPrueba el siguiente programa y no te preocupes si todaviacutea no lo entiendes del todoen el proacuteximo capiacutetulo se explican los diferentes tipos de datos que se pueden utilizaren Java entre estos tipos estaacute la cadena de caracteres o String

Coloreado de texto Muestra varias palabras en el color que corresponde author Luis Joseacute Saacutenchez

public class Colores

public static void main(String[] args)

String rojo = 033[31m

String verde = 033[32m

String naranja = 033[33m

String azul = 033[34m

String morado = 033[35m

String blanco = 033[37m

Systemoutprint(naranja + mandarina + verde + hierba)

Systemoutprint(naranja + saltamontes + rojo + tomate)

Systemoutprint(blanco + saacutebanas + azul + cielo)

Systemoutprint(morado + nazareno + azul + mar)

Como puedes ver en los dos ejemplos que hemos mostrado algunas liacuteneas estaacutenligeramente desplazadas hacia la derecha es lo que se llama sangriacutea o indentacioacutenEn programacioacuten es muy importante sangrar (indentar) bien porque da una idea de queacutepartes del coacutedigo son las que contienen a otras En este uacuteltimo ejemplo tenemos unprograma que tiene unos comentarios al principio y luego la clase principal marcadapor la liacutenea public class Colores Dentro de la clase Colores estaacute el main o bloque delprograma principal que tiene sangriacutea por estar dentro de la definicioacuten de la claseColores A su vez dentro del main hay una serie de liacuteneas de coacutedigo que igualmentetienen sangriacutea

iexclHola mundo - Salida de datos por pantalla 5

En este libro tanto el coacutedigo de los ejemplos como el de las soluciones a losejercicios siguen el estaacutendar de Google para el coacutedigo fuente escrito en el lenguaje deprogramacioacuten Java2 por tanto cada vez que se aplique la sangriacutea seraacute exactamentede dos espacios

2httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

iexclHola mundo - Salida de datos por pantalla 6

13 Ejercicios

Ejercicio 1Escribe una programa que muestre tu nombre por pantalla

Ejercicio 2Modifica el programa anterior para que ademaacutes se muestre tu direccioacuten ytu nuacutemero de teleacutefono Aseguacuterate de que los datos se muestran en liacuteneasseparadas

Ejercicio 3Escribe un programa que muestre por pantalla 10 palabras en ingleacutes juntoa su correspondiente traduccioacuten al castellano Las palabras deben estardistribuidas en dos columnas y alineadas a la izquierda Pista Se puedeinsertar un tabulador mediante t

Ejercicio 4Escribe un programa que muestre tu horario de clase Puedes usar espacios otabuladores para alinear el texto

Ejercicio 5Modifica el programa anterior antildeadiendo colores Puedes mostrar cada asig-natura de un color diferente

Ejercicio 6Escribe un programa que pinte por pantalla una piraacutemide rellena a base deasteriscos La base de la piraacutemide debe estar formada por 9 asteriscos

Ejercicio 7Igual que el programa anterior pero esta vez la piraacutemide estaraacute hueca (sedebe ver uacutenicamente el contorno hecho con asteriscos)

iexclHola mundo - Salida de datos por pantalla 7

Ejercicio 8Igual que el programa anterior pero esta vez la piraacutemide debe aparecerinvertida con el veacutertice hacia abajo

Ejercicio 9Escribe un programa que pinte por pantalla alguna escena - el campo lahabitacioacuten de una casa un aula etc - o alguacuten objeto animado o inanimado- un coche un gato una taza de cafeacute etc Ten en cuenta que puedes utilizarcaracteres como + lt etc iexclEacutechale imaginacioacuten

2 Variables

21 Definicioacuten y tipos de variables

Una variable es un contenedor de informacioacuten Imagina una variable como una cajitacon una etiqueta que indica su nombre una cajita en la que se puede introducir un va-lor Las variables pueden almacenar valores enteros nuacutemeros decimales caracterescadenas de caracteres (palabras o frases) etc El contenido de las variables puedecambiar durante la ejecucioacuten del programa de ahiacute viene el nombre de ldquovariablerdquoJava es un lenguaje fuertemente tipado es decir es necesario declarar todas lasvariables que utilizaraacute el programa indicando siempre el nombre y el tipo de cadaunaEl nombre que se le da a una variable es muy importante intenta usar siemprenombres significativos que de alguna forma identifiquen el contenido Por ejemplosi usas una variable para almacenar el volumen de una figura una buena opcioacuten seriacuteallamarla volumen si tienes una variable que almacena la edad de una persona lo mejores llamarla edad y asiacute sucesivamenteUn programa se lee y se depura mucho mejor si los nombres de las variables se hanelegido de forma inteligenteiquestPodriacuteas averiguar queacute hace la siguiente liacutenea de coacutedigo

x = vIp3 Weerty - zxc

Ahora observa el mismo coacutedigo pero con otros nombres de variables

precioTotal = cantidad precio - descuento

Se entiende mucho mejor iquestverdadEscribiremos los nombres de variables en formato lowerCamelCase La primera letrase escribe en minuacutescula y a continuacioacuten si se utiliza maacutes de una palabra cada unade ellas empezariacutea con mayuacutescula Por ejemplo edadMin es un buen nombre para unavariable que almacena la edad miacutenima a la que se puede acceder a un sitio webObserva que hemos usado una mayuacutescula para diferenciar dos partes (edad y Min)Puede que en alguacuten libro tambieacuten encuentres nombres de variables con el caraacutecterde subrayado ( _ ) de tal forma que el nombre de la variable seriacutea edad_min pero comohemos comentado anteriormente en este libro nos centildeimos al estaacutendar de Google1que exige el formato lowerCamelCase

1httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

8

Variables 9

No se permiten siacutembolos como $ + - etc Puedes usar nuacutemeros en los nombresde variables pero nunca justo al principio 5x no es un nombre vaacutelido pero x5 siacute lo esNo se debe poner una letra mayuacutescula al comienzo del nombre de una variable parano confundirla con una clase (los nombres de las clases comienzan por mayuacutescula)

211 Enteros (int y long)

Las variables que van a contener nuacutemeros enteros se declaran con int Veamos unejemplo

Uso de variables enteras author Luis J Saacutenchez

public class VariablesEnteras

public static void main(String[] args)

int x Se declara la variable x como entera

x = 5 Se asigna el valor 5 a la variable xSystemoutprintln(El valor actual de mi variable es + x)

x = 7 Se asigna el valor 7 a la variable xSystemoutprintln(y ahora es + x)

Si pretendemos almacenar valores muy grandes en una variable usaremos el tipo long

en lugar de int

212 Nuacutemeros decimales (double y float)

Usamos los tipos double o float cuando queremos (o esperamos) almacenar nuacutemeroscon decimales en las variablesCintildeeacutendonos al estaacutendar de Google no daremos por vaacutelidas definiciones de variablescomo la siguiente (aunque funcionariacutea sin ninguacuten problema)

double x y

Cada variable se debe definir en una liacutenea diferente Lo siguiente siacute seriacutea correcto

Variables 10

double x

double y

A continuacioacuten tienes un ejemplo completo

Uso de variables que contienen nuacutemeros decimales author Luis J Saacutenchez

public class VariablesConDecimales

public static void main(String[] args)

double x Se declaran las variables x e ydouble y de tal forma que puedan almacenar decimales

x = 7

y = 2501

Systemoutprintln( x vale + x)

Systemoutprintln( y vale + y)

Como puedes ver tambieacuten se pueden almacenar nuacutemeros enteros en variables de tipodouble

213 Cadenas de caracteres (String)

Las cadenas de caracteres se utilizan para almacenar palabras y frases Todas lascadenas de caracteres deben ir entrecomilladas

Uso del tipo String author Luis J Saacutenchez

public class UsoDeStrings

public static void main(String[] args)

String miPalabra = cerveza

String miFrase = iquestdoacutende estaacute mi cerveza

Systemoutprintln(Una palabra que uso con frecuencia + miPalabra)

Variables 11

Systemoutprintln(Una frase que uso a veces + miFrase)

Como puedes ver en una cadena de caracteres se pueden almacenar signos depuntuacioacuten espacios y letras con tildes

Variables 12

22 Operadores artimeacuteticos

En Java se puede operar con las variables de una forma muy parecida a como se haceen matemaacuteticas Los operadores aritmeacuteticos de Java son los siguientes

OPERADOR NOMBRE EJEMPLO DESCRIPCIOacuteN+ suma 20 + x suma dos nuacutemeros- resta a - b resta dos nuacutemeros multiplicacioacuten 10 7 multiplica dos nuacutemeros divisioacuten altura 2 divide dos nuacutemeros resto (moacutedulo) 5 2 resto de la divisioacuten entera

++ incremento a++ incrementa en 1 elvalor de la variable

- - decremento a- - decrementa en 1 elvalor de la variable

A continuacioacuten tienes un programa que ilustra el uso de los operadores aritmeacuteticos

Uso de los operadores aritmeacuteticos author Luis J Saacutenchez

public class UsoDeOperadoresAritmeticos

public static void main(String[] args)

int x

x = 100

Systemoutprintln(x + + (x + 5) + + (x - 5))

Systemoutprintln((x 5) + + (x 5) + + (x 5))

23 Asignacioacuten de valores a variables

La sentencia de asignacioacuten se utiliza para dar un valor a una variable En Java (y enla mayoriacutea de lenguajes de programacioacuten) se utiliza el siacutembolo igual ( = ) para estecometido Es importante recalcar que una asignacioacuten no es una ecuacioacuten Por ejemplox = 7 + 1 es una asignacioacuten en la cual se evaluacutea la parte derecha 7 + 1 y el resultadode esa evaluacioacuten se almacena en la variable que se coloque a la izquierda del iguales decir en la x o lo que es lo mismo el nuacutemero 8 se almacena en x La sentenciax + 1 = 23 2 no es una asignacioacuten vaacutelida ya que en el lado izquierdo debemos teneruacutenicamente un nombre de variableVeamos un ejemplo con algunas operaciones y asignaciones

Variables 13

Operaciones y asignaciones author Luis J Saacutenchez

public class Asignaciones

public static void main(String[] args)

int x = 2

int y = 9

int sum = x + y

Systemoutprintln(La suma de mis variables es + sum)

int mul = x y

Systemoutprintln(La multiplicacioacuten de mis variables es + mul)

24 Conversioacuten de tipos (casting)

En ocasiones es necesario convertir una variable (o una expresioacuten en general) de untipo a otro Simplemente hay que escribir entre pareacutentesis el tipo que se quiere obtenerExperimenta con el siguiente programa y observa los diferentes resultados que seobtienen

Conversioacuten de tipos author Luis J Saacutenchez

public class ConversionDeTipos

public static void main(String[] args)

int x = 2

int y = 9

double division

division = (double)y (double)xdivision = y x Comenta esta liacutenea y

observa la diferencia

Variables 14

Systemoutprintln(El resultado de la divisioacuten es + division)

Variables 15

25 Ejercicios

Ejercicio 1Escribe un programa en el que se declaren las variables enteras x e y Asignaleslos valores 144 y 999 respectivamente A continuacioacuten muestra por pantallael valor de cada variable la suma la resta la divisioacuten y la multiplicacioacuten

Ejercicio 2Crea la variable nombre y asiacutegnale tu nombre completo Muestra su valor porpantalla de tal forma que el resultado del programa sea el mismo que en elejercicio 1 del capiacutetulo 1

Ejercicio 3Crea las variables nombre direccion y telefono y asiacutegnale los valores corres-pondientes Muestra los valores de esas variables por pantalla de tal formaque el resultado del programa sea el mismo que en el ejercicio 2

Ejercicio 4Realiza un conversor de euros a pesetas La cantidad en euros que se quiereconvertir deberaacute estar almacenada en una variable

Ejercicio 5Realiza un conversor de pesetas a euros La cantidad en pesetas que se quiereconvertir deberaacute estar almacenada en una variable

Ejercicio 6Escribe un programa que calcule el total de una factura a partir de la baseimponible (precio sin IVA) La base imponible estaraacute almacenada en unavariable

3 Lectura de datos desde tecladoHemos visto en los capiacutetulos anteriores coacutemo mostrar informacioacuten por pantalla ycoacutemo usar variables Veremos ahora algo muy importante que te permitiraacute realizarprogramas algo maacutes funcionales que tengan una utilidad real aprenderaacutes a leer lainformacioacuten que introduce un usuario mediante el tecladoEl funcionamiento de casi todos los programas se podriacutea resumir en los siguientespuntos

1 Entrada de datos desde teclado (o desde cualquier otro dispositivo de entrada)2 Procesamiento de los datos de entrada para producir un resultado3 Visualizacioacuten de los resultados por pantalla

De momento hemos visto coacutemo realizar los puntos 2 y 3 Vamos a ver a continuacioacutencoacutemo se recoge la informacioacuten desde el teclado

31 Lectura de texto

Para recoger datos por teclado usamos Systemconsole()readLine() Cuando llegamos aesta sentencia el programa se detiene y espera que el usuario introduzca informacioacutenmediante el teclado La introduccioacuten de datos termina con la pulsacioacuten de la teclaINTRO Una vez que el usuario presiona INTRO todo lo que se ha tecleado se almacenaen una variable en el siguiente ejemplo esa variable es nombre

Lectura de datos desde teclado author Luis J Sanchez

public class DimeTuNombre

public static void main(String[] args)

String nombre

Systemoutprint(Por favor dime coacutemo te llamas )

nombre = Systemconsole()readLine()

Systemoutprintln(Hola + nombre + iexclencantado de conocerte)

16

Lectura de datos desde teclado 17

Mediante Systemconsole()readLine() se recoge una liacutenea de texto introducidapor teclado

Cuando se piden datos por teclado es importante que el programa especifiqueclaramente cuaacutel es exactamente la informacioacuten que requiere por parte del usuarioDate cuenta que este programa muestra el mensaje ldquoPor favor dime coacutemo te llamasrdquoImagina que se omite este mensaje en la pantalla apareceriacutea uacutenicamente un cursorparpadeando y el usuario no sabriacutea queacute tiene que hacer o queacute dato introducirTambieacuten es importante resentildear que los datos introducidos por teclado se recogen comouna cadena de caracteres (un String)

32 Lectura de nuacutemeros

Si en lugar de texto necesitamos datos numeacutericos deberemos convertir la cadenaintroducida en un nuacutemero con el meacutetodo adecuado Como se muestra en el ejemploIntegerparseInt() convierte el texto introducido por teclado en un dato numeacutericoconcretamente en un nuacutemero entero

Lectura de datos desde teclado author Luis J Saacutenchez

public class LeeNumeros

public static void main(String[] args)

String linea

Systemoutprint(Por favor introduce un nuacutemero )

linea = Systemconsole()readLine()

int primerNumero

primerNumero = IntegerparseInt( linea )

Systemoutprint(introduce otro por favor )

linea = Systemconsole()readLine()

int segundoNumero

segundoNumero = IntegerparseInt( linea )

int total

total = (2 primerNumero) + segundoNumero

Systemoutprint(El primer nuacutemero introducido es + primerNumero)

Lectura de datos desde teclado 18

Systemoutprintln( y el segundo es + segundoNumero)

Systemoutprint(El doble del primer nuacutemero maacutes el segundo es )

Systemoutprint(total)

Este uacuteltimo programa se podriacutea acortar un poco Por ejemplo estas dos liacuteneas

int total

total = (2 primerNumero) + segundoNumero

se podriacutean quedar en una sola liacutenea

int total = (2 primerNumero) + segundoNumero

De igual modo estas tres liacuteneas

linea = Systemconsole()readLine()

int primerNumero

primerNumero = IntegerparseInt( linea )

tambieacuten se podriacutean reducir a una sola tal que asiacute

int primerNumero = IntegerparseInt( Systemconsole()readLine() )

Es muy importante que el coacutedigo de nuestros programas sea limpio y legible A vecesabreviando demasiado el coacutedigo se hace maacutes difiacutecil de leer es preferible tener unasliacuteneas de maacutes y que el coacutedigo se entienda bien a tener un coacutedigo muy compacto peromenos legible

33 La clase Scanner

El meacutetodo Systemconsole()readLine() funciona bien en modo consola (en una ventana determinal) pero puede provocar problemas cuando se trabaja con IDEs como EclipseNetbeans JavaEdit etc Para evitar estos problemas puedes usar la clase Scanner

cuando necesites recoger datos desde teclado La clase Scanner funciona tanto enentornos integrados como en una ventana de terminal

Lectura de datos desde teclado 19

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScanner01

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tu nombre )

String nombre = snextLine()

Systemoutprint(Introduce tu edad )

int edad = IntegerparseInt(snextLine())

Systemoutprintln(Tu nombre es + nombre + y tu edad es + edad)

Fiacutejate que en el programa anterior la sentencia

snextLine()

seriacutea el equivalente a

Systemconsole()readLine()`

Mediante el uso de la clase Scanner es posible leer varios datos en una misma liacutenea Enel programa anterior se pediacutea un nombre y una edad en total dos datos que habiacutea queintroducir en liacuteneas separadas Observa coacutemo en el siguiente ejemplo se piden esosdos datos en una sola liacutenea y separados por un espacio

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScanner02

Lectura de datos desde teclado 20

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tu nombre y tu edad separados por un espacio )

String nombre = snext()

int edad = snextInt()

Systemoutprintln(Tu nombre es + nombre + y tu edad es + edad)

Fiacutejate coacutemo se ha utilizado snext() para leer una cadena de caracteres y snextInt()

para leer un nuacutemero entero todo ello en la misma liacuteneaEl siguiente programa de ejemplo calcula la media de tres nuacutemeros decimales Paraleer cada uno de los nuacutemeros en la misma liacutenea se utiliza snextDouble

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScannerMedia

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tres nuacutemeros (pueden contener decimales) separados por esp

acios )

double x1 = snextDouble()

double x2 = snextDouble()

double x3 = snextDouble()

double media = (x1 + x2 + x3) 3

Systemoutprintln(La media de esos tres nuacutemeros es + media)

Lectura de datos desde teclado 21

Recuerda que iexcla programar se aprende programando Es muy importanteque pruebes los ejemplos - si los modificas y experimentas todaviacutea mejor - yque realices los ejercicios Para aprender a programar no basta con leer el libroy entenderlo es una condicioacuten necesaria pero no suficiente Igual que paraser piloto hacen falta muchas horas de vuelo para ser programador hacenfalta muchas horas picando coacutedigo probando corrigiendo erroreshellip iexclAacutenimoiexclEl esfuerzo merece la pena

Lectura de datos desde teclado 22

34 Ejercicios

Ejercicio 1Realiza un programa que pida dos nuacutemeros y que luego muestre el resultadode su multiplicacioacuten

Ejercicio 2Realiza un conversor de euros a pesetas La cantidad de euros que se quiereconvertir debe ser introducida por teclado

Ejercicio 3Realiza un conversor de pesetas a euros La cantidad de pesetas que se quiereconvertir debe ser introducida por teclado

Ejercicio 4Escribe un programa que sume reste multiplique y divida dos nuacutemerosintroducidos por teclado

Ejercicio 5Escribe un programa que calcule el aacuterea de un rectaacutengulo

Ejercicio 6Escribe un programa que calcule el aacuterea de un triaacutengulo

Ejercicio 7Escribe un programa que calcule el total de una factura a partir de la baseimponible

Ejercicio 8Escribe un programa que calcule el salario semanal de un empleado en basea las horas trabajadas a razoacuten de 12 euros la hora

Lectura de datos desde teclado 23

Ejercicio 9Escribe un programa que calcule el volumen de un cono seguacuten la foacutermula V =13πr

2h

Ejercicio 10Realiza un conversor de Mb a Kb

Ejercicio 11Realiza un conversor de Kb a Mb

Ejercicio 12Escribe un programa que calcule el precio final de un producto seguacuten subase imponible (precio antes de impuestos) el tipo de IVA aplicado (generalreducido o superreducido) y el coacutedigo promocional Los tipos de IVA generalreducido y superreducido son del 21 10 y 4 respectivamente Los coacutedi-gos promocionales pueden ser nopro mitad meno5 o 5porc que significanrespectivamente que no se aplica promocioacuten el precio se reduce a la mitadse descuentan 5 euros o se descuenta el 5 El ejercicio se da por bueno si semuestran los valores correctos aunque los nuacutemeros no esteacuten tabuladosEjemplo

Introduzca la base imponible 25

Introduzca el tipo de IVA (general reducido o superreducido) reducido

Introduzca el coacutedigo promocional (nopro mitad meno5 o 5porc) mitad

Base imponible 2500

IVA (10) 250

Precio con IVA 2750

Coacuted promo (mitad) -1375

TOTAL 1375

Lectura de datos desde teclado 24

Ejercicio 13Realiza un programa que calcule la nota que hace falta sacar en el segundoexamen de la asignatura Programacioacuten para obtener la media deseada Hayque tener en cuenta que la nota del primer examen cuenta el 40 y la delsegundo examen un 60Ejemplo 1

Introduce la nota del primer examen 7

iquestQueacute nota quieres sacar en el trimestre 85

Para tener un 85 en el trimestre necesitas sacar un 95 en el segundo examen

Ejemplo 2

Introduce la nota del primer examen 8

iquestQueacute nota quieres sacar en el trimestre 7

Para tener un 7 en el trimestre necesitas sacar un 633 en el segundo examen

4 Sentencia condicional (if y switch)Una sentencia condicional permite al programa bifurcar el flujo de ejecucioacuten deinstrucciones dependiendo del valor de una expresioacuten

41 Sentencia if

La sentencia if permite la ejecucioacuten de una serie de instrucciones en funcioacuten delresultado de una expresioacuten loacutegica El resultado de evaluar una expresioacuten loacutegica essiempre verdadero (true) o falso (false) Es muy simple en lenguaje natural seriacutea algocomo rdquosi esta condicioacuten es verdadera entonces haz esto sino haz esto otrordquoEl formato de la sentencia if es el siguiente

if (condicioacuten)

instrucciones a ejecutar si la condicioacuten es verdadera

else

instrucciones a ejecutar si la condicioacuten es falsa

A continuacioacuten se muestra un ejempo del uso de la sentencia if

Sentencia if author Luis J Saacutenchez

public class SentenciaIf01

public static void main(String[] args)

Systemoutprint(iquestCuaacutel es la capital de Kiribati )

String respuesta = Systemconsole()readLine()

if (respuestaequals(Tarawa))

Systemoutprintln(iexclLa respuesta es correcta)

else

Systemoutprintln(Lo siento la respuesta es incorrecta)

25

Sentencia condicional (if y switch) 26

En el programa se le pregunta al usuario cuaacutel es la capital de Kiriwati La respuestaintroducida por el usuario se almacena en la variable respuesta A continuacioacuten vienela sentencia condicional if

if (respuestaequals(Tarawa))

Llegado a este punto el programa evaluacutea la expresioacuten respuestaequals(Tarawa)Observa que para comparar dos cadenas de caracteres se utiliza equals() Ima-ginemos que el usuario ha introducido por teclado Madrid entonces la expresioacutenMadridequals(Tarawa) dariacutea como resultado false (falso)Si la expresioacuten hubiera dado como resultado true (verdadero) se ejecutaria la liacutenea

Systemoutprintln(iexclLa respuesta es correcta)

pero no es el caso el resultado de la expresioacuten ha sido false (falso) todo el mundosabe que la capital de Kiriwati no es Madrid por tanto se ejecutariacutea la liacutenea

Systemoutprintln(Lo siento la respuesta es incorrecta)

Vamos a ver otro ejemplo esta vez con nuacutemeros El usuario introduciraacute un nuacutemero porteclado y el programa diraacute si se trata de un nuacutemero positivo o negativo

Sentencia if author Luis J Saacutenchez

public class SentenciaIf02

public static void main(String[] args)

Systemoutprint(Por favor introduce un nuacutemero entero )

String linea = Systemconsole()readLine()

int x = IntegerparseInt( linea )

if (x lt 0)

Systemoutprintln(El nuacutemero introducido es negativo)

else

Systemoutprintln(El nuacutemero introducido es positivo)

El siguiente bloque de coacutedigo

Sentencia condicional (if y switch) 27

if (x lt 0)

Systemoutprintln(El nuacutemero introducido es negativo)

elseSystemoutprintln(El nuacutemero introducido es positivo)

compilariacutea y funcionariacutea sin problemas - fiacutejate que hemos quitado las llaves - ya queantes y despueacutes del else hay una sola sentencia y en estos casos no es obligatorioponer llaves Sin embargo nosotros siempre usaremos llaves es una exigencia delestaacutendar de Google al que nos centildeimos en este manual

Llaves egipcias (egyptian brackets)Fiacutejate en la manera de colocar las llaves dentro del coacutedigo de un programaen Java La llave de apertura de bloque se coloca justo al final de la liacutenea y lallave de cierre va justo al principio de la liacutenea Se llaman llaves egipcias1 porla similitud entre las llaves y las manos de los egipcios que aparecen en lospapiros

1httpblogcodinghorrorcomnew-programming-jargon

Sentencia condicional (if y switch) 28

42 Operadores de comparacioacuten

En el ejemplo anterior usamos el operador lt en la comparacioacuten if (x lt 0) para saber sila variable x es menor que cero Hay maacutes operadores de comparacioacuten en la siguientetabla se muestran todos

OPERADOR NOMBRE EJEMPLO DESCRIPCIOacuteN== igual a == b a es igual a b= distinto a = b a es distinto de blt menor que a lt b a es menor que bgt mayor que a gt b a es mayor que b

lt= mayor o igual que a gt = b a es mayor o igual que b

El siguiente ejemplo muestra el uso de uno de estos operadores concretamente de gt=

(mayor o igual) El usuario introduce una nota si esta nota es mayor o igual a 5 sele mostraraacute un mensaje diciendo que ha aprobado y en caso de que no se cumpla lacondicioacuten se mostraraacute un mensaje diciendo que estaacute suspenso

Sentencia if author Luis J Saacutenchez

public class SentenciaIf03

public static void main(String[] args)

Systemoutprint(iquestQueacute nota has sacado en el uacuteltimo examen )

String line = Systemconsole()readLine()

double nota = DoubleparseDouble( line )

if (nota gt= 5)

Systemoutprintln(iexclEnhorabuena iexclhas aprobado)

else

Systemoutprintln(Lo siento has suspendido)

Sentencia condicional (if y switch) 29

43 Operadores loacutegicos

Los operadores de comparacioacuten se pueden combinar con los operadores loacutegicos Porejemplo si queremos saber si la variable a es mayor que b y ademaacutes es menor que cescribiriacuteamos if ((a gt b) ampamp (a lt c)) En la siguiente tabla se muestran los operadoresloacutegicos de Java

OPERADOR NOMBRE EJEMPLO DEVUELVEVERDADEROCUANDOhellip

ampamp y (7 gt 2) ampamp (2 lt 4) las dos condicionesson verdaderas

|| o (7 gt 2) || (2 lt 4) al menos una de lascondiciones es

verdadera no (7 gt 2) la condicioacuten es falsa

Vamos a ver coacutemo funcionan los operadores loacutegicos con un ejemplo Mediante if ((n lt

1) || (n gt 100)) se pueden detectar los nuacutemeros que no estaacuten en el rango de 1 a 100literalmente seriacutea ldquosi n es menor que 1 o n es mayor que 100rdquo

Operadores loacutegicos author Luis J Saacutenchez

public class OperadoresLogicos01

public static void main(String[] args)

Systemoutprintln(Adivina el nuacutemero que estoy pensando)

Systemoutprint(Introduce un nuacutemero entre el 1 y el 100 )

String linea = Systemconsole()readLine()

int n = IntegerparseInt( linea )

if ((n lt 1) || (n gt 100))

Systemoutprintln(El nuacutemero introducido debe estar en el intervalo 1 - 100)

Systemoutprint(Tienes otra oportunidad introduce un nuacutemero )

linea = Systemconsole()readLine()

n = IntegerparseInt( linea )

if (n == 24)

Systemoutprintln(iexclEnhorabuena iexclhas acertado)

else

Systemoutprintln(Lo siento ese no es el nuacutemero que estoy pensando)

Sentencia condicional (if y switch) 30

En el siguiente programa puedes ver el uso de operadores loacutegicos combinado conoperadores relacionales (operadores de comparacioacuten) Intenta adivinar cuaacutel seraacute elresultado mirando el coacutedigo

Operadores loacutegicos y relacionales author Luis J Saacutenchez

public class OperadoresLogicos02

public static void main(String[] args)

boolean a = trueboolean b = falseSystemoutprintln(a = + a)

Systemoutprintln(b = + b)

Systemoutprintln(a ampamp b = + (a ampamp b))

Systemoutprintln(a || b = + (a || b))

Systemoutprintln(a = + a)

Systemoutprintln(a || (6 gt 10) = + (a || (6 gt 10)))

Systemoutprintln(((4 lt= 4) || false) ampamp (a) = + (((4 lt= 4) || false) ampamp (a)))

Sentencia condicional (if y switch) 31

44 Sentencia switch (seleccioacuten muacuteltiple)

A veces es necesario comparar el valor de una variable con una serie de valoresconcretos La seleccioacuten muacuteltiple es muy parecida (aunque no es exactamente igual) auna secuencia de varias sentencias ifEl formato de switch es el que se muestra a continuacioacuten En legunaje natural seriacutea algoasiacute como ldquoSi variable vale valor1 entonces entra por case valor1 si variable vale valor2

entonces entra por case valor2hellip si variable no vale ninguno de los valores que hay enlos distintos case entonces entra por default

switch(variable)

case valor1

sentencias

break

case valor2

sentencias

break

default

sentencias

A continuacioacuten tienes un ejemplo completo en Java Se pide al usuario un nuacutemero demes y el programa da el nombre del mes que corresponde a ese nuacutemero

Sentencia muacuteltiple (switch) author Luis Joseacute Saacutenchez

public class SentenciaSwitch

public static void main(String[] args)

Systemoutprint(Por favor introduzca un numero de mes )

int mes = IntegerparseInt(Systemconsole()readLine())

String nombreDelMes

switch (mes)

Sentencia condicional (if y switch) 32

case 1

nombreDelMes = enero

breakcase 2

nombreDelMes = febrero

breakcase 3

nombreDelMes = marzo

breakcase 4

nombreDelMes = abril

breakcase 5

nombreDelMes = mayo

breakcase 6

nombreDelMes = junio

breakcase 7

nombreDelMes = julio

breakcase 8

nombreDelMes = agosto

breakcase 9

nombreDelMes = septiembre

breakcase 10

nombreDelMes = octubre

breakcase 11

nombreDelMes = noviembre

breakcase 12

nombreDelMes = diciembre

breakdefault

nombreDelMes = no existe ese mes

Systemoutprintln(Mes + mes + + nombreDelMes)

Observa que es necesario introducir un break despueacutes de la asignacioacuten de la variable

Sentencia condicional (if y switch) 33

nombreDelMes En caso de no encontrarse el break el programa continuacutea la ejecucioacuten enla liacutenea siguienteEl bloque que corresponde al default se ejecuta cuando la variable no coincide conninguno de los valores de los case Escribiremos siempre el default al final de lasentencia switch aunque no sea necesarioLa sentencia switch se utiliza con frecuencia para crear menuacutes

Ejemplo de un menuacute con switch author Luis Joseacute Saacutenchez

public class MenuConSwitch

public static void main(String[] args)

Systemoutprintln( CAacuteLCULO DE AacuteREAS)

Systemoutprintln( ----------------)

Systemoutprintln( 1 Cuadrado)

Systemoutprintln( 2 Rectaacutengulo)

Systemoutprintln( 3 Triaacutengulo)

Systemoutprint(n Elija una opcioacuten (1-3) )

int opcion = IntegerparseInt(Systemconsole()readLine())

double lado

double base

double altura

switch (opcion)

case 1

Systemoutprint(nIntroduzca el lado del cuadrado en cm )

lado = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(nEl aacuterea del cuadrado es + (lado lado) + cm2)

break

case 2

Systemoutprint(nIntroduzca la base del rectaacutengulo en cm )

base = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura del rectaacutengulo en cm )

altura = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El aacuterea del rectaacutengulo es + (base altura) + cm2)

break

Sentencia condicional (if y switch) 34

case 3

Systemoutprint(nIntroduzca la base del triaacutengulo en cm )

base = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura del triaacutengulo en cm )

altura = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El aacuterea del triaacutengulo es + ((base altura) 2) + cm2)

break

default

Systemoutprint(nLo siento la opcioacuten elegida no es correcta)

Sentencia condicional (if y switch) 35

45 Ejercicios

Ejercicio 1Escribe un programa que pida por teclado un diacutea de la semana y que diga queacuteasignatura toca a primera hora ese diacutea

Ejercicio 2Realiza un programa que pida una hora por teclado y que muestre luegobuenos diacuteas buenas tardes o buenas noches seguacuten la hora Se utilizaraacuten lostramos de 6 a 12 de 13 a 20 y de 21 a 5 respectivamente Soacutelo se tienen encuenta las horas los minutos no se deben introducir por teclado

Ejercicio 3Escribe un programa en que dado un nuacutemero del 1 a 7 escriba el correspon-diente nombre del diacutea de la semana

Ejercicio 4Vamos a ampliar uno de los ejercicios de la relacioacuten anterior para considerarlas horas extras Escribe un programa que calcule el salario semanal de untrabajador teniendo en cuenta que las horas ordinarias (40 primeras horas detrabajo) se pagan a 12 euros la hora A partir de la hora 41 se pagan a 16euros la hora

Ejercicio 5Realiza un programa que resuelva una ecuacioacuten de primer grado (del tipo ax+b = 0)

Ejercicio 6Realiza un programa que calcule el tiempo que tardaraacute en caer un objeto desdeuna altura h Aplica la foacutermula t =

radic2hg siendo g = 981ms2

Ejercicio 7Realiza un programa que calcule la media de tres notas

Sentencia condicional (if y switch) 36

Ejercicio 8Ampliacutea el programa anterior para que diga la nota del boletiacuten (insuficientesuficiente bien notable o sobresaliente)

Ejercicio 9Realiza un programa que resuelva una ecuacioacuten de segundo grado (del tipoax2 + bx+ c = 0)

Ejercicio 10Escribe un programa que nos diga el horoacutescopo a partir del diacutea y el mes denacimiento

Ejercicio 11Escribe un programa que dada una hora determinada (horas y minutos)calcule los segundos que faltan para llegar a la medianoche

Ejercicio 12Realiza un minicuestionario con 10 preguntas tipo test sobre las asignaturasque se imparten en el curso Cada pregunta acertada sumaraacute un punto Elprograma mostraraacute al final la calificacioacuten obtenida Paacutesale el minicuestionarioa tus compantildeeros y piacutedeles que lo hagan para ver queacute tal andan de conoci-mientos en las diferentes asignaturas del curso

Ejercicio 13Escribe un programa que ordene tres nuacutemeros enteros introducidos porteclado

Ejercicio 14Realiza un programa que diga si un nuacutemero introducido por teclado es par yodivisible entre 5

Ejercicio 15Escribe un programa que pinte una piraacutemide rellena con un caraacutecter introdu-cido por teclado que podraacute ser una letra un nuacutemero o un siacutembolo como +- $ amp etc El programa debe permitir al usuario mediante un menuacute elegir siel veacutertice de la piraacutemide estaacute apuntando hacia arriba hacia abajo hacia laizquierda o hacia la derecha

Sentencia condicional (if y switch) 37

Ejercicio 16Realiza un programa que nos diga si hay probabilidad de que nuestra parejanos estaacute siendo infiel El programa iraacute haciendo preguntas que el usuariocontestaraacute con verdadero o falso Cada pregunta contestada como verdaderosumaraacute 3 puntos Las preguntas contestadas con falso no suman puntos Utili-za el fichero test_infidelidadtxt para obtener las preguntas y las conclusionesdel programa

Ejercicio 17Escribe un programa que diga cuaacutel es la uacuteltima cifra de un nuacutemero enterointroducido por teclado

Ejercicio 18Escribe un programa que diga cuaacutel es la primera cifra de un nuacutemero enterointroducido por teclado Se permiten nuacutemeros de hasta 5 cifras

Ejercicio 19Realiza un programa que nos diga cuaacutentos diacutegitos tiene un nuacutemero entero quepuede ser positivo o negativo Se permiten nuacutemeros de hasta 5 diacutegitos

Ejercicio 20Realiza un programa que diga si un nuacutemero entero positivo introducido porteclado es capicuacutea Se permiten nuacutemeros de hasta 5 cifras

Sentencia condicional (if y switch) 38

Ejercicio 21Calcula la nota de un trimestre de la asignatura Programacioacuten El programapediraacute las dos notas que ha sacado el alumno en los dos primeros controlesSi la media de los dos controles da un nuacutemero mayor o igual a 5 el alumnoestaacute aprobado y se mostraraacute la media En caso de que la media sea un nuacutemeromenor que 5 el alumno habraacute tenido que hacer el examen de recuperacioacutenque se califica como apto o no apto por tanto se debe preguntar al usuarioiquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) Si elresultado de la recuperacioacuten es apto la nota seraacute un 5 en caso contrario semantiene la nota media anteriorEjemplo 1

Nota del primer control 7

Nota del segundo control 10

Tu nota de Programacioacuten es 85

Ejemplo 2

Nota del primer control 6

Nota del segundo control 3

iquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) apto

Tu nota de Programacioacuten es 5

Ejemplo 3

Nota del primer control 6

Nota del segundo control 3

iquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) no apto

Tu nota de Programacioacuten es 45

Ejercicio 22Realiza un programa que dado un diacutea de la semana (de lunes a viernes) y unahora (horas y minutos) calcule cuaacutentos minutos faltan para el fin de semanaSe consideraraacute que el fin de semana comienza el viernes a las 1500h Se dapor hecho que el usuario introduciraacute un diacutea y hora correctos anterior al viernesa las 1500h

5 BuclesLos bucles se utilizan para repetir un conjunto de sentencias Por ejemplo imagina quees necesario introducir la notas de 40 alumnos con el fin de calcular la media la notamaacutexima y la nota miacutenima Podriacuteamos escribir 40 veces la intruccioacuten que pide un datopor teclado Systemconsole()readLine() y convertir cada uno de esos datos a un nuacutemerocon decimales con 40 instrucciones DoubleparseDouble() no parece algo muy eficienteEs mucho maacutes praacutectico meter dentro de un bucle aquellas sentencias que queremosque se repitanNormalmente existe una condicioacuten de salida que hace que el flujo del programaabandone el bucle y continuacutee justo en la siguiente sentencia Si no existe condicioacuten desalida o si esta condicioacuten no se cumple nunca se produciriacutea lo que se llama un bucleinfinito y el programa no terminariacutea nunca

51 Bucle for

Se suele utilizar cuando se conoce previamente el nuacutemero exacto de iteraciones(repeticiones) que se van a realizar La sintaxis es la siguiente

for (expresion1 expresion2 expresion3)

sentencias

Justo al principio se ejecuta expresion1 normalmente se usa para inicializar una variableEl bucle se repite mientras se cumple expresion2 y en cada iteraccioacuten del bucle seejecuta expresion3 que suele ser el incremento o decremento de una variable Conun ejemplo se veraacute mucho maacutes claro

Bucle for author Luis Joseacute Saacutenchez

public class EjemploFor

public static void main(String[] args)

for (int i = 1 i lt 11 i++)

Systemoutprintln(i)

39

Bucles 40

En este ejemplo int i = 1 se ejecuta solo una vez antes que cualquier otra cosa comoves esta expresioacuten se utiliza para inicializar la variable i a 1 Mientra se cumpla lacondicioacuten i lt 11 el contenido del bucle o sea Systemoutprintln(i) se va a ejecutarEn cada iteracioacuten del bucle i++ hace que la variable i se incremente en 1 El resultadodel ejemplo es la impresioacuten en pantalla de los nuacutemeros del 1 al 10Intenta seguir mentalmente el flujo del programa Experimenta inicializando la variablei con otros valores cambia la condicioacuten con gt o lt= y observa lo que sucede Pruebatambieacuten a cambiar el incremento de la variable i por ejemplo con i = i + 2

52 Bucle while

El bucle while se utiliza para repetir un conjunto de sentencias siempre que se cumplauna determinada condicioacuten Es importante resentildear que la condicioacuten se comprueba alcomienzo del bucle por lo que se podriacutea dar el caso de que dicho bucle no se ejecutasenunca La sintaxis es la siguiente

while (expresion)

sentencias

Las sentencias se ejecutan una y otra vez mientras expresion sea verdadera El siguienteejemplo produce la misma salida que el ejemplo anterior muestra coacutemo cambian losvalores de i del 1 al 10

Bucle while author Luis Joseacute Saacutenchez

public class EjemploWhile

public static void main(String[] args)

int i = 1

while (i lt 11)

Systemoutprintln(i)

Bucles 41

i++

En el siguiente ejemplo se cuentan y se suman los nuacutemeros que se van introduciendopor teclado Para indicarle al programa que debe dejar de pedir nuacutemeros el usuariodebe introducir un nuacutemero negativo esa seraacute la condicioacuten de salida del bucle Observaque el bucle se repite mientras el nuacutemero introducido sea mayor o igual que cero

Bucle while que termina cuando se introduce por teclado un nuacutemero negativo author Luis Joseacute Saacutenchez

public class CuentaPositivos

public static void main(String[] args)

Systemoutprintln(Por favor vaya introduciendo nuacutemeros y pulsando INTRO)

Systemoutprintln(Para terminar introduzca un nuacutemero negativo)

int numeroIntroducido = 0

int cuentaNumeros = 0

int suma = 0

while (numeroIntroducido gt= 0)

numeroIntroducido = IntegerparseInt(Systemconsole()readLine())

cuentaNumeros++ Incrementa en uno la variablesuma += numeroIntroducido Equivale a suma = suma + NumeroIntroducido

Systemoutprintln(Has introducido + (cuentaNumeros - 1) + nuacutemeros positivos)

Systemoutprintln(La suma total de ellos es + (suma - numeroIntroducido))

53 Bucle do-while

El bucle do-while funciona de la misma manera que el bucle while con la salvedad deque expresion se evaluacutea al final de la iteraccioacuten Las sentencias que encierran el bucledo-while por tanto se ejecutan como miacutenimo una vez La sintaxis es la siguiente

Bucles 42

do

sentencias

while (expresion)

El siguiente ejemplo es el equivalente do-while a los dos ejemplos anteriores quecuentan del 1 al 10

Bucle do-while author Luis Joseacute Saacutenchez

public class EjemploDoWhile

public static void main(String[] args)

int i = 1

do

Systemoutprintln(i)

i++

while (i lt 11)

Veamos otro ejemplo En este caso se van a ir leyendo nuacutemeros de teclado mientrasel nuacutemero introducido sea par el programa pararaacute por tanto cuando se introduzcaun nuacutemero impar

Bucle do-while que termina cuando se introduce por teclado un nuacutemero impar author Luis Joseacute Saacutenchez

public class TerminaCuandoEsImpar

public static void main(String[] args)

int numero

Bucles 43

do

Systemoutprint(Dime un nuacutemero )

numero = IntegerparseInt(Systemconsole()readLine())

if (numero 2 == 0) comprueba si el nuacutemero introducido es parSystemoutprintln(Queacute bonito es el + numero)

else

Systemoutprintln(No me gustan los nuacutemeros impares adioacutes)

while (numero 2 == 0)

Te invito a que realices una modificacioacuten sobre este uacuteltimo ejemplo Despueacutes de pedirun nuacutemero haz que el programa diga iquestQuiere continuar (sn) Si el usuario introduceuna s o una S el programa deberaacute continuar pidiendo nuacutemerosCualquier bucle que un programador quiera realizar en Java lo puede implementar confor while o do-while por tanto con una sola de estas tres opciones tendriacutea suficienteNo obstante seguacuten el programa en cuestioacuten una u otra posibilidad se adapta mejorque las otras y resulta maacutes elegante Con la experiencia te iraacutes dando cuenta cuaacutendoes mejor utilizar cada una

Bucles 44

54 Ejercicios

Ejercicio 1Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle for

Ejercicio 2Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle while

Ejercicio 3Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle do-while

Ejercicio 4Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 hacia atraacutesutilizando un bucle for

Ejercicio 5Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 hacia atraacutesutilizando un bucle while

Ejercicio 6Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 utilizando un bucledo-while

Ejercicio 7Realiza el control de acceso a una caja fuerte La combinacioacuten seraacute unnuacutemero de 4 cifras El programa nos pediraacute la combinacioacuten para abrirla Si noacertamos se nos mostraraacute el mensaje ldquoLo siento esa no es la combinacioacutenrdquoy si acertamos se nos diraacute ldquoLa caja fuerte se ha abierto satisfactoriamenterdquoTendremos cuatro oportunidades para abrir la caja fuerte

Ejercicio 8Muestra la tabla de multiplicar de un nuacutemero introducido por teclado

Bucles 45

Ejercicio 9Realiza un programa que nos diga cuaacutentos diacutegitos tiene un nuacutemero introducidopor teclado

Ejercicio 10Escribe un programa que calcule la media de un conjunto de nuacutemeros positivosintroducidos por teclado A priori el programa no sabe cuaacutentos nuacutemeros seintroduciraacuten El usuario indicaraacute que ha terminado de introducir los datoscuando meta un nuacutemero negativo

Ejercicio 11Escribe un programa que muestre en tres columnas el cuadrado y el cubo delos 5 primeros nuacutemeros enteros a partir de uno que se introduce por teclado

Ejercicio 12Escribe un programa que muestre los n primeros teacuterminos de la serie deFibonacci El primer teacutermino de la serie de Fibonacci es 0 el segundo es 1y el resto se calcula sumando los dos anteriores por lo que tendriacuteamos quelos teacuterminos son 0 1 1 2 3 5 8 13 21 34 55 89 144hellip El nuacutemero n sedebe introducir por teclado

Ejercicio 13Escribe un programa que lea una lista de diez nuacutemeros y determine cuaacutentosson positivos y cuaacutentos son negativos

Ejercicio 14Escribe un programa que pida una base y un exponente (entero positivo) yque calcule la potencia

Ejercicio 15Escribe un programa que dados dos nuacutemeros uno real (base) y un enteropositivo (exponente) saque por pantalla todas las potencias con base elnumero dado y exponentes entre uno y el exponente introducido No se debenutilizar funciones de exponenciacioacuten Por ejemplo si introducimos el 2 y el 5se deberaacuten mostrar 21 22 23 24 y 25

Bucles 46

Ejercicio 16Escribe un programa que diga si un nuacutemero introducido por teclado es o noprimo Un nuacutemero primo es aquel que soacutelo es divisible entre eacutel mismo y launidad

Ejercicio 17Realiza un programa que sume los 100 nuacutemeros siguientes a un nuacutemero enteroy positivo introducido por teclado Se debe comprobar que el dato introducidoes correcto (que es un nuacutemero positivo)

Ejercicio 18Escribe un programa que obtenga los nuacutemeros enteros comprendidos entredos nuacutemeros introducidos por teclado y validados como distintos el programadebe empezar por el menor de los enteros introducidos e ir incrementando de7 en 7

Ejercicio 19Realiza un programa que pinte una piraacutemide por pantalla La altura se debepedir por teclado El caraacutecter con el que se pinta la piraacutemide tambieacuten se debepedir por teclado

Ejercicio 20Igual que el ejercicio anterior pero esta vez se debe pintar una piraacutemide hueca

Ejercicio 21Realiza un programa que vaya pidiendo nuacutemeros hasta que se introduzca unnumero negativo y nos diga cuantos nuacutemeros se han introducido la media delos impares y el mayor de los pares El nuacutemero negativo soacutelo se utiliza paraindicar el final de la introduccioacuten de datos pero no se incluye en el coacutemputo

Ejercicio 22Muestra por pantalla todos los nuacutemeros primos entre 2 y 100 ambos incluidos

Bucles 47

Ejercicio 23Escribe un programa que permita ir introduciendo una serie indeterminadade nuacutemeros mientras su suma no supere el valor 10000 Cuando esto uacuteltimoocurra se debe mostrar el total acumulado el contador de los nuacutemerosintroducidos y la media

Ejercicio 24Escribe un programa que lea un nuacutemero n e imprima una piraacutemide de nuacutemeroscon n filas como en la siguiente figura

1

121

12321

1234321

Ejercicio 25Realiza un programa que pida un nuacutemero por teclado y que luego muestre esenuacutemero al reveacutes

Ejercicio 26Realiza un programa que pida primero un nuacutemero y a continuacioacuten un diacutegitoEl programa nos debe dar la posicioacuten (o posiciones) contando de izquierda aderecha que ocupa ese diacutegito en el nuacutemero introducido

Ejercicio 27Escribe un programa que muestre cuente y sume los muacuteltiplos de 3 que hayentre 1 y un nuacutemero leiacutedo por teclado

Ejercicio 28Escribe un programa que calcule el factorial de un nuacutemero entero leiacutedo porteclado

Ejercicio 29Escribe un programa que muestre por pantalla todos los nuacutemeros enterospositivos menores a uno leiacutedo por teclado que no sean divisibles entre otrotambieacuten leiacutedo de igual forma

Bucles 48

Ejercicio 30Realiza una programa que calcule las horas transcurridas entre dos horas dedos diacuteas de la semana No se tendraacuten en cuenta los minutos ni los segundosEl diacutea de la semana se puede pedir como un nuacutemero (del 1 al 7) o comouna cadena (de ldquolunesrdquo a ldquodomingordquo) Se debe comprobar que el usuariointroduce los datos correctamente y que el segundo diacutea es posterior al primeroA continuacioacuten se muestra un ejemplo

Por favor introduzca la primera hora

Diacutea lunes

Hora 18

Por favor introduzca la segunda hora

Diacutea martes

Hora 20

Entre las 1800h del lunes y las 2000h del martes hay 26 horas

Ejercicio 31Realiza un programa que pinte la letra L por pantalla hecha con asteriscos Elprograma pediraacute la altura El palo horizontal de la L tendraacute una longitud de lamitad (divisioacuten entera entre 2) de la altura maacutes unoEjemplo

Introduzca la altura de la L 5

Bucles 49

Ejercicio 32Escribe un programa que dado un nuacutemero entero diga cuaacuteles son y cuaacutentosuman los diacutegitos pares Los diacutegitos pares se deben mostrar en orden deizquierda a derecha Usa long en lugar de int donde sea necesario para admitirnuacutemeros largosEjemplo 1

Por favor introduzca un nuacutemero entero positivo 94026782

Diacutegitos pares 4 0 2 6 8 2

Suma de los diacutegitos pares 22

Ejemplo 2

Por favor introduzca un nuacutemero entero positivo 31779

Diacutegitos pares

Suma de los diacutegitos pares 0

Ejemplo 3

Por favor introduzca un nuacutemero entero positivo 2404

Diacutegitos pares 2 4 0 4

Suma de los diacutegitos pares 10

Ejercicio 33Realiza un programa que pinte la letra U por pantalla hecha con asteriscos Elprograma pediraacute la altura Fiacutejate que el programa inserta un espacio y pintados asteriscos menos en la base para simular la curvatura de las esquinasinferioresEjemplo

Introduzca la altura de la U 5

Bucles 50

Ejercicio 34Escribe un programa que pida dos nuacutemeros por teclado y que luego mezcle endos nuacutemeros diferentes los diacutegitos pares y los impares Se van comprobandolos diacutegitos de la siguiente manera primer diacutegito del primer nuacutemero primerdiacutegito del segundo nuacutemero segundo diacutegito del primer nuacutemero segundodiacutegito del segundo nuacutemero tercer diacutegito del primer nuacutemerohellip Para facilitarel ejercicio podemos suponer que el usuario introduciraacute dos nuacutemeros de lamisma longitud y que siempre habraacute al menos un diacutegito par y uno impar Usalong en lugar de int donde sea necesario para admitir nuacutemeros largosEjemplo 1

Por favor introduzca un nuacutemero 9402

Introduzca otro nuacutemero 6782

El nuacutemero formado por los diacutegitos pares es 640822

El nuacutemero formado por los diacutegitos impares es 97

Ejemplo 2

Por favor introduzca un nuacutemero 137

Introduzca otro nuacutemero 909

El nuacutemero formado por los diacutegitos pares es 0

El nuacutemero formado por los diacutegitos impares es 19379

6 Nuacutemeros aleatoriosLos nuacutemeros aleatorios se utilizan con frecuencia en programacioacuten para emular elcomportamiento de alguacuten fenoacutemeno natural el resultado de un juego de azar o engeneral para generar cualquier valor impredecible a prioriPor ejemplo se pueden utilizar nuacutemeros aleatorios para generar tiradas de dados detal forma que de antemano no se puede saber el resultado Antes de tirar un dado nosabemos si saldraacute un 3 o un 5 se trataraacute pues de un nuacutemero impredecible lo que siacutesabemos es que saldraacute un nuacutemero entre el 1 y el 6 es decir podemos acotar el rangode los valores que vamos a obtener de forma aleatoria

61 Generacioacuten de nuacutemeros aleatorios con y sin decimales

Para generar valores aleatorios utilizaremos Mathrandom() Esta funcioacuten genera unnuacutemero con decimales (de tipo double) en el intervalo [0 - 1) es decir genera un nuacutemeromayor o igual que 0 y menor que 1El siguiente programa genera diez nuacutemeros aleatorios

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio01

public static void main(String[] args)

Systemoutprintln(Diez nuacutemeros aleatoriosn)

for (int i = 1 i lt 11 i++)

Systemoutprintln(Mathrandom())

La salida del programa puede ser algo como esto

51

Nuacutemeros aleatorios 52

030830376099567813

08330493363981046

02322483682676435

03130746053770094

034192944433558736

09636470440975567

03398896383918959

079825461825305

09868509622870223

09967893773101499

Te invito a que ejecutes varias veces el programa Podraacutes observar que cada vez salennuacutemeros diferentes aunque siempre estaacuten comprendidos entre 0 y 1 (incluyendo el0)Pensaraacutes que no es muy uacutetil generar nuacutemeros aleatorios entre 0 y 1 si lo que queremoses por ejemplo sacar una carta al azar de la baraja espantildeola pero en realidad unnuacutemero decimal entre 0 y 1 es lo uacutenico que nos hace falta para generar cualquier tipode valor aleatorio siempre y cuando se manipule ese nuacutemero de la forma adecuadaPor ejemplo si queremos generar valores aleatorios entre 0 y 10 (incluyendo el 0 y sinllegar a 10) simplemente tendremos que correr la coma un lugar o lo que es lo mismomultiplicar por 10

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio02

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 0 y 10)

Systemoutprintln( sin llegar a 10 (con decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprintln( Mathrandom()10 + )

El programa anterior genera una salida como eacutesta

Nuacutemeros aleatorios 53

007637674702636321

1025787417143682

1854993461897163

5690351111720931

382310645589797

5518007662236258

923529380254256

39201032643833376

5836554253122096

6224559064261578

7652976185871555

49922807025365135

7498156441347868

8743251697509109

9727764845406675

2929766691797686

005801413446517634

21575652936687284

Si queremos generar nuacutemeros enteros en lugar de nuacutemeros con decimales basta conhacer un casting para convertir los nuacutemeros de tipo double en nuacutemeros de tipo intRecuerda que (int)x transforma x en una variable de tipo entero si x era de tipo float

o double perderiacutea todos los decimales

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio03

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 0 y 9 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint((int)(Mathrandom()10) + )

Systemoutprintln()

La salida del programa debe ser algo muy parecido a esto

Nuacutemeros aleatorios 54

20 nuacutemeros aleatorios entre 0 y 9 (sin decimales)

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

iquestY si en lugar de generar nuacutemeros enteros entre 0 y 9 queremos generar nuacutemeros entre1 y 10 Como habraacutes podido adivinar simplemente habriacutea que sumar 1 al nuacutemerogenerado de esta forma se ldquodesplazan un pasordquo los valores generados al azar de talforma que el miacutenimo valor que se produce seriacutea el 0 + 1 = 1 y el maacuteximo seriacutea 9 + 1= 10

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio04

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 1 y 10 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint( (int)(Mathrandom()10 + 1) + )

Systemoutprintln()

Vamos a ponerlo un poco maacutes difiacutecil Ahora vamos a generar nuacutemeros enteros entre50 y 60 ambos incluidos Primero multiplicamos Mathrandom() por 11 con lo queobtenemos nuacutemeros decimales entre 0 y 109999hellip (sin llegar nunca hasta 11) Luegodesplazamos ese intervalo sumando 50 por lo que obtenemos nuacutemeros decimalesentre 50 y 609999hellip Por uacuteltimo quitamos los decimales haciendo casting y voilagraveya tenemos nuacutemeros enteros aleatorios entre 50 y 60 ambos incluidos

Nuacutemeros aleatorios 55

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio05

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 50 y 60 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint(((int)(Mathrandom()11) + 50 ) + )

Systemoutprintln()

62 Generacioacuten de palabras de forma aleatoria de un conjuntodado

Hemos visto coacutemo generar nuacutemeros aleatorios con y sin decimales y en diferentesintervalos Vamos a producir ahora de forma aleatoria una palabra - piedra papel otijera - generando primero un nuacutemero entero entre 0 y 2 y posteriormente haciendocorresponder una palabra a cada nuacutemero

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio06

public static void main(String[] args)

Systemoutprintln(Genera al azar piedra papel o tijera)

int mano = (int)(Mathrandom()3) genera un nuacutemero al azar entre 0 y 2 ambos incluidos

switch(mano)

case 0

Systemoutprintln(piedra)

Nuacutemeros aleatorios 56

breakcase 1

Systemoutprintln(papel)

breakcase 2

Systemoutprintln(tijera)

breakdefault

iquestCoacutemo podriacuteamos generar un diacutea de la semana de forma aleatoria En efecto primerogeneramos un nuacutemero entre 1 y 7 ambos inclusive y luego hacemos corresponder undiacutea de la semana a cada uno de los nuacutemeros

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio07

public static void main(String[] args)

Systemoutprintln(Muestra un diacutea de la semana al azar)

int dia = (int)(Mathrandom()7) + 1 genera un nuacutemero aleatorio entre el 1 y el 7

switch(dia)

case 1

Systemoutprintln(lunes)

breakcase 2

Systemoutprintln(martes)

breakcase 3

Systemoutprintln(mieacutercoles) breakcase 4

Systemoutprintln(jueves)

breakcase 5

Systemoutprintln(viernes)

breakcase 6

Nuacutemeros aleatorios 57

Systemoutprintln(saacutebado)

breakcase 7

Systemoutprintln(domingo)

breakdefault

Nuacutemeros aleatorios 58

63 Ejercicios

Ejercicio 1Escribe un programa que muestre la tirada de tres dados Se debe mostrartambieacuten la suma total (los puntos que suman entre los tres dados)

Ejercicio 2Realiza un programa que muestre al azar el nombre de una carta de labaraja francesa Esta baraja estaacute dividida en cuatro palos picas corazonesdiamantes y treacuteboles Cada palo estaacute formado por 13 cartas de las cuales 9cartas son numerales y 4 literales 2 3 4 5 6 7 8 9 10 J Q K y A (queseriacutea el 1) Para convertir un nuacutemero en una cadena de caracteres podemosusar StringvalueOf(n)

Ejercicio 3Igual que el ejercicio anterior pero con la baraja espantildeola Se utilizaraacute la barajade 40 cartas 2 3 4 5 6 7 sota caballo rey y as

Ejercicio 4Muestra 20 nuacutemeros enteros aleatorios entre 0 y 10 (ambos incluidos) sepa-rados por espacios

Ejercicio 5Muestra 50 nuacutemeros enteros aleatorios entre 100 y 199 (ambos incluidos)separados por espacios Muestra tambieacuten el maacuteximo el miacutenimo y la mediade esos nuacutemeros

Ejercicio 6Escribe un programa que piense un nuacutemero al azar entre 0 y 100 El usuariodebe adivinarlo y tiene para ello 5 oportunidades Despueacutes de cada intentofallido el programa diraacute cuaacutentas oportunidades quedan y si el nuacutemero intro-ducido es menor o mayor que el nuacutemero secreto

Ejercicio 7Escribe un programa que muestre tres apuestas de la quiniela en tres colum-nas para los 14 partidos y el pleno al quince (15 filas)

Nuacutemeros aleatorios 59

Ejercicio 8Modifica el programa anterior para que la probabilidad de que salga un 1 seade 12 la probabilidad de que salga x sea de 13 y la probabilidad de que salga2 sea de 16 Pista 12 = 36 y 13 = 26

Ejercicio 9Realiza un programa que vaya generando nuacutemeros aleatorios pares entre 0y 100 y que no termine de generar nuacutemeros hasta que no saque el 24 Elprograma deberaacute decir al final cuaacutentos nuacutemeros se han generado

Ejercicio 10Realiza un programa que pinte por pantalla diez liacuteneas formadas por carac-teres El caraacutecter con el que se pinta cada liacutenea se elige de forma aleatoriaentre uno de los siguientes - = | Las liacuteneas deben tener una longitudaleatoria entre 1 y 40 caracteres

Ejercicio 11Escribe un programa que muestre 20 notas generadas al azar Las notas debenaparecer de la forma suspenso suficiente bien notable o sobresaliente Alfinal apareceraacute el nuacutemero de suspensos el nuacutemero de suficientes el nuacutemerode bienes etc

Ejercicio 12Realiza un programa que llene la pantalla de caracteres aleatorios (a lo Matrix)con el coacutedigo ascii entre el 32 y el 126 Puedes hacer casting con (char) paraconvertir un entero en un caraacutecter

Ejercicio 13Escribe un programa que simule la tirada de dos dados El programa deberaacutecontinuar tirando los dados una y otra vez hasta que en alguna tirada los dosdados tengan el mismo valor

Ejercicio 14Realiza un programa que haga justo lo contrario a lo que hace el ejercicio 6El programa intentaraacute adivinar el nuacutemero que estaacutes pensando - un nuacutemeroentre 0 y 100 - teniendo para ello 5 oportunidades En cada intento fallido elprograma debe preguntar si el nuacutemero que estaacutes pensando es mayor o menorque el que te acaba de decir

Nuacutemeros aleatorios 60

Ejercicio 15Realiza un generador de melodiacutea con las siguientes condicionesa) Las notas deben estar generadas al azar Las 7 notas son do re mi fasol la y sib) Una melodiacutea estaacute formada por un nuacutemero aleatorio de notas mayor o iguala 4 menor o igual a 28 y siempre muacuteltiplo de 4 (4 8 12hellip)c) Cada grupo de 4 notas seraacute un compaacutes y estaraacute separado del siguientecompaacutes mediante la barra vertical ldquo|rdquo (Alt + 1) El final de la melodiacutea se marcacon dos barrasd) La uacuteltima nota de la melodiacutea debe coincidir con la primeraEjemplo 1

do mi fa mi | si do sol fa | fa re si do | sol mi re do ||

Ejemplo 2

la re mi sol | fa mi mi si | do la sol fa | fa re si sol | do sol mi re | fa la do la ||

Nuacutemeros aleatorios 61

Ejercicio 16Realiza un simulador de maacutequina tragaperras simplificada que cumpla lossiguientes requisitosa) El ordenador mostraraacute una tirada que consiste en mostrar 3 figuras Hay 5figuras posibles corazoacuten diamante herradura campana y limoacutenb) Si las tres figuras son diferentes se debe mostrar el mensaje ldquoLo sientoha perdidordquoc) Si hay dos figuras iguales y una diferente se debe mostrar el mensaje ldquoBienha recuperado su monedardquod) Si las tres figuras son iguales se debe mostrar ldquoEnhorabuena ha ganado10 monedasrdquoEjemplo 1

diamante diamante limoacuten

Bien ha recuperado su moneda

Ejemplo 2

herradura campana diamante

Lo siento ha perdido

Ejemplo 3

corazoacuten corazoacuten corazoacuten

Enhorabuena ha ganado 10 monedas

7 Arrays

71 Arrays de una dimensioacuten

Un array es un tipo de dato capaz de almacenar muacuteltiples valores Se utiliza paraagrupar datos muy parecidos por ejemplo si se necesita almacenar la temperaturamedia diaria en Maacutelaga durante el uacuteltimo antildeo se pueden utilizar las variables temp0temp1 temp2 temp3 temp4 hellip y asiacute hasta 365 variables distintas pero seriacutea poco praacutectico esmejor utilizar un array de nombre temp y usar un iacutendice para referanciar la temperaturade un diacutea concreto del antildeoEn matemaacuteticas un array de una dimensioacuten se llama vector En este libro noutilizaremos este teacutermino para no confundirlo con la clase Vector de JavaVeamos con un ejemplo coacutemo se crea y se utiliza un array

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array01

public static void main(String[] args)

int[] n se define n como un array de enterosn = new int[4] se reserva espacio para 4 enteros

n[0] = 26

n[1] = -30

n[2] = 0

n[3] = 100

Systemoutprint(Los valores del array n son los siguientes )

Systemoutprint(n[0] + + n[1] + + n[2] + + n[3])

int suma = n[0] + n[3]

Systemoutprintln(nEl primer elemento del array maacutes el uacuteltimo suman + suma)

Observa que el iacutendice de cada elemento de un array se indica entre corchetes de talforma que n[3] es el cuarto elemento ya que el primer iacutendice es el 0

62

Arrays 63

Array n

Iacutendice Valor0 261 -302 03 11

Fiacutejate que la definicioacuten del array y la reserva de memoria para los cuatro elementosque la componen se ha realizado en dos liacuteneas diferentes Se pueden hacer ambascosas en una sola liacutenea como veremos en el siguiente ejemplo

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array02

public static void main(String[] args)

definicioacuten del array y reserva de memoria en la misma liacuteneaint[] x = new int[5]

x[0] = 8

x[1] = 33

x[2] = 200

x[3] = 150

x[4] = 11

Systemoutprintln(El array x tiene 5 elementos iquestcuaacutel de ellos quiere ver)

Systemoutprint(Introduzca un nuacutemero del 0 al 4 )

int indice = IntegerparseInt(Systemconsole()readLine())

Systemoutprint(El elemento que se encuentra en la posicioacuten + indice)

Systemoutprintln( es el + x[indice])

El array x del ejemplo anterior se ha ido rellenando elemento a elemento Si se conocenpreviamente todos los valores iniciales del array se puede crear e inicializar en unasola liacutenea de la siguiente forma

int[] x = 8 33 200 150 11

Cada elemento del array se puede utilizar exactamente igual que cualquier otravariable es decir se le puede asignar un valor o se puede usar dentro de una

Arrays 64

expresioacuten En el siguiente ejemplo se muestran varias operaciones en las que losoperandos son elementos del array numPara recorrer todos los elementos de un array se suele utilizar un bucle for junto conun iacutendice que va desde 0 hasta el tamantildeo del array menos 1

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array03

public static void main(String[] args)

int[] num = new int[10]

num[0] = 8

num[1] = 33

num[2] = 200

num[3] = 150

num[4] = 11

num[5] = 88

num[6] = num[2] 10

num[7] = num[2] 10

num[8] = num[0] + num[1] + num[2]

num[9] = num[8]

Systemoutprintln(El array num contiene los siguientes elementos)

for (int i = 0 i lt 10 i++)

Systemoutprintln(num[i])

En Java a diferencia de otros lenguajes como Ruby o PHP todos los elementos de unarray deben ser del mismo tipo por ejemplo no puede haber un entero en la posicioacuten2 y una cadena de caracteres en la posicioacuten 7 del mismo array En el siguiente ejemplose muestra un array de caracteres

Arrays 65

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array04

public static void main(String[] args)

char[] caracter = new char[6]

caracter[0] = R

caracter[1] =

caracter[2] = amp

caracter[3] = +

caracter[4] = A

caracter[5] = 2

Systemoutprintln(El array caracter contiene los siguientes elementos)

for (int i = 0 i lt 6 i++)

Systemoutprintln(caracter[i])

En el siguiente ejemplo se muestra un array de nuacutemeros de tipo double que almacenanotas de alumnos

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array05

public static void main(String[] args)

double[] nota = new double[4]

Systemoutprintln(Para calcular la nota media necesito saber la )

Systemoutprintln(nota de cada uno de tus exaacutemenes)

for (int i = 0 i lt 4 i++)

Arrays 66

Systemoutprint(Nota del examen nordm + (i + 1) + )

nota[i] = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(Tus notas son )

double suma = 0

for (int i = 0 i lt 4 i++)

Systemoutprint(nota[i] + )

suma += nota[i]

Systemoutprintln(nLa media es + suma 4)

72 Arrays bidimensionales

Un array bidimensional utiliza dos iacutendices para localizar cada elemento Podemos vereste tipo de dato como un array que a su vez contiene otros arrays Tambieacuten se puedever como una cuadriacutecula en la que los datos quedan distribuidos en filas y columnasEn el siguiente ejemplo se muestra la definicioacuten y el uso de un array de dosdimensiones

author Luis Joseacute Saacutenchez Ejemplo de uso de arrays bidimensionales

public class ArrayBi01

public static void main(String[] args)

throws InterruptedException Se antildeade esta liacutenea para poder usar sleep

int[][] n = new int[3][2] array de 3 filas por 2 columnas

n[0][0]=20

n[1][0]=67

n[1][1]=33

n[2][1]=7

int fila columna

Arrays 67

for(fila = 0 fila lt 3 fila++)

Systemoutprint(Fila + fila)

for(columna = 0 columna lt 2 columna++)

Systemoutprintf(10d n[fila][columna])

Threadsleep(1000) retardo de un segundo

Systemoutprintln()

Mediante la liacutenea int[][] n = new int[3][2] se define un array bidimensional de 3 filaspor 2 columnas pero bien podriacutean ser 2 filas por 3 columnas seguacuten el objetivo y eluso que del array haga el programadorLos valores del array bidimensional se pueden proporcionar en la misma liacutenea de ladefinicioacuten como se muestra en el siguiente ejemplo

author Luis Joseacute Saacutenchez Ejemplo de uso de arrays bidimensionales

public class ArrayBi02

public static void main(String[] args)

throws InterruptedException Se antildeade esta liacutenea para poder usar sleep

int fila columna

int[][] n = 20 4 67 33 07

for(fila = 0 fila lt 3 fila++)

Systemoutprint(Fila + fila)

for(columna = 0 columna lt 2 columna++)

Systemoutprintf(10d n[fila][columna])

Threadsleep(1000) retardo de un segundo

Systemoutprintln()

Arrays 68

Los arrays bidimensionales se utilizan con frecuencia para situar objetos en un planocomo por ejemplo las piezas de ajedrez en un tablero o un personaje de video-juegoen un laberintoEn el siguiente programa se colocan una mina y un tesoro de forma aleatoria en uncuadrante de cuatro filas por cinco columnas El usuario intentaraacute averiguar doacutendeestaacute el tesoro indicando las coordenadas (x y)

Minijuego Busca el tesoro Se colocan una mina y un tesoro de forma aleatoria en un cuadrante de cuatro filas por cinco columnas El usuario intentaraacute averiguar doacutende estaacute el tesoro author Luis Joseacute Saacutenchez

public class BuscaTesoro

se definen constantes para representar el contenido de las celdasstatic final int VACIO = 0

static final int MINA = 1

static final int TESORO = 2

static final int INTENTO = 3

public static void main(String[] args)

int x

int y

int[][] cuadrante = new int[5][4]

inicializa el arrayfor(x = 0 x lt 4 x++)

for(y = 0 y lt 3 y++)

cuadrante[x][y] = VACIO

coloca la minaint minaX = (int)(Mathrandom()4)int minaY = (int)(Mathrandom()3)cuadrante[minaX][minaY] = MINA

coloca el tesoroint tesoroX

Arrays 69

int tesoroY

do

tesoroX = (int)(Mathrandom()4)tesoroY = (int)(Mathrandom()3)

while ((minaX == tesoroX) ampamp (minaY == tesoroY))

cuadrante[tesoroX][tesoroY] = TESORO

juegoSystemoutprintln(iexclBUSCA EL TESORO)

boolean salir = falseString c =

do

pinta el cuadrantefor(y = 3 y gt= 0 y--)

Systemoutprint(y + |)

for(x = 0 x lt 5 x++)

if (cuadrante[x][y] == INTENTO)

Systemoutprint(X )

elseSystemoutprint( )

Systemoutprintln()

Systemoutprintln( ----------n 0 1 2 3 4n)

pide las coordenadasSystemoutprint(Coordenada x )

x = IntegerparseInt(Systemconsole()readLine())

Systemoutprint(Coordenada y )

y = IntegerparseInt(Systemconsole()readLine())

mira lo que hay en las coordenadas indicadas por el usuarioswitch(cuadrante[x][y])

case VACIO

cuadrante[x][y] = INTENTO

breakcase MINA

Systemoutprintln(Lo siento has perdido)

salir = truebreak

case TESOROSystemoutprintln(Enhorabuena has encontrado el tesoro)

salir = truebreak

default

Arrays 70

while (salir)

pinta el cuadrantefor(y = 3 y gt= 0 y--)

Systemoutprint(y + )

for(x = 0 x lt 5 x++)

switch(cuadrante[x][y])

case VACIO

c =

breakcase MINA

c =

breakcase TESORO

c = euro

breakcase INTENTO

c = x

breakdefault

Systemoutprint(c)

Systemoutprintln()

Systemoutprintln( ----------n 0 1 2 3 4n)

73 Recorrer arrays con for al estilo foreach

Al trabajar con arrays es muy frecuente cometer errores utilizando los iacutendices El errormaacutes tiacutepico consiste en intentar acceder a un elemento mediante un iacutendice que se salede los liacutemites Por ejemplo si tenemos el array n definido de la siguiente forma int[] n =

new int[10] cuando intentamos acceder a n[-1] o a n[10] obtenemos un error en tiempode ejecucioacutenPara recorrer un array de un modo maacutes praacutectico y sencillo sin que tengamos quepreocuparnos de los liacutemites podemos utilizar el bucle for con el formato foreach Deesta forma indicamos simplemente el nombre del array que queremos recorrer y enqueacute variable se va a ir colocando cada elemento con cada iteraccioacuten del bucle No hayque especificar con queacute iacutendice comienza y termina el bucle de eso se encarga JavaA continuacioacuten se muestra el ejemplo Array05java visto anteriormente pero esta vezutilizando el for a la manera foreach

Arrays 71

Recorre un array con un for al estilo foreach author Luis Joseacute Saacutenchez

public class ArrayForEach

public static void main(String[] args)

double[] nota = new double[4]

Systemoutprintln(Para calcular la nota media necesito saber la )

Systemoutprintln(nota de cada uno de tus exaacutemenes)

for (int i = 0 i lt 4 i++)

Systemoutprint(Nota del examen nordm + (i + 1) + )

nota[i] = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(Tus notas son )

double suma = 0

for (double n nota) for al estilo foreachSystemoutprint(n + )

suma += n

Systemoutprintln(nLa media es + suma 4)

Fiacutejate en el segundo for en este caso no se utiliza ninguacuten iacutendice simplemente decimosldquove sacando uno a uno los elementos del array nota y deposita cada uno de esoselementos en la variable n que es de tipo doublerdquo

Arrays 72

74 Ejercicios

741 Arrays de una dimensioacuten

Ejercicio 1Define un array de 12 nuacutemeros enteros con nombre num y asigna los valoresseguacuten la tabla que se muestra a continuacioacuten Muestra el contenido de todoslos elementos del array iquestQueacute sucede con los valores de los elementos que nohan sido inicializados

Ejercicio 2Define un array de 10 caracteres con nombre simbolo y asigna valores a loselementos seguacuten la tabla que se muestra a continuacioacuten Muestra el contenidode todos los elementos del array iquestQueacute sucede con los valores de los elementosque no han sido inicializados

Ejercicio 3Escribe un programa que lea 10 nuacutemeros por teclado y que luego los muestreen orden inverso es decir el primero que se introduce es el uacuteltimo enmostrarse y viceversa

Ejercicio 4Define tres arrays de 20 nuacutemeros enteros cada una con nombres numerocuadrado y cubo Carga el array numero con valores aleatorios entre 0 y 100 En elarray cuadrado se deben almacenar los cuadrados de los valores que hay en elarray numero En el array cubo se deben almacenar los cubos de los valores quehay en numero A continuacioacuten muestra el contenido de los tres arrays dispuestoen tres columnas

Arrays 73

Ejercicio 5Escribe un programa que pida 10 nuacutemeros por teclado y que luego muestrelos nuacutemeros introducidos junto con las palabras ldquomaacuteximordquo y ldquomiacutenimordquo al ladodel maacuteximo y del miacutenimo respectivamente

Ejercicio 6Escribe un programa que lea 15 nuacutemeros por teclado y que los almacene en unarray Rota los elementos de ese array es decir el elemento de la posicioacuten 0debe pasar a la posicioacuten 1 el de la 1 a la 2 etc El nuacutemero que se encuentra enla uacuteltima posicioacuten debe pasar a la posicioacuten 0 Finalmente muestra el contenidodel array

Ejercicio 7Escribe un programa que genere 100 nuacutemeros aleatorios del 0 al 20 y que losmuestre por pantalla separados por espacios El programa pediraacute entoncespor teclado dos valores y a continuacioacuten cambiaraacute todas las ocurrencias delprimer valor por el segundo en la lista generada anteriormente Los nuacutemerosque se han cambiado deben aparecer entrecomillados

Ejercicio 8Realiza un programa que pida la temperatura media que ha hecho en cada mesde un determinado antildeo y que muestre a continuacioacuten un diagrama de barrashorizontales con esos datos Las barras del diagrama se pueden dibujar a basede asteriscos o cualquier otro caraacutecter

Ejercicio 9Realiza un programa que pida 8 nuacutemeros enteros y que luego muestre esosnuacutemeros junto con la palabra ldquoparrdquo o ldquoimparrdquo seguacuten proceda

Ejercicio 10Escribe un programa que genere 20 nuacutemeros enteros aleatorios entre 0 y 100y que los almacene en un array El programa debe ser capaz de pasar todoslos nuacutemeros pares a las primeras posiciones del array (del 0 en adelante) ytodos los nuacutemeros impares a las celdas restantes Utiliza arrays auxiliares sies necesario

Arrays 74

Ejercicio 11Realiza un programa que pida 10 nuacutemeros por teclado y que los almacene enun array A continuacioacuten se mostraraacute el contenido de ese array junto al iacutendice(0 ndash 9) utilizando para ello una tabla Seguidamente el programa pasaraacute losprimos a las primeras posiciones desplazando el resto de nuacutemeros (los queno son primos) de tal forma que no se pierda ninguno Al final se debe mostrarel array resultantePor ejemplo

Array inicial

Array final

Ejercicio 12Realiza un programa que pida 10 nuacutemeros por teclado y que los almacene enun array A continuacioacuten se mostraraacute el contenido de ese array junto al iacutendice(0 ndash 9) Seguidamente el programa pediraacute dos posiciones a las que llamaremosldquoinicialrdquo y ldquofinalrdquo Se debe comprobar que inicial es menor que final y queambos nuacutemeros estaacuten entre 0 y 9 El programa deberaacute colocar el nuacutemero dela posicioacuten inicial en la posicioacuten final rotando el resto de nuacutemeros para que nose pierda ninguno Al final se debe mostrar el array resultantePor ejemplo para inicial = 3 y final = 7

Array inicial

Array final

Arrays 75

Ejercicio 13Escribe un programa que rellene un array de 100 elementos con nuacutemeros ente-ros aleatorios comprendidos entre 0 y 500 (ambos incluidos) A continuacioacutenel programa mostraraacute el array y preguntaraacute si el usuario quiere destacar elmaacuteximo o el miacutenimo Seguidamente se volveraacute a mostrar el array escribiendoel nuacutemero destacado entre dobles asteriscosEjemplo

459 204 20 250 178 90 353 32 229 357 224 454 260 310 140 249 332 426 423 413 96 447 465 29

8 459 411 118 480 302 417 42 82 126 82 474 362 76 190 104 21 257 88 21 251 6 383 47 78 392

394 244 494 87 253 376 379 98 364 237 13 299 228 409 402 225 426 267 330 243 209 426 435

309 356 173 130 416 15 477 34 28 377 193 481 368 466 262 422 275 384 399 397 87 218 84 312

480 207 68 108

iquestQueacute quiere destacar (1 ndash miacutenimo 2 ndash maacuteximo) 1

459 204 20 250 178 90 353 32 229 357 224 454 260 310 140 249 332 426 423 413 96 447 465 29

8 459 411 118 480 302 417 42 82 126 82 474 362 76 190 104 21 257 88 21 251 6 383 47 78

392 394 244 494 87 253 376 379 98 364 237 13 299 228 409 402 225 426 267 330 243 209 426

435 309 356 173 130 416 15 477 34 28 377 193 481 368 466 262 422 275 384 399 397 87 218 84

312 480 207 68 108

Ejercicio 14Escribe un programa que pida 8 palabras y las almacene en un array Acontinuacioacuten las palabras correspondientes a colores se deben almacenar alcomienzo y las que no son colores a continuacioacuten Puedes utilizar tantos arraysauxiliares como quieras Los colores que conoce el programa deben estar enotro array y son los siguientes verde rojo azul amarillo naranja rosa negroblanco y moradoEjemplo

Array original

0 1 2 3 4 5 6 7

casa azul verde orden morado bombillabici rosa

Array resultado

0 1 2 3 4 5 6 7

azul verde morado rosa casa orden bombillabici

Arrays 76

Ejercicio 15Un restaurante nos ha encargado una aplicacioacuten para colocar a los clientes ensus mesas En una mesa se pueden sentar de 0 (mesa vaciacutea) a 4 comensales(mesa llena) Cuando llega un cliente se le pregunta cuaacutentos son De momentoel programa no estaacute preparado para colocar a grupos mayores a 4 por tantosi un cliente dice por ejemplo que son un grupo de 6 el programa daraacute elmensaje ldquoLo siento no admitimos grupos de 6 haga grupos de 4personas como maacuteximo e intente de nuevordquo Para el grupo que llegase busca siempre la primera mesa libre (con 0 personas) Si no quedan mesaslibres se busca donde haya un hueco para todo el grupo por ejemplo si elgrupo es de dos personas se podraacute colocar donde haya una o dos personasInicialmente las mesas se cargan con valores aleatorios entre 0 y 4 Cadavez que se sientan nuevos clientes se debe mostrar el estado de las mesasLos grupos no se pueden romper aunque haya huecos sueltos suficientes Elfuncionamiento del programa se ilustra a continuacioacutenEjemplo

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 0 2 4 1 0 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 2

Por favor sieacutentense en la mesa nuacutemero 3

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 1 0 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 4

Por favor sieacutentense en la mesa nuacutemero 7

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 1 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 3

Tendraacuten que compartir mesa Por favor sieacutentense en la mesa nuacutemero 6

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 4 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 4

Lo siento en estos momentos no queda sitio

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 4 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) -1

Gracias Hasta pronto

Arrays 77

Ejercicio 16Escribe un programa que rellene un array de 20 elementos con nuacutemeros ente-ros aleatorios comprendidos entre 0 y 400 (ambos incluidos) A continuacioacutenel programa mostraraacute el array y preguntaraacute si el usuario quiere resaltar losmuacuteltiplos de 5 o los muacuteltiplos de 7 Seguidamente se volveraacute a mostrar elarray escribiendo los nuacutemeros que se quieren resaltar entre corchetesEjemplo ldquolsquoconsole159 204 20 250 178 90 353 32 229 357 224 54 260 310 140 249 335 326 22313 iquestQueacute nuacutemeros quiere resaltar (1 ndash los muacuteltiplos de 5 2 ndash los muacuteltiplos de7) 1 159 204 [20] [250] 178 [90] 353 32 229 357 224 54 [260] [310] [140]249 [335] 326 223 13 ldquolsquo

742 Arrays bidimensionales

Ejercicio 1Define un array de nuacutemeros enteros de 3 filas por 6 columnas con nombre num

y asigna los valores seguacuten la siguiente tabla Muestra el contenido de todoslos elementos del array dispuestos en forma de tabla como se muestra en lafigura

Ejercicio 2Escribe un programa que pida 20 nuacutemeros enteros Estos nuacutemeros se debenintroducir en un array de 4 filas por 5 columnas El programa mostraraacute lassumas parciales de filas y columnas igual que si de una hoja de caacutelculo setratara La suma total debe aparecer en la esquina inferior derecha

Arrays 78

Ejercicio 3Modifica el programa anterior de tal forma que los nuacutemeros que se introducenen el array se generen de forma aleatoria (valores entre 100 y 999)

Ejercicio 4Modifica el programa anterior de tal forma que las sumas parciales y la sumatotal aparezcan en la pantalla con un pequentildeo retardo dando la impresioacuten deque el ordenador se queda ldquopensandordquo antes de mostrar los nuacutemeros

Ejercicio 5Realiza un programa que rellene un array de 6 filas por 10 columnas connuacutemeros enteros positivos comprendidos entre 0 y 1000 (ambos incluidos)A continuacioacuten el programa deberaacute dar la posicioacuten tanto del maacuteximo comodel miacutenimo

Ejercicio 6Modifica el programa anterior de tal forma que no se repita ninguacuten nuacutemero enel array

Ejercicio 7Mejora el juego ldquoBusca el tesorordquo de tal forma que si hay una mina a una casillade distancia el programa avise diciendo iexclCuidado iexclHay una mina cerca

Ejercicio 8Escribe un programa que dada una posicioacuten en un tablero de ajedrez nos digaa queacute casillas podriacutea saltar un alfil que se encuentra en esa posicioacuten Como seindica en la figura el alfil se mueve siempre en diagonal El tablero cuenta con64 casillas Las columnas se indican con las letras de la ldquoardquo a la ldquohrdquo y las filasse indican del 1 al 8

Arrays 79

Ejemplo

Introduzca la posicioacuten del alfil d5

El aacutelfil puede moverse a las siguientes posiciones

h1 a2 g2 b3 e3 c4 e4 c6 e6 b7 f7 a8 g8

Ejercicio 9Realiza un programa que sea capaz de rotar todos los elementos de unamatriz cuadrada una posicioacuten en el sentido de las agujas del reloj La matrizdebe tener 12 filas por 12 columnas y debe contener nuacutemeros generados alazar entre 0 y 100 Se debe mostrar tanto la matriz original como la matrizresultado ambas con los nuacutemeros convenientemente alineados

Ejercicio 10Realiza el juego de las tres en raya

8 Funciones

81 Implementando funciones para reutilizar coacutedigo

En programacioacuten es muy frecuente reutilizar coacutedigo es decir usar coacutedigo ya exis-tente Cuando una parte de un programa requiere una funcionalidad que ya estaacuteimplementada en otro programa no tiene mucho sentido emplear tiempo y energiacuteaen implementarla otra vezUna funcioacuten es un trozo de coacutedigo que realiza una tarea muy concreta y que se puedeincluir en cualquier programa cuando hace falta resolver esa tarea Opcionalmentelas funciones aceptan una entrada (paraacutemetros de entrada) y devuelven una salidaObserva el siguiente ejemplo Se trata de un programa que pide un nuacutemero por tecladoy luego dice si el nuacutemero introducido es o no es primo

Dice si un nuacutemero es o no es primo (sin funciones) author Luis Joseacute Saacutenchez

public class NumeroPrimo

public static void main(String[] args)

Systemoutprint(Introduce un nuacutemero entero positivo )

int n = IntegerparseInt(Systemconsole()readLine())

boolean esPrimo = truefor (int i = 2 i lt n i++)

if ((n i) == 0)

esPrimo = false

if (esPrimo)

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

80

Funciones 81

Podemos intuir que la tarea de averiguar si un nuacutemero es o no primo seraacute algo queutilizaremos con frecuencia maacutes adelante asiacute que podemos aislar el trozo de coacutedigoque realiza ese cometido para usarlo con comodidad en otros programas

Dice si un nuacutemero es o no es primo usando una funcioacuten author Luis Joseacute Saacutenchez

public class NumeroPrimoConFuncion

Programa principal

public static void main(String[] args)

Systemoutprint(Introduzca un nuacutemero entero positivo )

int n = IntegerparseInt(Systemconsole()readLine())

if (esPrimo(n))

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

Funciones

Comprueba si un nuacutemero entero positivo es primo o no Un nuacutemero es primo cuando uacutenicamente es divisible entre eacutel mismo y la unidad param x un nuacutemero entero positivo return ltcodegttrueltcodegt si el nuacutemero es primo return ltcodegtfalseltcodegt en caso contrario

public static boolean esPrimo(int x)

for (int i = 2 i lt x i++)

if ((x i) == 0)

return false

Funciones 82

return true

Cada funcioacuten tiene una cabecera y un cuerpo En el ejemplo anterior la cabecera es

public static boolean esPrimo(int x)

De momento no vamos a explicar queacute significa public static lo dejaremos para cuandoveamos el capiacutetulo 9 ldquoProgramacioacuten orientada a objetosrdquo por ahora lo escribiremos talcual cada vez que definamos una funcioacuten A continuacioacuten se escribe el tipo de dato quedevuelve la funcioacuten en este caso es boolean porque la funcioacuten devolveraacute siempre true

(verdadero) o false falso Lo uacuteltimo que lleva la cabecera son los paraacutemetros encerradosentre pareacutentesis Esos paraacutemetros son los valores que se le pasan a la funcioacuten paraque realice los caacutelculos En este caso concreto el paraacutemetro que se pasa es x o seael nuacutemero que queremos saber si es primo o no Es necesario indicar siempre el tipode cada paraacutemetro en esta ocasioacuten el paraacutemetro que se pasa es de tipo entero (int)

82 Comentarios de funciones

Los comentarios tienen un papel muy importante en los programas ya que aunque nose compilan ni se ejecutan permiten describir aclarar o dar informacioacuten relevantesobre queacute hace exactamente el coacutedigo Un programa bien comentado es muchomaacutes faacutecil de corregir mantener y mejorar que un programa mal comentado o quesimplemente no tiene comentariosExiste una herramienta llamada javadoc que crea unos documentos en HTML coninformacioacuten sobre programas escritos en Java Para ello javadoc utiliza los comentariosque se han hecho y ademaacutes la meta-informacioacuten que se incluye en esos comentariosEsta meta-informacioacuten es muy faacutecil de distinguir pues va precedida siempre de uncaraacutecter Te habraacutes dado cuenta que en los comentarios de los programas que hemos visto eneste manual se indica el nombre del autor mediante authorSi los comentarios de los programas en general son importantes debemos prestarespecial atencioacuten a los comentarios de las funciones ya que posiblemente seraacutenusadas por otros programadores que querraacuten saber exactamente coacutemo se utilizanCon la etiqueta param seguida de un nombre de paraacutemetro se indica queacute paraacutemetroespera como entrada la funcioacuten Si una funcioacuten acepta varios paraacutemetros se especifi-caraacuten varias etiquetas param en los comentariosMediante la etiqueta return especificamos queacute devuelve exactamente la funcioacutenAunque el tipo de dato que se devuelve ya viene indicado en la cabecera de la funcioacutenmediante la etiqueta return podemos explicarlo con maacutes detalle

Funciones 83

En los comentarios se pueden incluir elementos de HTML como ltcodegt ampnbsp etc yaque los entiende perfectamente javadocPuedes hacer una prueba generando la documentacioacuten del ejemplo ejecutando lasiguiente liacutenea en una ventana de terminal Como tenemos tildes en los comentariossi queremos que salgan bien en las paacuteginas de documentacioacuten debemos indicar lacodificacioacuten de caracteres

javadoc -encoding UTF-8 -charset UTF-8 -docencoding UTF-8 NumeroPrimoConFuncionjava

Para aprender maacutes sobre javadoc puedes consultar la documentacioacuten oficial de Oracle1

83 Creacioacuten de bibliotecas de rutinas mediante paquetes

Si la funcioacuten esPrimo() va a ser usada en tres programas diferentes se puede copiary pegar su coacutedigo en cada uno de los programas pero hay una solucioacuten mucho maacuteselegante y praacutecticaLas funciones de un determinado tipo (por ejemplo funciones matemaacuteticas) se puedenagrupar para crear un paquete (package) que luego se importaraacute desde el programa quenecesite esas funcionesCada paquete se corresponde con un directorio Por tanto si hay un paquete connombre matematicas debe haber un directorio llamado tambieacuten matematicas en la mismaubicacioacuten del programa que importa ese paquete (normalmente el programa princi-pal)Las funciones se pueden agrupar dentro de un paquete de dos maneras diferentesPuede haber subpaquetes dentro de un paquete por ejemplo si quisieacuteramos dividirlas funciones matemaacuteticas en funciones relativas al caacutelculo de aacutereas y voluacutemenesde figuras geomeacutetricas y funciones relacionadas con caacutelculos estadiacutesticos podriacuteamoscrear dos directorios dentro de matematicas con nombres geometria y estadistica respecti-vamente Estos subpaquetes se llamariacutean matematicasgeometria y matematicasestadisticaOtra manera de agrupar las funciones dentro de un mismo paquete consiste en crearvarios ficheros dentro de un mismo directorio En este caso se podriacutean crear los ficherosGeometriajava y EstadisticajavaEntenderemos mejor todos estos conceptos con un ejemplo completo Vamos a crearun paquete con nombre matematicas que contenga dos clases Varias (para funcionesmatemaacuteticas de propoacutesito general) y Geometria Por tanto en el disco duro tendremosuna carpeta con nombre matematicas que contiene los ficheros Variasjava y GeometriajavaEl contenido de estos ficheros se muestra a continuacioacuten

1httpwwworaclecomtechnetworkjavajavasedocumentationindex-137868html

Funciones 84

Funciones matemaacuteticas de propoacutesito general author Luis Joseacute Saacutenchez

package matematicas

public class Varias

Comprueba si un nuacutemero entero positivo es primo o no Un nuacutemero es primo cuando uacutenicamente es divisible entre eacutel mismo y la unidad param x un nuacutemero entero positivo return ltcodegttrueltcodegt si el nuacutemero es primo return ltcodegtfalseltcodegt en caso contrario

public static boolean esPrimo(int x)

for (int i = 2 i lt x i++)

if ((x i) == 0)

return false

return true

Devuelve el nuacutemero de diacutegitos que contiene un nuacutemero entero param x un nuacutemero entero return la cantidad de diacutegitos que contiene el nuacutemero

public static int digitos(int x)

if (x == 0)

return 1

else

int n = 0

while (x gt 0)

x = x 10

n++

Funciones 85

return n

Se incluye a continuacioacuten Geometriacuteajava Recuerda que tanto Variasjava como Geome-

triacuteajava se encuentran dentro del directorio matematicas

Funciones geomeacutetricas author Luis Joseacute Saacutenchez

package matematicas

public class Geometria

Calcula el volumen de un cilindro Tanto el radio como la altura se deben proporcionar en las mismas unidades para que el resultado sea congruente param r radio del cilindro param h altura del cilindro return volumen del cilindro

public static double volumenCilindro(double r double h)

return MathPI r r h

Calcula la longitud de una circunferencia a partir del radio param r radio de la circunferencia return longitud de la circunferencia

public static double longitudCircunferencia(double r)

return 2 MathPI r

Observa que en ambos ficheros se especifica que las clases declaradas (y por tantolas funciones que se definen dentro) pertenecen al paquete matematicas mediante la

Funciones 86

liacutenea package matematicas Ahora ya podemos probar las funciones desde un programaexterno El programa PruebaFuncionesjava estaacute fuera de la carpeta matematicas justo enun nivel superior en la estructura de directorios

Dice si un nuacutemero es o no es primo usando una funcioacuten author Luis Joseacute Saacutenchez

import matematicasVariasimport matematicasGeometria

public class PruebaFunciones

public static void main(String[] args)

int n

Prueba esPrimo()

Systemoutprint(Introduzca un nuacutemero entero positivo )

n = IntegerparseInt(Systemconsole()readLine())

if (matematicasVariasesPrimo(n))

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

Prueba digitos()

Systemoutprint(Introduzca un nuacutemero entero positivo )

n = IntegerparseInt(Systemconsole()readLine())

Systemoutprintln(n + tiene + matematicasVariasdigitos(n) + diacutegitos)

Prueba volumenCilindro()

double r h

Systemoutprintln(Caacutelculo del volumen de un cilindro)

Systemoutprint(Introduzca el radio en metros )

r = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura en metros )

Funciones 87

h = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El volumen del cilindro es + matematicasGeometriavolumenCilind

ro(r h) + m3)

Las liacuteneas

import matematicasVariasimport matematicasGeometria

cargan las clases contenidas en el paquete matematicas y por tanto todas las funcionescontenidas en ellas No vamos a utilizar el comodiacuten de la forma import matematicas yaque estaacute desaconsejado su uso en el estaacutendar de codificacioacuten en Java de GoogleEl uso de una funcioacuten es muy sencillo hay que indicar el nombre del paquete el nom-bre de la clase y finalmente el nombre de la funcioacuten con los paraacutemetros adecuados Porejemplo como vemos en el programa anterior matematicasVariasdigitos(n) devuelve elnuacutemero de diacutegitos de n siendo matematicas el paquete Varias la clase digitos la funcioacuteny n el paraacutemetro que se le pasa a la funcioacuten

84 Aacutembito de las variables

El aacutembito de una variable es el espacio donde ldquoexisterdquo esa variable o dicho de otromodo el contexto dentro del cual la variable es vaacutelidaSeguramente has utilizado muchas veces variables con nombres como x i max o aux Elaacutembito de cada una de esas variables era el programa en el que estaban declaradasFiacutejate que la x del primer programa que aparece en este libro no interfiere para nadacon la x del siguiente programa que usa una variable con ese mismo nombre Aunquese llamen igual son variables diferentesCuando se implementan funciones hay que tener muy claro que las variables utilizadascomo paraacutemetros (por valor) o las variables que se definen dentro de la funcioacuten sonlocales a esa funcioacuten es decir su aacutembito es la funcioacuten y fuera de ella esas variablesno existen Presta atencioacuten al programa Variosjava y observa que las dos funcionesque hay definidas dentro de la clase utilizan sendas variables con nombre x Puesbien cada una de esas variables son completamente independientes se trata de dosvariables distintas que tienen el mismo nombre pero que son vaacutelidas cada una en supropio aacutembito

85 Paso de paraacutemetros por valor y por referencia

En Java como en la mayoriacutea de lenguajes de programacioacuten existen dos maneras depasar paraacutemetros por valor y por referencia

Funciones 88

Cuando se pasa un paraacutemetro por valor en realidad se pasa una copia de la variableuacutenicamente importa el valor Cualquier modificacioacuten que se le haga a la variable que sepasa como paraacutemetro dentro de la funcioacuten no tendraacute ninguacuten efecto fuera de la mismaVeamos un ejemplo

Paso de paraacutemetros por valor author Luis Joseacute Saacutenchez

public class PruebaParametros1

public static void main(String[] args)

int n = 10

Systemoutprintln(n)

calcula(n)

Systemoutprintln(n)

public static void calcula(int x)

x += 24

Systemoutprintln(x)

La salida del programa anterior es la siguiente

10

34

10

A pesar de que la variable que se pasa como paraacutemetro se modifica dentro de lafuncioacuten los cambios no tienen ninguacuten efecto en el programa principalCuando se pasa un paraacutemetro por referencia por el contrario si se modifica su valordentro de la funcioacuten los cambios se mantienen una vez que la funcioacuten ha terminadode ejecutarseEn la mayoriacutea de los lenguajes de programacioacuten es el programador quien decidecuaacutendo un paraacutemetro se pasa por valor y cuaacutendo se pasa por referencia En Java nopodemos elegir Todos los paraacutemetros que son de tipo int double float char o String

se pasan siempre por valor mientras que los arrays se pasan siempre por referenciaEsto quiere decir que cualquier cambio que efectuemos en un array que se pasa comoparaacutemetro permanece cuando termina la ejecucioacuten de la funcioacuten por lo que hay quetener especial cuidado en estos casos

Funciones 89

Paso de un array como paraacutemetro author Luis Joseacute Saacutenchez

public class PruebaParametrosArray

public static void main(String[] args)

int n[] = 8 33 200 150 11

int m[] = new int[5]

muestraArray(n)

incrementa(n)

muestraArray(n)

public static void muestraArray(int x[])

for (int i = 0 i lt xlength i++)

Systemoutprint(x[i] + )

Systemoutprintln()

public static void incrementa(int x[])

for (int i = 0 i lt xlength i++)

x[i]++

La salida del programa anterior es la siguiente

8 33 200 150 11

9 34 201 151 12

Comprobamos por tanto que el array que se ha pasado como paraacutemetro se hamodificado en la funcioacuten y se han conservado los cambios en el programa principalPor uacuteltimo se muestra un programa que contiene funciones que operan con arrays dedos dimensiones

Funciones 90

Paso de un array bidimensional como paraacutemetro author Luis Joseacute Saacutenchez

import matematicasVarias

public class ArrayBiFunciones

public static void main(String[] args)

int[][] n = new int[6][9]

for(int i = 0 i lt 6 i++)

for(int j = 0 j lt 9 j++)

n[i][j] = (int)(Mathrandom()100000)

muestraArrayIntBi(n)

Funciones

Devuelve el nuacutemero de filas de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return nuacutemero de filas del array

public static int filasArrayIntBi(int x[][])

return xlength

Devuelve el nuacutemero de columnas de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return nuacutemero de columnas del array

public static int columnasArrayIntBi(int x[][])

Funciones 91

return x[0]length

Devuelve el maacuteximo de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return el valor maacuteximo encontrado en el array

public static int maximoArrayIntBi(int x[][])

int maximo = IntegerMIN_VALUE

for (int f = 0 f lt filasArrayIntBi(x) f++)

for (int c = 0 c lt columnasArrayIntBi(x) c++)

if (x[f][c] gt maximo)

maximo = x[f][c]

return maximo

Muestra por pantalla el contenido de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros

public static void muestraArrayIntBi(int x[][])

String formatoNumero = + matematicasVariasdigitos(maximoArrayIntBi(x)) + d

for (int f = 0 f lt filasArrayIntBi(x) f++)

for (int c = 0 c lt columnasArrayIntBi(x) c++)

Systemoutprintf(formatoNumero + x[f][c])

Systemoutprintln()

Funciones 92

86 Ejercicios

Ejercicios 1-14Crea una biblioteca de funciones matemaacuteticas que contenga las siguientesfunciones Recuerda que puedes usar unas dentro de otras si es necesario

1 esCapicua Devuelve verdadero si el nuacutemero que se pasa como paraacute-metro es capicuacutea y falso en caso contrario

2 esPrimo Devuelve verdadero si el nuacutemero que se pasa como paraacutemetroes primo y falso en caso contrario

3 siguientePrimo Devuelve el menor primo que es mayor al nuacutemero quese pasa como paraacutemetro

4 potencia Dada una base y un exponente devuelve la potencia5 digitos Cuenta el nuacutemero de diacutegitos de un nuacutemero entero6 voltea Le da la vuelta a un nuacutemero7 digitoN Devuelve el diacutegito que estaacute en la posicioacuten n de un nuacutemero

entero Se empieza contando por el 0 y de izquierda a derecha8 posicionDeDigito Da la posicioacuten de la primera ocurrencia de un diacutegito

dentro de un nuacutemero entero Si no se encuentra devuelve -19 quitaPorDetras Le quita a un nuacutemero n diacutegitos por detraacutes (por la

derecha)10 quitaPorDelante Le quita a un nuacutemero n diacutegitos por delante (por la

izquierda)11 pegaPorDetras Antildeade un diacutegito a un nuacutemero por detraacutes12 pegaPorDelante Antildeade un diacutegito a un nuacutemero por delante13 trozoDeNumero Toma como paraacutemetros las posiciones inicial y final

dentro de un nuacutemero y devuelve el trozo correspondiente14 juntaNumeros Pega dos nuacutemeros para formar uno

Ejercicio 15Muestra los nuacutemeros primos que hay entre 1 y 1000

Ejercicio 16Muestra los nuacutemeros capicuacutea que hay entre 1 y 99999

Ejercicio 17Escribe un programa que pase de binario a decimal

Ejercicio 18Escribe un programa que pase de decimal a binario

Funciones 93

Ejercicio 19Une y ampliacutea los dos programas anteriores de tal forma que se permitaconvertir un nuacutemero entre cualquiera de las siguientes bases decimal binariohexadecimal y octal

Ejercicios 20-28Crea una biblioteca de funciones para arrays (de una dimensioacuten) de nuacutemerosenteros que contenga las siguientes funciones

1 generaArrayInt Genera un array de tamantildeo n con nuacutemeros aleatorioscuyo intervalo (miacutenimo y maacuteximo) se indica como paraacutemetro

2 minimoArrayInt Devuelve el miacutenimo del array que se pasa comoparaacutemetro

3 maximoArrayInt Devuelve el maacuteximo del array que se pasa comoparaacutemetro

4 mediaArrayInt Devuelve la media del array que se pasa como paraacute-metro

5 estaEnArrayInt Dice si un nuacutemero estaacute o no dentro de un array6 posicionEnArray Busca un nuacutemero en un array y devuelve la posicioacuten

(el iacutendice) en la que se encuentra7 volteaArrayInt Le da la vuelta a un array8 rotaDerechaArrayInt Rota n posiciones a la derecha los nuacutemeros de

un array9 rotaIzquierdaArrayInt Rota n posiciones a la izquierda los nuacutemeros de

un array

Funciones 94

Ejercicio 29-34Crea una biblioteca de funciones para arrays bidimensionales (de dos dimen-siones) de nuacutemeros enteros que contenga las siguientes funciones

1 generaArrayBiInt Genera un array de tamantildeo n x m con nuacutemerosaleatorios cuyo intervalo (miacutenimo y maacuteximo) se indica como paraacutemetro

2 filaDeArrayBiInt Devuelve la fila i-eacutesima del array que se pasa comoparaacutemetro

3 columnaDeArrayBiInt Devuelve la columna j-eacutesima del array que sepasa como paraacutemetro

4 coordenadasEnArrayBiInt Devuelve la fila y la columna (en un arraycon dos elementos) de la primera ocurrencia de un nuacutemero dentro de unarray bidimensional Si el nuacutemero no se encuentra en el array la funcioacutendevuelve el array -1 -1

5 esPuntoDeSilla Dice si un nuacutemero es o no punto de silla es decirmiacutenimo en su fila y maacuteximo en su columna

6 diagonal Devuelve un array que contiene una de las diagonales delarray bidimensional que se pasa como paraacutemetro Se pasan comoparaacutemetros fila columna y direccioacuten La fila y la columna determinanel nuacutemero que marcaraacute las dos posibles diagonales dentro del array Ladireccioacuten es una cadena de caracteres que puede ser ldquonoserdquo o ldquonesordquo Lacadena ldquonoserdquo indica que se elige la diagonal que va del noroeste haciael sureste mientras que la cadena ldquonesordquo indica que se elige la diagonalque va del noreste hacia el suroeste

9 Programacioacuten orientada a objetos

91 Clases y objetos

La programacioacuten orientada a objetos es un paradigma de programacioacuten que se basacomo su nombre indica en la utilizacioacuten de objetos Estos objetos tambieacuten se suelenllamar instanciasUn objeto en teacuterminos de POO no se diferencia mucho de lo que conocemos comoun objeto en la vida real Pensemos por ejemplo en un coche Nuestro coche seriacuteaun objeto concreto de la vida real igual que el coche del vecino o el coche de uncompantildeero de trabajo o un deportivo que vimos por la calle el fin de semana pasadohellipTodos esos coches son objetos concretos que podemos ver y tocarTanto mi coche como el coche del vecino tienen algo en comuacuten ambos son cochesEn este caso mi coche y el coche del vecino seriacutean instancias (objetos) y coche (asecas) seriacutea una clase La palabra coche define algo geneacuterico es una abstraccioacutenno es un coche concreto sino que hace referencia a unos elementos que tienen unaserie de propiedades como matriacutecula marca modelo color etc este conjunto depropiedades se denominan atributos o variables de instancia

ClaseConcepto abstracto que denota una serie de cualidades por ejemplo cocheInstanciaObjeto palpable que se deriva de la concrecioacuten de una clase por ejemplo micocheAtributosConjunto de caracteriacutesticas que comparten los objetos de una clase porejemplo para la clase coche tendriacuteamos matriacutecula marca modelo color ynuacutemero de plazas

En Java los nombres de las clases se escriben con la primera letra en mayuacutesculamientras que los nombres de las instancias comienzan con una letra en minuacutesculaPor ejemplo la clase coche se escribe en Java como Coche y el objeto ldquomi cocherdquo sepodriacutea escribir como miCocheDefiniremos cada clase en un fichero con el mismo nombre maacutes la extensioacuten java portanto la definicioacuten de la clase Coche debe estar contenida en un fichero con nombreCochejava

Vamos a definir a continuacioacuten la clase Libro con los atributos isbn autor titulo ynumeroPaginas

95

Programacioacuten orientada a objetos 96

Librojava Definicioacuten de la clase Libro author Luis Joseacute Saacutenchez

public class Libro

atributosString isbn

String titulo

String autor

int numeroPaginas

A continuacioacuten creamos varios objetos de esta clase

PruebaLibrojava Programa que prueba la clase Libro author Luis Joseacute Saacutenchez

public class PruebaLibro

public static void main(String[] args)

Libro lib = new Libro()

Libro miLibrito = new Libro()

Libro quijote = new Libro()

Hemos creado tres instancias de la clase libro lib miLibrito y quijote Ya sabemos definiruna clase indicando sus atributos y crear instancias

Las variables de instancia (atributos) determinan las cualidades de losobjetos

92 Encapsulamiento y ocultacioacuten

Uno de los pilares en los que se basa la Programacioacuten Orientada a Objetos es elencapsulamiento Baacutesicamente el encapsulamiento consiste en definir todas las

Programacioacuten orientada a objetos 97

propiedades y el comportamiento de una clase dentro de esa clase es decir en laclase Coche estaraacute definido todo lo concerniente a la clase Coche y en la clase Libro

estaraacute definido todo lo que tenga que ver con la clase LibroEl encapsulamiento parece algo obvio casi de perogrullo pero hay que tenerlosiempre muy presente al programar utilizando clases y objetos En alguna ocasioacutenpuede que estemos tentados a mezclar parte de una clase con otra clase distintapara resolver un problema puntual No hay que caer en esa trampa Se deben escribirlos programas de forma que cada cosa esteacute en su sitio Sobre todo al principiocuando definimos nuestras primeras clases debemos estar pendientes de que todoestaacute definido donde correspondeLa ocultacioacuten es una teacutecnica que incorporan algunos lenguajes (entre ellos Java) quepermite esconder los elementos que definen una clase de tal forma que desde otraclase distinta no se pueden ldquover las tripasrdquo de la primera La ocultacioacuten facilita comoveremos maacutes adelante el encapsulamiento

93 Meacutetodos

Un coche arranca para se aparca hace sonar el claxon se puede llevar a repararhellipUn gato puede comer dormir maullar ronronearhellipLas acciones asociadas a una clase se llaman meacutetodos Estos meacutetodos se definendentro del cuerpo de la clase y se suelen colocar a continuacioacuten de los atributos

Los meacutetodos determinan el comportamiento de los objetos

931 Creiacute haber visto un lindo gatito

Vamos a crear la clase GatoSimple La llamamos asiacute porque maacutes adelante crearemos otraclase algo maacutes elaborada que se llamaraacute Gato Para saber queacute atributos debe tener estaclase hay que preguntarse queacute caracteriacutesticas tienen los gatos Todos los gatos son deun color determinado pertenecen a una raza tienen una edad tienen un determinadosexo - son machos o hembras - y tienen un peso que se puede expresar en kilogramosEacutestos seraacuten por tanto los atributos que tendraacute la clase GatoSimplePara saber queacute metodos debemos implementar hay que preguntarse queacute accionesestaacuten asociadas a los gatos Bien pues los gatos maullan ronronean comen y si sonmachos se pelean entre ellos para disputarse el favor de las hembras Esos seraacuten losmeacutetodos que definamos en la clase

Programacioacuten orientada a objetos 98

GatoSimplejava Definicioacuten de la clase GatoSimple author Luis Joseacute Saacutenchez

public class GatoSimple

atributos

String color raza sexo

int edad

double peso

meacutetodos

constructorGatoSimple (String s)

thissexo = s

getterString getSexo()

return thissexo

Hace que el gato maulle

void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute

Programacioacuten orientada a objetos 99

param comida la comida que se le ofrece al gato

void come(String comida)

if (comidaequals(pescado))

Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Pone a pelear dos gatos Solo se van a pelear dos machos entre siacute param contrincante es el gato contra el que pelear

void peleaCon(GatoSimple contrincante)

if (thissexoequals(hembra))

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo()equals(hembra))

Systemoutprintln(no peleo contra gatitas)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

ConstructorEl meacutetodo constructor tiene siempre el mismo nombre que la clase y se utilizanormalmente para inicializar los atributos

Los atributos de la clase GatoSimple - color raza sexo edad y peso - se declaran igual quelas variables que hemos venido usando hasta ahora pero hay una gran diferenciaentre estos atributos y las variables que aparecen en el main (programa principal) Unavariable definida en el cuerpo del programa principal es uacutenica sin embargo cada unode los objetos que se crean en el programa principal tienen sus propios atributos esdecir si en el programa principal se crean 20 objetos de la clase GatoSimple cada unotiene sus valores para los atributos color raza etcFiacutejate en la cabecera del meacutetodo peleaCon

Programacioacuten orientada a objetos 100

void peleaCon(GatoSimple contrincante)

Como puedes comprobar es posible pasar un objeto como paraacutemetro A continuacioacutense muestra un programa que prueba la clase GatoSimple Te recomiendo seguir elprograma liacutenea a liacutenea y observar atentamente la salida que produce

PruebaGatoSimplejava Programa que prueba la clase GatoSimple author Luis Joseacute Saacutenchez

public class PruebaGatoSimple

public static void main(String[] args)

GatoSimple garfield = new GatoSimple(macho)

Systemoutprintln(hola gatito)

garfieldmaulla()

Systemoutprintln(toma tarta)

garfieldcome(tarta selva negra)

Systemoutprintln(toma pescado a ver si esto te gusta)

garfieldcome(pescado)

GatoSimple tom = new GatoSimple(macho)

Systemoutprintln(Tom toma sopita de verduras)

tomcome(sopa de verduras)

GatoSimple lisa = new GatoSimple(hembra)

Systemoutprintln(gatitos a ver coacutemo maullaacuteis)

garfieldmaulla()

tommaulla()

lisamaulla()

garfieldpeleaCon(lisa)

lisapeleaCon(tom)

tompeleaCon(garfield)

Observa coacutemo al crear una instancia se llama al constructor que como deciacuteamos antestiene el mismo nombre de la clase y sirve para inicializar los atributos En este casose inicializa el atributo sexo Maacutes adelante veremos constructores que inicializan variosatributos e incluso definiremos distintos constructores en la misma clase

Programacioacuten orientada a objetos 101

GatoSimple garfield = new GatoSimple(macho)

Como puedes ver hay meacutetodos que no toman ninguacuten paraacutemetro

garfieldmaulla()

Y hay otros meacutetodos que deben tomar paraacutemetros obligatoriamente

garfieldcome(tarta selva negra)

932 Meacutetodos getter y setter

Vamos a crear la clase Cubo Para saber queacute atributos se deben definir nos preguntamosqueacute caracteriacutesticas tienen los cubos - igual que hicimos con la clase GatoSimple Todos loscubos tienen una determinada capacidad un color estaacuten hechos de un determinadomaterial - plaacutestico latoacuten etc - y puede que tengan asa o puede que no Un cubo sefabrica con el propoacutesito de contener liacutequido por tanto otra caracteriacutestica es la cantidadde litros de liacutequido que contiene en un momento determinado Por ahora solo nosinteresa saber la capacidad maacutexima y los litros que contiene el cubo en cada momentoasiacute que esos seraacuten los atributos que tendremos en cuenta

Cubojava Definicioacuten de la clase Cubo author Luis Joseacute Saacutenchez

public class Cubo

atributos

int capacidad capacidad maacutexima en litrosint contenido contenido actual en litros

meacutetodos

constructorCubo (int c)

thiscapacidad = c

meacutetodos getterint getCapacidad()

return thiscapacidad

Programacioacuten orientada a objetos 102

int getContenido()

return thiscontenido

meacutetodo settervoid setContenido(int litros)

thiscontenido = litros

otros meacutetodosvoid vacia()

thiscontenido = 0

Llena el cubo al maacuteximo de su capacidad

void llena()

thiscontenido = thiscapacidad

Pinta el cubo en la pantalla Se muestran los bordes del cubo con el caraacutecter y el agua que contiene con el caraacutecter ~

void pinta()

for (int nivel = thiscapacidad nivel gt 0 nivel--)

if (thiscontenido gt= nivel)

Systemoutprintln(~~~~)

else

Systemoutprintln( )

Systemoutprintln()

Vuelca el contenido de un cubo sobre otro Antes de echar el agua se comprueba cuaacutento le cabe al cubo destino

void vuelcaEn(Cubo destino)

Programacioacuten orientada a objetos 103

int libres = destinogetCapacidad() - destinogetContenido()

if (libres gt 0)

if (thiscontenido lt= libres)

destinosetContenido(destinogetContenido() + thiscontenido)thisvacia()

else

thiscontenido -= libres

destinollena()

Observa estos meacutetodos extraiacutedos de la clase Cubo

int getCapacidad()

return thiscapacidad

int getContenido()

return thiscontenido

Se trata de meacutetodos muy simples su cometido es devolver el valor de un atributoPodriacutean tener cualquier nombre pero en Java es costumbre llamarlos con la palabraget (obtener) seguida del nombre del atributoFijeacutemonos ahora este otro meacutetodo

void setContenido(int litros)

thiscontenido = litros

Ahora estamos ante un setter Este tipo de meacutetodos tiene el cometido de establecerun valor para un determinado atributo Como puedes ver setContenido estaacute formadapor set (asignar) maacutes el nombre del atributoPodriacuteas preguntarte iquestpor queacute se crea un meacutetodo getter para extraer el valor de unavariable y no se accede a la variable directamenteParece maacutes loacutegico hacer esto

Systemoutprint(miCubocapacidad)

que esto otro

Programacioacuten orientada a objetos 104

Systemoutprint(miCubogetCapacidad())

Sin embargo en Java se opta casi siempre por esta uacuteltima opcioacuten Tiene su explicacioacuteny lo entenderaacutes bien cuando estudies el apartado Aacutembitovisibilidad de los elementosde una clase - public protected y privateProbamos con el siguiente ejemplo la clase Cubo que acabamos de definir Crea tuspropios cubos pasa agua de unos a otros y observa lo que se muestra por pantalla

PruebaCubojava Programa que prueba la clase Cubo author Luis Joseacute Saacutenchez

public class PruebaCubo

public static void main(String[] args)

Cubo cubito = new Cubo(2)

Cubo cubote = new Cubo(7)

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

Systemoutprintln(nLleno el cubito n)

cubitollena()

cubitopinta()

Systemoutprintln(nEl cubote sigue vaciacuteo n)

cubotepinta()

Systemoutprintln(nAhora vuelco lo que tiene el cubito en el cuboten)

cubitovuelcaEn(cubote)

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

Systemoutprintln(nAhora vuelco lo que tiene el cubote en el cubiton)

cubotevuelcaEn(cubito)

Programacioacuten orientada a objetos 105

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

933 Meacutetodo toString

La definicioacuten de la clase Cubo del apartado anterior contiene el meacutetodo pinta que comosu nombre indica permite pintar en pantalla un objeto de esa clase Se podriacutea definirel meacutetodo ficha para mostrar informacioacuten sobre objetos de la clase Alumno por ejemploTambieacuten seriacutea posible implementar el meacutetodo imprime dentro de la clase Libro con elpropoacutesito de mostrar por pantalla los datos de un libro Todos estos meacutetodos - pintaficha e imprime - hacen baacutesicamente lo mismoEn Java existe una solucioacuten muy elegante para mostrar informacioacuten sobre un objetopor pantalla Si se quiere mostrar el contenido de la variable entera x se utilizaSystemoutprint(x) y si se quiere mostrar el valor de la variable de tipo cadena decaracteres nombre se escribe Systemoutprint(nombre) De la misma manera si se quieremostrar el objeto miPiramide que pertenece a la clase Piramide tambieacuten se podriacutea usarSystemoutprint(miPiramide) Java sabe perfectamente coacutemo mostrar nuacutemeros y cadenasde caracteres pero no sabe a priori coacutemo se pintan piraacutemides Para indicar a Java coacutemodebe pintar un objeto de la clase Piramide basta con implementar el meacutetodo toString

dentro de la claseVeamos un ejemplo muy sencillo de implementacioacuten de toString Definiremos la claseCuadrado con el atributo lado el constructor y el meacutetodo toString

Cuadradojava Definicioacuten de la clase Cuadrado author Luis Joseacute Saacutenchez

public class Cuadrado

int lado

public Cuadrado(int l)

thislado = l

public String toString()

Programacioacuten orientada a objetos 106

int i espacios

String resultado =

for (i = 0 i lt thislado i++)

resultado +=

resultado += n

for (i = 1 i lt thislado - 1 i++)

resultado +=

for (espacios = 1 espacios lt thislado - 1 espacios++)

resultado +=

resultado += n

for (i = 0 i lt thislado i++)

resultado +=

resultado += n

return resultado

Observa que el meacutetodo toString() devuelve una cadena de caracteres Esa cadena esprecisamente la que mostraraacute por pantalla Systemoutprint() En el programa que semuestra a continuacioacuten y que prueba la clase Cuadrado puedes comprobar que se pintaun cuadrado igual que si se tratara de cualquier otra variable

PruebaCuadradojava Programa que prueba la clase Cuadrado author Luis Joseacute Saacutenchez

public class PruebaCuadrado

public static void main(String[] args)

Cuadrado miCuadradito = new Cuadrado(5)

Systemoutprintln(miCuadradito)

Programacioacuten orientada a objetos 107

94 Aacutembitovisibilidad de los elementos de una clase - publicprotected y private

Al definir los elementos de una clase se pueden especificar sus aacutembitos (scope) devisibilidad o accesibilidad Un elemento public (puacuteblico) es visible desde cualquierclase un elemento protected (protegido) es visible desde la clase actual y desde todassus subclases y finalmente un elemento private (privado) uacutenicamente es visible dentrode la clase actualEn el siguiente apartado veremos queacute son las subclases De momento fiacutejate en elaacutembito del atributo y de los meacutetodos en la definicioacuten de la clase Animal

Animaljava Definicioacuten de la clase Animal author Luis Joseacute Saacutenchez

public abstract class Animal

private Sexo sexo

public Animal ()

sexo = SexoMACHO

public Animal (Sexo s)

sexo = s

public Sexo getSexo()

return sexo

public String toString()

return Sexo + thissexo + n

Hace que el animal se eche a dormir

public void duerme()

Systemoutprintln(Zzzzzzz)

Programacioacuten orientada a objetos 108

Fiacutejate que el atributo sexo se ha definido como private

private Sexo sexo

Eso quiere decir que a ese atributo uacutenicamente se tiene acceso dentro de la claseAnimal Sin embargo todos los meacutetodos se han definido public lo que significa quese podraacuten utilizar desde cualquier otro programa por ejemplo como veremos maacutesadelante desde el programa PurebaAnimaljava

Salvo casos puntuales se seguiraacute la regla de declarar private las variables deinstancia y public los meacutetodos

El sexo de un animal solo puede ser macho hembra o hermafrodita Una forma dedelimitar los valores que puede tomar un atributo es definir un tipo enumerado

Tipo enumeradoMediante enum se puede definir un tipo enumerado de esta forma un atributosolo podraacute tener uno de los posibles valores que se dan como opcioacuten Losvalores que se especifican en el tipo enumerado se suelen escribir con todaslas letras en mayuacutescula

Sexojava Definicioacuten del tipo enumerado Sexo author Luis Joseacute Saacutenchez

public enum Sexo

MACHO HEMBRA HERMAFRODITA

95 Herencia

La herencia es una de las caracteriacutesticas maacutes importantes de la POO Si definimosuna serie de atributos y meacutetodos para una clase al crear una subclase todos estosatributos y meacutetodos siguen siendo vaacutelidosEn el apartado anterior se define la clase Animal Uno de los meacutetodos de esta clase esduerme A continuacioacuten podemos crear las clases Gato y Perro como subclases de AnimalDe forma automaacutetica se puede utilizar el meacutetodo duerme con las instancias de las clasesGato y Perro iquestno es fantaacutestico

Programacioacuten orientada a objetos 109

La clase Ave es subclase de Animal y la clase Pinguino a su vez seriacutea subclase de Ave ypor tanto hereda todos sus atributos y meacutetodos

Clase abstracta (abstract)Una clase abstracta es aquella que no va a tener instancias de forma directaaunque siacute habraacute instancias de las subclases (siempre que esas subclasesno sean tambieacuten abstractas) Por ejemplo si se define la clase Animal comoabstracta no se podraacuten crear objetos de la clase Animal es decir no se podraacutehacer Animal mascota = new Animal() pero siacute se podraacuten crear instancias de la claseGato Ave o Pinguino que son subclases de Animal

Para crear en Java una subclase de otra clase existente se utiliza la palabra reservadaextends A continuacioacuten se muestra el coacutedigo de las clases Gato Ave y Pinguino asiacutecomo el programa que prueba estas clases creando instancias y aplicaacutendoles meacutetodosRecuerda que la definicioacuten de la clase Animal se muestra en el apartado anterior

Gatojava Definicioacuten de la clase Gato author Luis Joseacute Saacutenchez

public class Gato extends Animal

private String raza

public Gato (Sexo s String r)

super(s)raza = r

public Gato (Sexo s)

super(s)raza = siameacutes

public Gato (String r)

super(SexoHEMBRA)raza = r

public Gato ()

super(SexoHEMBRA)

Programacioacuten orientada a objetos 110

raza = siameacutes

public String toString()

return supertoString()+ Raza + thisraza+ nn

Hace que el gato maulle

public void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

public void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al gato

public void come(String comida)

if (comidaequals(pescado))

Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Pone a pelear dos gatos Solo se van a pelear dos machos entre siacute param contrincante es el gato contra el que pelear

public void peleaCon(Gato contrincante)

Programacioacuten orientada a objetos 111

if (thisgetSexo() == SexoHEMBRA)

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo() == SexoHEMBRA)

Systemoutprintln(no peleo contra gatitas)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

Observa que se definen nada menos que cuatro constructores en la clase Gato Desdeel programa principal se dilucida cuaacutel de ellos se utiliza en funcioacuten del nuacutemero y tipode paraacutemetros que se pasa al meacutetodo Por ejemplo si desde el programa principal secrea un gato de esta forma

Gato gati = new Gato()

entonces se llamariacutea al constructor definido como

public Gato ()

super(SexoHEMBRA)raza = siameacutes

Por tanto gati seriacutea una gata de raza siameacutes Si por el contrario creamos gati de estaotra manera desde el programa principal

Gato gati = new Gato(SexoMACHO siberiano)

se llamariacutea al siguiente constructor

public Gato (Sexo s String r)

super(s)raza = r

y gati seriacutea en este caso un gato macho de raza siberianoEl meacutetodo super() hace una llamada al meacutetodo equivalente de la superclase Fiacutejate quese utiliza tanto en el constructor como en el meacutetodo toString() Por ejemplo al llamara super() dentro del meacutetodo toString() se estaacute llamando al toString() que hay definidoen la clase Animal justo un nivel por encima de Gato en la jerarquiacutea de clasesA continuacioacuten tenemos la definicioacuten de la clase Ave que es una subclase de Animal

Programacioacuten orientada a objetos 112

Avejava Definicioacuten de la clase Ave author Luis Joseacute Saacutenchez

public class Ave extends Animal

public Ave(Sexo s)

super(s)

public Ave()

super()

Hace que el ave se limpie

public void aseate()

Systemoutprintln(Me estoy limpiando las plumas)

Hace que el ave levante el vuelo

public void vuela()

Systemoutprintln(Estoy volando)

951 Sobrecarga de meacutetodos

Un meacutetodo se puede redefinir (volver a definir con el mismo nombre) en una subclasePor ejemplo el meacutetodo vuela que estaacute definido en la clase Ave se vuelve a definir enla clase Pinguino En estos casos indicaremos nuestra intencioacuten de sobreescribir unmeacutetodo mediante la etiqueta OverrideSi no escribimos esta etiqueta la sobreescritura del meacutetodo se realizaraacute de todasformas ya que Override indica simplemente una intencioacuten Ahora imagina que quieressobreescribir el meacutetodo come de Animal declarando un come especiacutefico para los gatos enla clase Gato Si escribes Override y luego te equivocas en el nombre del meacutetodo yescribes comer entonces el compilador diriacutea algo como ldquoiexclCuidado algo no estaacute bienme has dicho que ibas a sobreescribir un meacutetodo de la superclase y sin embargo comer

no estaacute definidordquoA continuacioacuten tienes la definicioacuten de la clase Pinguino

Programacioacuten orientada a objetos 113

Pinguinojava Definicioacuten de la clase Pinguino author Luis Joseacute Saacutenchez

public class Pinguino extends Ave

public Pinguino()

super()

public Pinguino(Sexo s)

super(s)

El pinguumlino se siente triste porque no puede volar

Override

public void vuela()

Systemoutprintln(No puedo volar)

Con el siguiente programa se prueba la clase Animal y todas las subclases que derivande ella Observa cada liacutenea y comprueba queacute hace el programa

PruebaAnimaljava Programa que prueba la clase Animal y sus subclases author Luis Joseacute Saacutenchez

public class PruebaAnimal

public static void main(String[] args)

Gato garfield = new Gato(SexoMACHO romano)

Gato tom = new Gato(SexoMACHO)

Gato lisa = new Gato(SexoHEMBRA)

Gato silvestre = new Gato()

Systemoutprintln(garfield)

Systemoutprintln(tom)

Systemoutprintln(lisa)

Programacioacuten orientada a objetos 114

Systemoutprintln(silvestre)

Ave miLoro = new Ave()

miLoroaseate()

miLorovuela()

Pinguino pingu = new Pinguino(SexoHEMBRA)

pinguaseate()

pinguvuela()

En el ejemplo anterior los objetos miLoro y pingu actuacutean de manera polimoacuterfica porquea ambos se les aplican los meacutetodos aseate y vuela

PolimorfismoEn Programacioacuten Orientada a Objetos se llama polimorfismo a la capacidadque tienen los objetos de distinto tipo (de distintas clases) de responder almismo meacutetodo

96 Atributos y meacutetodos de clase (static)

Hasta el momento hemos definido atributos de instancia como raza sexo o color ymeacutetodos de instancia como maulla come o vuela De tal modo que si en el programa secrean 20 gatos cada uno de ellos tiene su propia raza y puede haber potencialmente20 razas diferentes Tambieacuten podriacutea aplicar el meacutetodo maulla a todos y cada uno deesos 20 gatosNo obstante en determinadas ocasiones nos puede interesar tener atributos de clase(variables de clase) y meacutetodos de clase Cuando se define una variable de clase soloexiste una copia del atributo para toda la clase y no una para cada objeto Esto es uacutetilcuando se quiere llevar la cuenta global de alguacuten paraacutemetro Los meacutetodos de clase seaplican a la clase y no a instancias concretasA continuacioacuten se muestra un ejemplo que contiene la variable de clase kilometra-

jeTotal Si bien cada coche tiene un atributo kilometraje donde se van acumulando loskiloacutemetros que va recorriendo en la variable de clase kilometrajeTotal se lleva la cuentade los kiloacutemetros que han recorrido todos los coches que se han creadoTambieacuten se crea un meacutetodo de clase llamado getKilometrajeTotal que simplemente esun getter para la variable de clase kilometrajeTotal

Programacioacuten orientada a objetos 115

Cochejava Definicioacuten de la clase Coche author Luis Joseacute Saacutenchez

public class Coche

atributo de claseprivate static int kilometrajeTotal = 0

meacutetodo de clasepublic static int getKilometrajeTotal()

return kilometrajeTotal

private String marca

private String modelo

private int kilometraje

public Coche(String ma String mo)

marca = ma

modelo = mo

kilometraje = 0

public int getKilometraje()

return kilometraje

Recorre una determinada distancia param km distancia a recorrer en kiloacutemetros

public void recorre(int km)

kilometraje += km

kilometrajeTotal += km

Como ya hemos comentado el atributo kilometrajeTotal almacena el nuacutemero total dekiloacutemetros que recorren todos los objetos de la clase Coche es un uacutenico valor por esose declara como static Por el contrario el atributo kilometraje almacena los kiloacutemetrosrecorridos por un objeto concreto y tendraacute un valor distinto para cada uno de ellos

Programacioacuten orientada a objetos 116

Si en el programa principal se crean 20 objetos de la clase Coche cada uno tendraacute supropio kilometrajeA continuacioacuten se muestra el programa que prueba la clase Coche

PruebaCochejava Programa que prueba la clase Coche author Luis Joseacute Saacutenchez

public class PruebaCoche

public static void main(String[] args)

Coche cocheDeLuis = new Coche(Saab 93)

Coche cocheDeJuan = new Coche(Toyota Avensis)

cocheDeLuisrecorre(30)

cocheDeLuisrecorre(40)

cocheDeLuisrecorre(220)

cocheDeJuanrecorre(60)

cocheDeJuanrecorre(150)

cocheDeJuanrecorre(90)

Systemoutprintln(El coche de Luis ha recorrido + cocheDeLuisgetKilometraje() +

Km)

Systemoutprintln(El coche de Juan ha recorrido + cocheDeJuangetKilometraje() +

Km)

Systemoutprintln(El kilometraje total ha sido de + CochegetKilometrajeTotal() +

Km)

El meacutetodo getKilometrajeTotal() se aplica a la clase Coche por tratarse de un meacutetodo declase (meacutetodo static) Este meacutetodo no se podriacutea aplicar a una instancia de la mismamanera que un meacutetodo que no sea static no se puede aplicar a la clase sino a losobjetos

97 Interfaces

Una interfaz contiene uacutenicamente la cabecera de una serie de meacutetodos (opcional-mente tambieacuten puede contener constantes) Por tanto se encarga de especificar uncomportamiento que luego tendraacute que ser implementado La interfaz no especificael ldquocoacutemordquo ya que no contiene el cuerpo de los meacutetodos solo el ldquoqueacuterdquoUna interfaz puede ser uacutetil en determinadas circunstancias En principio separala definicioacuten de la implementacioacuten o como deciacuteamos antes el ldquoqueacuterdquo del ldquocoacutemordquo

Programacioacuten orientada a objetos 117

Tendremos entonces la menos dos ficheros la interfaz y la clase que implementaesa interfaz Se puede dar el caso que un programador escriba la interfaz y luegose la pase a otro programador para que sea eacuteste uacuteltimo quien la implementeHay que destacar que cada interfaz puede tener varias implementaciones asociadasPara ilustrar el uso de interfaces utilizaremos algunas clases ya conocidas La super-clase que va a estar por encima de todas las demaacutes seraacute la clase Animal vista conanterioridad El coacutedigo de esta clase no variacutea por lo tanto no lo vamos a reproduciraquiacute de nuevoDefinimos la interfaz Mascota

Mascotajava Definicioacuten de la interfaz Mascota author Luis Joseacute Saacutenchez

public interface Mascota

String getCodigo()

void hazRuido()

void come(String comida)

void peleaCon(Animal contrincante)

Como puedes ver uacutenicamente se escriben las cabeceras de los meacutetodos que debetener las clases que implementen la interfaz MascotaUna de las implementaciones de Mascota seraacute Gato

Gatojava Definicioacuten de la clase Gato author Luis Joseacute Saacutenchez

public class Gato extends Animal implements Mascota

private String codigo

public Gato (Sexo s String c)

super(s)thiscodigo = c

Override

Programacioacuten orientada a objetos 118

public String getCodigo()

return thiscodigo

Hace que el gato emita sonidos

Override

public void hazRuido()

thismaulla()thisronronea()

Hace que el gato maulle

public void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

public void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al gato

Override

public void come(String comida)

if (comidaequals(pescado))

supercome()Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Programacioacuten orientada a objetos 119

Pone a pelear al gato contra otro animal Solo se van a pelear dos machos entre siacute param contrincante es el animal contra el que pelear

Override

public void peleaCon(Animal contrincante)

if (thisgetSexo() == SexoHEMBRA)

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo() == SexoHEMBRA)

Systemoutprintln(no peleo contra hembras)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

Mediante la siguiente liacutenea

public class Gato extends Animal implements Mascota

estamos diciendo que Gato es una subclase de Animal y que ademaacutes es una im-plementacioacuten de la interfaz Mascota Fiacutejate que no es lo mismo la herencia que laimplementacioacutenObserva que los meacutetodos que se indicaban en Mascota uacutenicamente con la cabeceraahora estaacuten implementados completamente en Gato Ademaacutes Gato contiene otrosmeacutetodos que no se indicaban en Mascota como maulla y ronroneaLos meacutetodos de Gato que implementan meacutetodos especificados en Mascota deben tenerla anotacioacuten OverrideComo dijimos anteriormente una interfaz puede tener varias implementaciones Acontinuacioacuten se muestra Perro otra implementacioacuten de Mascota

Programacioacuten orientada a objetos 120

Perrojava Definicioacuten de la clase Perro author Luis Joseacute Saacutenchez

public class Perro extends Animal implements Mascota

private String codigo

public Perro (Sexo s String c)

super(s)thiscodigo = c

Override

public String getCodigo()

return thiscodigo

Hace que el Perro emita sonidos

Override

public void hazRuido()

thisladra()

Hace que el Perro ladre

public void ladra()

Systemoutprintln(Guau guau)

Hace que el Perro coma A los Perros les gusta la carne si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al Perro

Override

public void come(String comida)

if (comidaequals(carne))

Programacioacuten orientada a objetos 121

supercome()Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como carne)

Pone a pelear el perro contra otro animal Solo se van a pelear si los dos son perros param contrincante es el animal contra el que pelear

Override

public void peleaCon(Animal contrincante)

if (contrincantegetClass()getSimpleName()equals(Perro))

Systemoutprintln(ven aquiacute que te vas a enterar)

else

Systemoutprintln(no me gusta pelear)

Por uacuteltimo mostramos el programa que prueba Mascota y sus implementaciones Gato yPerro

PruebaMascotajava Programa que prueba la interfaz Mascota author Luis Joseacute Saacutenchez

public class PruebaMascota

public static void main(String[] args)

Mascota garfield = new Gato(SexoMACHO 34569)

Mascota lisa = new Gato(SexoHEMBRA 96059)

Mascota kuki = new Perro(SexoHEMBRA 234678)

Mascota ayo = new Perro(SexoMACHO 778950)

Systemoutprintln(garfieldgetCodigo())

Systemoutprintln(lisagetCodigo())

Systemoutprintln(kukigetCodigo())

Systemoutprintln(ayogetCodigo())

garfieldcome(pescado)

Programacioacuten orientada a objetos 122

lisacome(hamburguesa)

kukicome(pescado)

lisapeleaCon((Gato)garfield)

ayopeleaCon((Perro)kuki)

Observa que para crear una mascota que es un gato escribimos lo siguiente

Mascota garfield = new Gato(SexoMACHO 34569)

Una interfaz no se puede instanciar por tanto la siguiente liacutenea seriacutea incorrecta

Mascota garfield = new Mascota(SexoMACHO 34569)

InterfacesLa interfaz indica ldquoqueacuterdquo hay que hacer y la implementacioacuten especifica ldquocoacutemordquose haceUna interfaz puede tener varias implementacionesUna interfaz no se puede instanciarLa implementacioacuten puede contener meacutetodos adicionales cuyas cabeceras noestaacuten en su interfaz

98 Arrays de objetos

Del mismo modo que se pueden crear arrays de nuacutemeros enteros decimales o cadenasde caracteres tambieacuten es posible crear arrays de objetosVamos a definir la clase Alumnopara luego crear un array de objetos de esta clase

Alumnojava Definicioacuten de la clase Alumno author Luis Joseacute Saacutenchez

public class Alumno

private String nombre

private double notaMedia = 00

public String getNombre()

Programacioacuten orientada a objetos 123

return nombre

public void setNombre(String nombre)

thisnombre = nombre

public double getNotaMedia()

return notaMedia

public void setNotaMedia(double notaMedia)

thisnotaMedia = notaMedia

A continuacioacuten se define un array de cinco alumnos que posteriormente se rellena Poruacuteltimo se muestran los datos de los alumnos por pantallaObserva que la siguiente liacutenea uacutenicamente define la estructura del array pero no crealos objetos

Alumno[] alum = new Alumno[5]

Cada objeto concreto se crea de forma individual mediante

alum[i] = new Alumno()

Aquiacute tienes el ejemplo completo

ArrayDeAlumnosPrincipaljava Programa que prueba un array de la clase Alumno author Luis Joseacute Saacutenchez

public class ArrayDeAlumnosPrincipal

public static void main(String[] args)

Define la estructura un array de 5 alumnos pero no crea los objetosAlumno[] alum = new Alumno[5]

Pide los datos de los alumnos

Programacioacuten orientada a objetos 124

Systemoutprintln(A continuacion debera introducir el nombre y la nota media de 5 al

umnos)

String nombreIntroducido

double notaIntroducida

for(int i = 0 i lt 5 i++)

alum[i] = new Alumno()

Systemoutprintln(Alumno + i)

Systemoutprint(Nombre )

nombreIntroducido = Systemconsole()readLine()

(alum[i])setNombre(nombreIntroducido)

Systemoutprint(Nota media )

notaIntroducida = DoubleparseDouble(Systemconsole()readLine())

alum[i]setNotaMedia(notaIntroducida)

for i

Muestra los datos de los alumnos

Systemoutprintln(Los datos introducidos son los siguientes)

double sumaDeMedias = 0

for(int i = 0 i lt 5 i++)

Systemoutprintln(Alumno + i)

Systemoutprintln(Nombre + alum[i]getNombre())

Systemoutprintln(Nota media + alum[i]getNotaMedia())

Systemoutprintln(----------------------------)

sumaDeMedias += alum[i]getNotaMedia()

for i

Systemoutprintln(La media global de la clase es + sumaDeMedias 5)

Veamos ahora un ejemplo algo maacutes complejo Se trata de una gestioacuten tiacutepica - altabaja listado y modificacioacuten - de una coleccioacuten de discos Este tipo de programas sesuele denominar CRUD (Create Read Update Delete)Primero se define la clase Disco

Programacioacuten orientada a objetos 125

Discojava Definicioacuten de la clase Disco author Luis Joseacute Saacutenchez

public class Disco

private String codigo = LIBRE

private String autor

private String titulo

private String genero

private int duracion duracioacuten total en minutos

public String getCodigo()

return codigo

public void setCodigo(String codigo)

thiscodigo = codigo

public String getAutor()

return autor

public void setAutor(String autor)

thisautor = autor

public String getGenero()

return genero

public void setGenero(String genero)

thisgenero = genero

public String getTitulo()

return titulo

public void setTitulo(String titulo)

thistitulo = titulo

Programacioacuten orientada a objetos 126

public int getDuracion()

return duracion

public void setDuracion(int duracion)

thisduracion = duracion

public String toString()

String cadena = n------------------------------------------

cadena += nCoacutedigo + thiscodigocadena += nAutor + thisautorcadena += nTiacutetulo + thistitulocadena += nGeacutenero + thisgenerocadena += nDuracioacuten + thisduracioncadena += n------------------------------------------

return cadena

A continuacioacuten se crea el programa principal Cada elemento de la coleccioacuten seraacuteun objeto de la clase Disco Se trata como veraacutes de una gestioacuten muy simple perototalmente funcionalNo se incluye en el manual porque ocupariacutea varias paacuteginas El coacutedigo del programa sepuede descargar desde el siguiente enlace httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos09_POOColeccionDeDiscosColeccionDeDiscosPrincipaljava

Programacioacuten orientada a objetos 127

99 Ejercicios

991 Conceptos de POO

Ejercicio 1iquestCuaacuteles seriacutean los atributos de la clase PilotoDeFormula1 iquestSe te ocurren algunasinstancias de esta clase

Ejercicio 2A continuacioacuten tienes una lista en la que estaacuten mezcladas varias clases coninstancias de esas clases Para ponerlo un poco maacutes difiacutecil todos los elementosestaacuten escritos en minuacutescula Di cuaacuteles son las clases cuaacuteles las instanciasa queacute clase pertenece cada una de estas instancias y cuaacutel es la jerarquiacuteaentre las clases paula goofy gardfiel perro mineral caballo tom silvestrepirita rocinante milu snoopy gato pluto animal javier bucefalo pegasoayudante_de_santa_claus cuarzo laika persona pato_lucas

Ejercicio 3iquestCuaacuteles seriacutean los atributos de la clase Vivienda iquestQueacute subclases se te ocurren

Ejercicio 4Piensa en la liga de baloncesto iquestqueacute 5 clases se te ocurren para representar5 elementos distintos que intervengan en la liga

Ejercicio 5Haz una lista con los atributos que podriacutea tener la clase caballo A continuacioacutenhaz una lista con los posibles meacutetodos (acciones asociadas a los caballos)

Ejercicio 6Lista los atributos de la clase Alumno iquestSeriacutea nombre uno de los atributos de laclase Razona tu respuesta

Ejercicio 7iquestCuaacuteles seriacutean los atributos de la clase Ventana (de ordenador) iquestcuaacuteles seriacuteanlos meacutetodos Piensa en las propiedades y en el comportamiento de unaventana de cualquier programa

Programacioacuten orientada a objetos 128

992 POO en Java

Ejercicio 1Implementa la clase Caballo vista en un ejercicio anterior Prueacutebala creandoinstancias y aplicaacutendole algunos meacutetodos

Ejercicio 2Crea la clase Vehiculo asiacute como las clases Bicicleta y Coche como subclases dela primera Para la clase Vehiculo crea los atributos de clase vehiculosCreadosykilometrosTotales asiacute como el atributo de instancia kilometrosRecorridos Creatambieacuten alguacuten meacutetodo especiacutefico para cada una de las subclases Prueba lasclases creadas mediante un programa con un menuacute como el que se muestraa continuacioacuten

VEHIacuteCULOS

=========

1 Anda con la bicicleta

2 Haz el caballito con la bicicleta

3 Anda con el coche

4 Quema rueda con el coche

5 Ver kilometraje de la bicicleta

6 Ver kilometraje del coche

7 Ver kilometraje total

8 Salir

Elige una opcioacuten (1-8)

Ejercicio 3Crea las clases Animal Mamifero Ave Gato Perro Canario Pinguino y Lagarto Creaal menos tres meacutetodos especiacuteficos de cada clase y redefne ellos meacutetodoscuando sea necesario Prueba las clases creadas en un programa en el que seinstancien objetos y se les apliquen meacutetodos

Ejercicio 4Crea la clase Fraccioacuten Los atributos seraacuten numerador y denominador Y algunos delos meacutetodos pueden ser invierte simplifica multiplica divide etc

Programacioacuten orientada a objetos 129

Ejercicio 5Crea la clase Pizza con los atributos y meacutetodos necesarios Sobre cada pizzase necesita saber el tamantildeo - mediana o familiar - el tipo - margarita cuatroquesos o funghi - y su estado - pedida o servida La clase debe almacenarinformacioacuten sobre el nuacutemero total de pizzas que se han pedido y que sehan servido Siempre que se crea una pizza nueva su estado es ldquopedidardquoEl siguiente coacutedigo del programa principal debe dar la salida que se muestra

public class PedidosPizza

public static void main(String[] args)

Pizza p1 = new Pizza(margarita mediana)

Pizza p2 = new Pizza(funghi familiar)

p2sirve()

Pizza p3 = new Pizza(cuatro quesos mediana)

Systemoutprintln(p1)

Systemoutprintln(p2)

Systemoutprintln(p3)

p2sirve()

Systemoutprintln(pedidas + PizzagetTotalPedidas())

Systemoutprintln(servidas + PizzagetTotalServidas())

pizza margarita mediana pedida

pizza funghi familiar servida

pizza cuatro quesos mediana pedida

esa pizza ya se ha servido

pedidas 3

servidas 1

Ejercicio 6Crea la clase Tiempo con los meacutetodos suma y resta Los objetos de la clase Tiempo

son intervalos de tiempo y se crean de la forma Tiempo t = new Tiempo(1 20

30) donde los paraacutemetros que se le pasan al constructor son las horas losminutos y los segundos respectivamente Crea el meacutetodo toString para ver losintervalos de tiempo de la forma 10h 35m 5s Si se suman por ejemplo 30m 40s y35m 20s el resultado deberiacutea ser 1h 6m 0s Realiza un programa de prueba paracomprobar que la clase funciona bien

Programacioacuten orientada a objetos 130

Ejercicio 7Queremos gestionar la venta de entradas (no numeradas) de ExpocochesCampanillas que tiene 3 zonas la sala principal con 1000 entradas dispo-nibles la zona de compra-venta con 200 entradas disponibles y la zona vipcon 25 entradas disponibles Hay que controlar que existen entradas antes devenderlasLa clase Zona con sus atributos y meacutetodos se muestra a continuacioacuten

Definicioacuten de la clase Zona author Luis Joseacute Saacutenchez

public class Zona

private int entradasPorVender

public Zona(int n)

entradasPorVender = n

public int getEntradasPorVender()

return entradasPorVender

Vende un nuacutemero de entradas ltpgt Comprueba si quedan entradas libres antes de realizar la venta param n nuacutemero de entradas a vender

public void vender(int n)

if (thisentradasPorVender == 0)

Systemoutprintln(Lo siento las entradas para esa zona estaacuten agotadas)

else if (thisentradasPorVender lt n)

Systemoutprintln(Soacutelo me quedan + thisentradasPorVender+ entradas para esa zona)

if (thisentradasPorVender gt= n)

entradasPorVender -= n

Systemoutprintln(Aquiacute tiene sus + n + entradas gracias)

El menuacute del programa debe ser el que se muestra a continuacioacuten Cuandoelegimos la opcioacuten 2 se nos debe preguntar para queacute zona queremos lasentradas y cuaacutentas queremos Loacutegicamente el programa debe controlar queno se puedan vender maacutes entradas de la cuenta

1 Mostrar nuacutemero de entradas libres

2 Vender entradas

3 Salir

Programacioacuten orientada a objetos 131

993 Arrays de objetos

Ejercicio 1Utiliza la clase Gato para crear un array de cuatro gatos e introduce los datosde cada uno de ellos mediante un bucle Muestra a continuacioacuten los datos detodos los gatos utilizando tambieacuten un bucle

Ejercicio 2Cambia el programa anterior de tal forma que los datos de los gatos se intro-duzcan directamente en el coacutedigo de la forma gatito[2]setColor(ldquomarroacutenrdquo) o bienmediante el constructor de la forma gatito[3] = new Gato(ldquoGarfieldrdquo ldquonaranjardquo

ldquomachordquo) Muestra a continuacioacuten los datos de todos los gatos utilizando unbucle

Ejercicio 3Realiza el programa ldquoColeccioacuten de discosrdquo por tu cuenta mirando lo menosposible el ejemplo que se proporciona Prueacutebalo primero para ver coacutemofunciona y luego intenta implementarlo tuacute mismo

Ejercicio 4Modifica el programa ldquoColeccioacuten de discosrdquo como se indica a continuacioacutena) Mejora la opcioacuten ldquoNuevo discordquo de tal forma que cuando se llenen todas lasposiciones del array el programa muestre un mensaje de error No se permitiraacuteintroducir los datos de ninguacuten disco hasta que no se borre alguno de la listab) Mejora la opcioacuten ldquoBorrarrdquo de tal forma que se verifique que el coacutedigointroducido por el usuario existec) Modifica el programa de tal forma que el coacutedigo del disco sea uacutenico es decirque no se pueda repetird) Crea un submenuacute dentro dentro de ldquoListadordquo de tal forma que exista unlistado completo un listado por autor (todos los discos que ha publicado undeterminado autor) un listado por geacutenero (todos los discos de un geacutenero de-terminado) y un listado de discos cuya duracioacuten esteacute en un rango determinadopor el usuario

Programacioacuten orientada a objetos 132

Ejercicio 5Crea el programa GESTISIMAL (GESTIoacuten SIMplificada de Almaceacuten) para llevarel control de los artiacuteculos de un almaceacuten De cada artiacuteculo se debe saberel coacutedigo la descripcioacuten el precio de compra el precio de venta y el stock(nuacutemero de unidades) El menuacute del programa debe tener al menos lassiguientes opciones

1 Listado

2 Alta

3 Baja

4 Modificacioacuten

5 Entrada de mercanciacutea

6 Salida de mercanciacutea

7 Salir

La entrada y salida de mercanciacutea supone respectivamente el incremento ydecremento de stock de un determinado artiacuteculo Hay que controlar que no sepueda sacar maacutes mercanciacutea de la que hay en el almaceacuten

10 Colecciones y diccionarios

101 Colecciones la clase ArrayList

Una coleccioacuten en Java es una estructura de datos que permite almacenar muchosvalores del mismo tipo por tanto conceptualmente es praacutecticamente igual que unarray Seguacuten el uso y seguacuten si se permiten o no repeticiones Java dispone de un ampliocataacutelogo de colecciones ArrayList (lista) ArrayBlockingQueue (cola) HashSet (conjunto)Stack (pila) etc En este manual estudiaremos la coleccioacuten ArrayListUn ArrayList es una estructura en forma de lista que permite almacenar elementos delmismo tipo (pueden ser incluso objetos) su tamantildeo va cambiando a medida que seantildeaden o se eliminan esos elementosNos podemos imaginar un ArrayList como un conjunto de celdas o cajoncitos donde seguardan los valores exactamente igual que un array convencional En la praacutectica seraacutemaacutes faacutecil trabajar con un ArrayListEn capiacutetulos anteriores hemos podido comprobar la utilidad del array es un recursoimprescindible que cualquier programador debe manejar con soltura No obstante elarray presenta algunos inconvenientes Uno de ellos es la necesidad de conocer eltamantildeo exacto en el momento de su creacioacuten Una coleccioacuten sin embargo se crea sinque se tenga que especificar el tamantildeo posteriormente se van antildeadiendo y quitandoelementos a medida que se necesitanTrabajando con arrays es frecuente cometer errores al utilizar los iacutendices por ejemploal intentar guardar un elemento en una posicioacuten que no existe (iacutendice fuera de rango)Aunque las colecciones permiten el uso de iacutendices no es necesario indicarlos siemprePor ejemplo en una coleccioacuten del tipo ArrayList cuando hay que antildeadir el elementoAmapola se puede hacer simplemente floresadd(Amapola) Al no especificar iacutendice elelemento Amapola se antildeadiriacutea justo al final de flores independientemente del tamantildeoy del nuacutemero de elementos que se hayan introducido yaLa clase ArrayList es muy similar a la clase Vector Eacutesta uacuteltima estaacute obsoleta y por tantono se recomienda su uso

1011 Principales meacutetodos de ArrayList

Las operaciones maacutes comunes que se pueden realizar con un objeto de la claseArrayList son las siguientes

add(elemento)Antildeade un elemento al final de la lista

133

Colecciones y diccionarios 134

add(indice elemento)Inserta un elemento en una posicioacuten determinada desplazando el resto deelementos hacia la derecha

clear()Elimina todos los elementos pero no borra la lista

contains(elemento)Devuelve true si la lista contiene el elemento que se especifica y false en casocontrario

get(indice)Devuelve el elemento de la posicioacuten que se indica entre pareacutentesis

indexOf(elemento)Devuelve la posicioacuten de la primera ocurrencia del elemento que se indica entrepareacutentesis

isEmpty()Devuelve true si la lista estaacute vaciacutea y false en caso de tener alguacuten elemento

remove(indice)Elimina el elemento que se encuentra en una posicioacuten determinada

remove(elemento)Elimina la primera ocurrencia de un elemento

set(indice elemento)Machaca el elemento que se encuentra en una determinada posicioacuten con elelemento que se pasa como paraacutemetro

size()Devuelve el tamantildeo (nuacutemero de elementos) de la lista

toArray()Devuelve un array con todos y cada uno de los elementos que contiene la lista

Puedes consultar todos los meacutetodos disponibles en la documentacioacuten oficial de la claseArrayList1

1httpdocsoraclecomjavase7docsapijavautilArrayListhtml

Colecciones y diccionarios 135

1012 Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de suselementos

A continuacioacuten se muestra un ejemplo en el que se puede ver coacutemo se declara unArrayList y coacutemo se insertan y se extraen elementos

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList01

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

Systemoutprintln(Nordm de elementos + asize())

aadd(rojo)

aadd(verde)

aadd(azul)

Systemoutprintln(Nordm de elementos + asize())

aadd(blanco)

Systemoutprintln(Nordm de elementos + asize())

Systemoutprintln(El elemento que hay en la posicioacuten 0 es + aget(0))

Systemoutprintln(El elemento que hay en la posicioacuten 3 es + aget(3))

Observa que al crear un objeto de la clase ArrayList hay que indicar el tipo de dato quese almacenaraacute en las celdas de esa lista Para ello se utilizan los caracteres lt y gt Nohay que olvidar los pareacutentesis del final

Es necesario importar la clase ArrayList para poder crear objetos de estaclase para ello debe aparecer al principio del programa la liacutenea import

javautilArrayList Algunos IDEs (por ej Netbeans) insertan esta liacutenea decoacutedigo de forma automaacutetica

En el siguiente ejemplo se muestra un ArrayList de nuacutemeros enteros

Colecciones y diccionarios 136

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList011

public static void main(String[] args)

ArrayListltIntegergt a = new ArrayListltIntegergt()

aadd(18)

aadd(22)

aadd(-30)

Systemoutprintln(Nordm de elementos + asize())

Systemoutprintln(El elemento que hay en la posicioacuten 1 es + aget(1))

Se define la estructura de la siguiente manera

ArrayListltIntegergt a = new ArrayListltIntegergt()

Fiacutejate que no se utiliza el tipo simple int sino el wrapper Integer Recuerda quelos wrapper son clases que engloban a los tipos simples y les antildeaden nuevasfuncionalidades (p ej permiten tratar a las variables numeacutericas como objetos) Elwrapper de int es Integer el de float es Float el de double es Double el de long es Longel de boolean es Boolean y el de char es CharacterEn el siguiente ejemplo podemos ver coacutemo extraer todos los elementos de una lista ala manera tradicional con un bulce for

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList02

Colecciones y diccionarios 137

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(int i=0 i lt asize() i++)

Systemoutprintln(aget(i))

Si estaacutes acostumbrado al for claacutesico habraacutes visto que es muy sencillo recorrer todoslos elementos del ArrayList No obstante al trabajar con colecciones es recomendableusar el for al estilo foreach como se muestra en el siguiente ejemplo Como puedes verla sintaxis es maacutes corta y no se necesita crear un iacutendice para recorrer la estructura

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList03

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(String color a)

Colecciones y diccionarios 138

Systemoutprintln(color)

Fiacutejate en estas liacuteneas

for(String color a)

Systemoutprintln(color)

El significado de este coacutedigo seriacutea el siguiente

for(String color a)

rarr Saca uno a uno todos los elementos de a y ve metieacutendolos en una variable de nombrecolor

Systemoutprintln(color)

rarr Muestra por pantalla el contenido de la variable colorVeamos ahora en otro ejemplo coacutemo eliminar elementos de un ArrayList Se utiliza elmeacutetodo remove() y se puede pasar como paraacutemetro el iacutendice del elemento que se quiereeliminar o bien el valor del elemento O sea aremove(2) elimina el elemento que seencuentra en la posicioacuten 2 de a mientras que aremove(blanco) elimina el valor blancoEs importante destacar que el ArrayList se reestructura de forma automaacutetica despueacutesdel borrado de cualquiera de sus elementos

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList04

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

Colecciones y diccionarios 139

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

aadd(blanco)

Systemoutprintln(Contenido de la lista )

for(String color a)

Systemoutprintln(color)

if (acontains(blanco))

Systemoutprintln(El blanco estaacute en la lista de colores)

aremove(blanco)

Systemoutprintln(Contenido de la lista despueacutes de quitar la +

primera ocurrencia del color blanco )

for(String color a)

Systemoutprintln(color)

aremove(2)

Systemoutprintln(Contenido de la lista despueacutes de quitar el +

elemento de la posicioacuten 2 )

for(String color a)

Systemoutprintln(color)

A continuacioacuten se muestra un ejemplo en el que se ldquomachacardquo una posicioacuten delArrayList Al hacer aset(2 turquesa) se borra lo que hubiera en la posicioacuten 2 y secoloca el valor turquesa Seriacutea equivalente a hacer a[2] = turquesa en caso de que a

fuese un array tradicional en lugar de un ArrayList

Colecciones y diccionarios 140

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList05

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido del vector )

for(String color a)

Systemoutprintln(color)

aset(2 turquesa)

Systemoutprintln(Contenido del vector despueacutes de machacar la posicioacuten 2 )

for(String color a)

Systemoutprintln(color)

El meacutetodo add permite antildeadir elementos a un ArrayList como ya hemos visto Porejemplo aadd(amarillo) antildeade el elemento amarillo al final de a Este meacutetodo sepuede utilizar tambieacuten con un iacutendice de la forma aadd(1 turquesa) En este caso loque se hace es insertar en la poscioacuten indicada Lo mejor de todo es que el ArrayList sereestructura de forma automaacutetica desplazando el resto de elementos

Colecciones y diccionarios 141

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList06

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(String color a)

Systemoutprintln(color)

aadd(1 turquesa)

Systemoutprintln(Contenido del vector despueacutes de insertar en la posicioacuten 1 )

for(String color a)

Systemoutprintln(color)

1013 ArrayList de objetos

Una coleccioacuten ArrayList puede contener objetos que son instancias de clases definidaspor el programador Esto es muy uacutetil sobre todo en aplicaciones de gestioacuten paraguardar datos de alumnos productos libros etcEn el siguiente ejemplo definimos una lista de gatos En cada celda de la lista sealmacenaraacute un objeto de la clase Gato

Colecciones y diccionarios 142

Uso de un ArrayList de objetos author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList07

public static void main(String[] args)

ArrayListltGatogt g = new ArrayListltGatogt()

gadd(new Gato(Garfield naranja mestizo))

gadd(new Gato(Pepe gris angora))

gadd(new Gato(Mauri blanco manx))

gadd(new Gato(Ulises marroacuten persa))

Systemoutprintln(nDatos de los gatosn)

for (Gato gatoAux g)

Systemoutprintln(gatoAux+n)

En el siguiente apartado se muestra la definicioacuten de la clase Gato

1014 Ordenacioacuten de un ArrayList

Los elementos de una lista se pueden ordenar con el meacutetodo sort El formato es elsiguiente

Collectionssort(lista)

Observa que sort es un meacutetodo de clase que estaacute definido en Collections Para poderutilizar este meacutetodo es necesario incluir la liacutenea

import javautilCollections

al principio del programa A continuacioacuten se muestra un ejemplo del uso de sort

Colecciones y diccionarios 143

Ordenacioacuten de un ArrayList author Luis Joseacute Saacutenchez

import javautilCollectionsimport javautilArrayList

public class EjemploArrayList071

public static void main(String[] args)

ArrayListltIntegergt a = new ArrayListltIntegergt()

aadd(67)

aadd(78)

aadd(10)

aadd(4)

Systemoutprintln(nNuacutemeros en el orden original)

for (int numero a)

Systemoutprintln(numero)

Collectionssort(a)

Systemoutprintln(nNuacutemeros ordenados)

for (int numero a)

Systemoutprintln(numero)

Tambieacuten es posible ordenar una lista de objetos En este caso es necesario indicar elcriterio de ordenacioacuten en la definicioacuten de la clase En el programa principal se utilizael meacutetodo sort igual que si se tratase de una lista de nuacutemeros o de palabras como semuestra a continuacioacuten

Colecciones y diccionarios 144

Ordenacioacuten de un ArrayList de objetos author Luis Joseacute Saacutenchez

import javautilCollectionsimport javautilArrayList

public class EjemploArrayList08

public static void main(String[] args)

ArrayListltGatogt g = new ArrayListltGatogt()

gadd(new Gato(Garfield naranja mestizo))

gadd(new Gato(Pepe gris angora))

gadd(new Gato(Mauri blanco manx))

gadd(new Gato(Ulises marroacuten persa))

gadd(new Gato(Adaacuten negro angora))

Collectionssort(g)

Systemoutprintln(nDatos de los gatos ordenados por nombre)

for (Gato gatoAux g)

Systemoutprintln(gatoAux+n)

Ahora bien en la definicioacuten de la clase Gato hay que indicar de alguna manera coacutemo sedebe realizar la ordenacioacuten ya que Java no sabe de antemano si los gatos se ordenanseguacuten el color el nombre el peso etcLo primero que hay que hacer es indicar que los objetos de la clase Gato se puedencomparar unos con otros Para ello cambiamos la siguiente liacutenea

public class Gato

por esta otra

public class Gato implements ComparableltGatogt

Lo siguiente y no menos importante es definir el meacutetodo compareTo Este meacutetodo debedevolver un 0 si los elementos que se comparan son iguales un nuacutemero negativo si

Colecciones y diccionarios 145

el primer elemento que se compara es menor que el segundo y un nuacutemero positivoen caso contrario Afortunadamente las clases String Integer Double etc ya tienenimplementado su propio meacutetodo compareTo asiacute que tenemos hecho lo maacutes difiacutecil Louacutenico que deberemos escribir en nuestro coacutedigo es un compareTo con los atributos quequeremos compararEn el caso que nos ocupa si queremos ordenar los gatos por nombre tendremos queimplementar el compareTo de la clase Gato de tal forma que nos devuelva el resultadodel compareTo de los nombres de los gatos que estamos comparando de la siguientemanera

public int compareTo(Gato g)

return (thisnombre)compareTo(ggetNombre())

Si en lugar de ordenar por nombre quisieacuteramos ordenar por raza el meacutetodo compareTo

de la clase Gato seriacutea el siguiente

public int compareTo(Gato g)

return (thisraza)compareTo(ggetRaza())

A continuacioacuten se muestra la definicioacuten completa de la clase Gato

Definicioacuten de la clase Gato author

public class Gato implements ComparableltGatogt

private String nombre

private String color

private String raza

public Gato(String nombre String color String raza)

thisnombre = nombre

thiscolor = color

thisraza = raza

public String getNombre()

return nombre

Colecciones y diccionarios 146

public String getRaza()

return raza

public String toString()

return Nombre + thisnombre + nColor + thiscolor + nRaza + thisraza

public int compareTo(Gato g)

return (thisnombre)compareTo(ggetNombre())

public boolean equals(Gato g)

return (thisnombre)equals(ggetNombre())

102 Diccionarios la clase HashMap

Imagina un diccionario ingleacutes-espantildeol Queremos saber queacute significa la palabra ldquostiffrdquoSabemos que en el diccionario hay muchas entradas y en cada entrada tenemos unapalabra en ingleacutes y su correspondiente traduccioacuten al espantildeol Buscando por la ldquosrdquoencontramos que ldquostiffrdquo significa ldquoagujetasrdquoUn diccionario en Java funciona exactamente igual Contiene una serie de elementosque son las entradas que a su vez estaacuten formadas por un par (clave valor) La clave(key) permite acceder al valor No puede haber claves duplicadas En el ejemploanterior la clave seriacutea ldquostiffrdquo y el valor ldquoagujetasrdquoJava dispone de varios tipos de diccionarios HashMap EnumMap Hashtable IdentityHashMapLinkedHashMap etc Nosotros estudiaremos el diccionario HashMap

1021 Principales meacutetodos de HashMap

Algunos de los meacutetodos maacutes importantes de la clase HasMap son

get(clave)Obtiene el valor correspondiente a una clave Devuelve null si no existe esa claveen el diccionario

put(clave valor)Antildeade un par (clave valor) al diccionario Si ya habiacutea un valor para esa clave semachaca

keySet()Devuelve un conjunto (set) con todas las claves

Colecciones y diccionarios 147

values()Devuelve una coleccioacuten con todos los valores (los valores pueden estar duplicadosa diferencia de las claves)

entrySet()Devuelve una coleccioacuten con todos los pares (clave valor)

containsKey(clave)Devuelve true si el diccionario contiene la clave indicada y false en caso contrario

getKey()Devuelve la clave de la entrada Se aplica a una sola entrada del diccionario (noal diccionario completo) es decir a una pareja (clave valor)

Por ejemplo

for (MapEntry pareja mentrySet())

Systemoutprintln(parejagetKey())

getValue()Devuelve el contenido de la entrada Se aplica a una entrada del diccionario (noal diccionario completo) es decir a una pareja (clave valor)

Por ejemplo

for (MapEntry pareja mentrySet())

Systemoutprintln(parejagetValue())

1022 Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas

Al declarar un diccionario hay que indicar los tipos tanto de la clave como del valorEn el siguiente ejemplo definimos el diccionario m que tendraacute como clave un nuacutemeroentero y una cadena de caracteres como valor Este diccionario se declara de estaforma

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

No hay que olvidar importar la clase al principio del programa

import javautilHashMap

Para insertar una entrada en el diccionario se utiliza el meacutetodo put indicando siemprela clave y el valor Veamos un ejemplo completo

Colecciones y diccionarios 148

Ejemplo de uso de la clase HasMap author Luis Joseacute Saacutenchez

import javautilHashMap

public class EjemploHashMap01

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(Los elementos de m son n + m)

Para extraer valores se utiliza el meacutetodo get Se proporciona una clave y el diccionarionos devuelve el valor igual que un diccionario de verdad Si no existe ninguna entradacon la clave que se indica se devuelve null

Ejemplo de uso de la clase HasMap author Luis Joseacute Saacutenchez

import javautilHashMap

public class EjemploHashMap011

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

Colecciones y diccionarios 149

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(mget(921))

Systemoutprintln(mget(605))

Systemoutprintln(mget(888))

iquestY si queremos extraer todas las entradas Tenemos varias opciones Podemos usar elmeacutetodo print directamente sobre el diccionario de la forma Systemoutprint(diccionario)

como vimos en un ejemplo anterior de esta manera se muestran por pantalla todaslas entradas encerradas entre llaves Tambieacuten podemos convertir el diccionario enun entrySet (conjunto de entradas) y mostrarlo con print de esta forma se obtieneuna salida por pantalla muy parecida a la primera (en lugar de llaves se muestrancorchetes) Otra opcioacuten es utilizar un for para recorrer una a una todas las entradasEn este uacuteltimo caso hay que convertir el diccionario en un entrySet ya que no se puedensacar las entradas directamente del diccionario Estas dos uacuteltimas opciones se ilustranen el siguiente ejemplo

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautilHashMapimport javautilMap

public class EjemploHashMap02

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(Todas las entradas del diccionario extraiacutedas con entrySet)

Systemoutprintln(mentrySet())

Systemoutprintln(nEntradas del diccionario extraiacutedas una a una)

Colecciones y diccionarios 150

for (MapEntry pareja mentrySet())

Systemoutprintln(pareja)

A continuacioacuten se muestra el uso de los meacutetodos getKey y getValue que extraen la clavey el valor de una entrada respectivamente

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautil

public class EjemploHashMap03

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(CoacutedigotNombren------t-------------)

for (MapEntry pareja mentrySet())

Systemoutprint(parejagetKey() + t)

Systemoutprintln(parejagetValue())

En el uacuteltimo programa de ejemplo hacemos uso del meacutetodo containsKey que nos serviraacutepara saber si existe o no una determinada clave en un diccionario y del meacutetodo get

que como ya hemos visto sirve para extraer un valor a partir de su clave

Colecciones y diccionarios 151

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautil

public class EjemploHashMap04

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprint(Por favor introduzca un coacutedigo )

int codigoIntroducido = IntegerparseInt(Systemconsole()readLine())

if (mcontainsKey(codigoIntroducido))

Systemoutprint(El coacutedigo + codigoIntroducido + corresponde a )

Systemoutprintln(mget(codigoIntroducido))

else

Systemoutprint(El coacutedigo introducido no existe)

Colecciones y diccionarios 152

103 Ejercicios

Ejercicio 1Crea un ArrayList con los nombres de 6 compantildeeros de clase A continuacioacutenmuestra esos nombres por pantalla Utiliza para ello un bucle for que recorratodo el ArrayList sin usar ninguacuten iacutendice

Ejercicio 2Realiza un programa que introduzca valores aleatorios (entre 0 y 100) en unArrayList y que luego calcule la suma la media el maacuteximo y el miacutenimo de esosnuacutemeros El tamantildeo de la lista tambieacuten seraacute aleatorio y podraacute oscilar entre 10y 20 elementos ambos inclusive

Ejercicio 3Escribe un programa que ordene 10 nuacutemeros enteros introducidos por tecladoy almacenados en un objeto de la clase ArrayList

Ejercicio 4Realiza un programa equivalente al anterior pero en esta ocasioacuten el programadebe ordenar palabras en lugar de nuacutemeros

Ejercicio 5Realiza de nuevo el ejercicio de la coleccioacuten de discos pero utilizando esta vezuna lista para almacenar la informacioacuten sobre los discos en lugar de un arrayconvencional Comprobaraacutes que el coacutedigo se simplifica notablemente iquestCuaacutentoocupa el programa original hecho con un array iquestCuaacutento ocupa este nuevoprograma hecho con una lista

Ejercicio 6Implementa el control de acceso al aacuterea restringida de un programa Se debepedir un nombre de usuario y una contrasentildea Si el usuario introduce losdatos correctamente el programa diraacute ldquoHa accedido al aacuterea restringidardquo Elusuario tendraacute un maacuteximo de 3 oportunidades Si se agotan las oportunidadesel programa diraacute ldquoLo siento no tiene acceso al aacuterea restringidardquo Los nombresde usuario con sus correspondientes contrasentildeas deben estar almacenadosen una estructura de la clase HashMap

Colecciones y diccionarios 153

Ejercicio 7La maacutequina Eurocoin genera una moneda de curso legal cada vez que se pulsaun botoacuten siguiendo la siguiente pauta o bien coincide el valor con la monedaanteriormente generada - 1 ceacutentimo 2 ceacutentimos 5 ceacutentimos 10 ceacutentimos 25ceacutentimos 50 ceacutentimos 1 euro o 2 euros - o bien coincide la posicioacuten ndash cara ocruz Simula mediante un programa la generacioacuten de 6 monedas aleatoriassiguiendo la pauta correcta Cada moneda generada debe ser una instanciade la clase Moneda y la secuencia se debe ir almacenando en una lista

Ejemplo

2 ceacutentimos ndash cara

2 ceacutentimos ndash cruz

50 ceacutentimos ndash cruz

1 euro ndash cruz

1 euro ndash cara

10 ceacutentimos ndash cara

Ejercicio 8Realiza un programa que escoja al azar 10 cartas de la baraja espantildeola(10 objetos de la clase Carta) Emplea un objeto de la clase ArrayList paraalmacenarlas y aseguacuterate de que no se repite ninguna

Ejercicio 9Modifica el programa anterior de tal forma que las cartas se muestren orde-nadas Primero se ordenaraacuten por palo bastos copas espadas oros Cuandocoincida el palo se ordenaraacute por nuacutemero as 2 3 4 5 6 7 sota caballo rey

Ejercicio 10Crea un mini-diccionario espantildeol-ingleacutes que contenga al menos 20 palabras(con su correspondiente traduccioacuten) Utiliza un objeto de la clase HashMap paraalmacenar las parejas de palabras El programa pediraacute una palabra en espantildeoly daraacute la correspondiente traduccioacuten en ingleacutes

Ejercicio 11Realiza un programa que escoja al azar 5 palabras en espantildeol del mini-diccionario del ejercicio anterior El programa iraacute pidiendo que el usuarioteclee la traduccioacuten al ingleacutes de cada una de las palabras y comprobaraacute sison correctas Al final el programa deberaacute mostrar cuaacutentas respuestas sonvaacutelidas y cuaacutentas erroacuteneas

Colecciones y diccionarios 154

Ejercicio 12Escribe un programa que genere una secuencia de 5 cartas de la barajaespantildeola y que sume los puntos seguacuten el juego de la brisca El valor de lascartas se debe guardar en una estructura HashMap que debe contener parejas(figura valor) por ejemplo (ldquocaballordquo 3) La secuencia de cartas debe ser unaestructura de la clase ArrayList que contiene objetos de la clase Carta El valorde las cartas es el siguiente as rarr 11 tres rarr 10 sota rarr 2 caballo rarr 3 rey rarr4 el resto de cartas no vale nada

Ejemplo

as de oros

cinco de bastos

caballo de espadas

sota de copas

tres de oros

Tienes 26 puntos

Ejercicio 13Modifica el programa Gestisimal realizado anteriormente antildeadiendo lassiguientes mejoras

bull Utiliza una lista en lugar de un array para el almacenamiento de los datosbull Comprueba la existencia del coacutedigo en el alta la baja y la modificacioacuten

de artiacuteculos para evitar erroresbull Cambia la opcioacuten ldquoSalida de stockrdquo por ldquoVentardquo Esta nueva opcioacuten

permitiraacute hacer una venta de varios artiacuteculos y emitir la factura corres-pondiente Se debe preguntar por los coacutedigos y las cantidades de cadaartiacuteculo que se quiere comprar Aplica un 21 de IVA

11 Ficheros de texto y paso de paraacutemetrospor liacutenea de comandos

Mediante un programa en Java se puede acceder al contenido de un fichero grabadoen un dispositivo de almacenamiento (por ejemplo en el disco duro) tanto para leercomo para escribir (grabar) datosLa informacioacuten contenida en las variables los arrays los objetos o cualquier otraestructura de datos es volaacutetil es decir se pierde cuando se cierra el programaLos ficheros permiten tener ciertos datos almacenados y disponibles en cualquiermomento para cuando nuestro programa los necesitePensemos por ejemplo en un juego Podriacuteamos utilizar un fichero para guardar elranking de jugadores con las mejores puntuaciones De esta manera estos datos nose perderiacutean al salir del juego De igual forma en un programa de gestioacuten puede seruacutetil tener un fichero de configuracioacuten con datos como el nuacutemero maacuteximo de elementosque se muestran en un listado o los distintos tipos de IVA aplicables a las facturas Almodificar esta informacioacuten quedaraacute almacenada en el fichero correspondiente y nose perderaacute cuando se cierre el programa

Cuando un programa se cierra se pierde la informacioacuten almacenada envariables arrays objetos o cualquier otra estructura Si queremos conservarciertos datos debemos guardarlos en ficheros

Hay programas que hacen un uso intensivo de datos Por ejemplo la aplicacioacutenSeacuteneca- que por cierto estaacute hecha en Java - lleva el control de la matriculacioacuten de cientosde miles de alumnos y la gestioacuten de decenas de miles de profesores En este caso yen otros similares se utiliza un sistema gestor de bases de datos El acceso a bases dedatos mediante Java lo estudiaremos en el capiacutetulo 13

La creacioacuten y uso de ficheros desde un programa en Java se lleva a cabocuando hay poca informacioacuten que almacenar o cuando esa informacioacuten esheterogeacutenea En los casos en que la informacioacuten es abundante y homogeacuteneaes preferible usar una base de datos relacional (por ejemplo MySQL) en lugarde ficheros

En este capiacutetulo estudiaremos ademaacutes del acceso a ficheros desde un programa enJava el paso de paraacutemetros desde la liacutenea de comandos Son cosas diferentes y nohay que utilizarlas juntas necesariamente pero como podraacutes comprobar se combinanmuy bien por eso hemos incluido estos dos recursos de Java en un mismo capiacutetulo

155

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 156

111 Lectura de un fichero de texto

Aunque Java puede manejar tambieacuten ficheros binarios vamos a centrarnos exclusi-vamente en la utilizacioacuten de ficheros de texto Los ficheros de texto tienen una granventaja se pueden crear y manipular mediante cualquier editor como por ejemploGEditSiempre que vayamos a usar ficheros deberemos incluir al principio del programa unao varias liacuteneas para cargar las clases necesarias Anque se pueden cargar varias clasesen una sola liacutenea usando el asterisco de la siguiente manera

import javaio

nosotros no lo haremos asiacute ya que nuestro coacutedigo sigue las normas del estaacutendar deGoogle y estas normas lo prohiben taxativamente Se importaraacuten las clases usandovarias liacuteneas una liacutenea por cada clase que se importa en el programa de esta forma

import javaioBufferedReaderimport javaioFileReader

No es necesario saber de memoria los nombres de las clases el entorno de desarrolloNetbeans detecta queacute clases hacen falta cargar y antildeade los import de forma automaacute-ticaTodas las operaciones que se realicen sobre ficheros deberaacuten estar incluidas en unbloque try-catch Esto nos permitiraacute mostrar mensajes de error y terminar el programade una forma ordenada en caso de que se produzca alguacuten fallo - el fichero no existeno tenemos permiso para acceder a eacutel etcEl bloque try-catch tiene el siguiente formato

try

Operaciones_con_fichero

catch (tipo_de_error nombre_de_variable)

Mensaje_de_error

Tanto para leer como para escribir utilizamos lo que en programacioacuten se llama unldquomanejador de ficherordquo Es algo asiacute como una variable que hace referencia al ficherocon el que queremos trabajarEn nuestro ejemplo el manejador de fichero se llama bf y se crea de la siguientemanera

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 157

BufferedReader bf = new BufferedReader(new FileReader(malaga1txt))

El fichero con el que vamos a trabajar tiene por nombre malaga1txt y contieneinformacioacuten extraiacuteda de la Wikipedia sobre la bonita ciudad de Maacutelaga1 A partir deaquiacute siempre que queramos realizar una operacioacuten sobre ese archivo utilizaremos sumanejador de fichero asociado es decir bfEn el ejemplo que se muestra a continuacioacuten el programa lee el contenido del ficheromalaga1txt y lo muestra tal cual en pantalla igual que si hicieacuteramos en una ventanade terminal cat malaga1txtObserva que se va leyendo el fichero liacutenea a liacutenea mediante bfreadLine() hasta que seacaban las liacuteneas Cuando no quedan maacutes liacuteneas por leer se devuelve el valor null

Ejemplo de uso de la clase File Lectura de un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileNotFoundExceptionimport javaioFileReaderimport javaioIOException

class EjemploFichero01

public static void main(String[] args)

try

BufferedReader bf = new BufferedReader(new FileReader(malaga1txt))

String linea =

while (linea = null)

Systemoutprintln(linea)

linea = bfreadLine()

bfclose()

catch (FileNotFoundException e) queacute hacer si no se encuentra el ficheroSystemoutprintln(No se encuentra el fichero malagatxt)

catch (IOException e) queacute hacer si hay un error en la lectura del fichero

1httpeswikipediaorgwikiMC3A1laga

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 158

Systemoutprintln(No se puede leer el fichero malagatxt)

Es importante ldquocerrar el ficherordquo cuando se han realizado todas las operacionesnecesarias sobre eacutel En este ejemplo esta accioacuten se ha llevado a cabo con la sentenciabfclose()A continuacioacuten se muestra un programa un poco maacutes complejo Se trata de unaaplicacioacuten que pide por teclado un nombre de fichero Previamente en ese fichero(por ejemplo numerostxt) habremos introducido una serie de nuacutemeros a razoacuten de unopor liacutenea Se podriacutean leer tambieacuten los nuacutemeros si estuvieran separados por comaso espacios aunque seriacutea un poco maacutes complicado (no mucho maacutes) Los nuacutemerospueden contener decimales ya que se van a leer como Double Cada nuacutemero que selee del fichero se va sumando de tal forma que la suma total estaraacute contenida en lavariable suma a la par se va llevando la cuenta de los elementos que se van leyendoen la variable i Finalmente dividiendo la suma total entre el nuacutemero de elementosobtenemos la media aritmeacutetica de los nuacutemeros contenidos en el fichero

Ejemplo de uso de la clase File Calcula la media de los nuacutemeros que se encuentran en un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileReaderimport javaioIOException

class EjemploFichero08

public static void main(String[] args)

Systemoutprint(Introduzca el nombre del archivo donde se encuentran los nuacutemeros )

String nombreFichero = Systemconsole()readLine()

try

BufferedReader bf = new BufferedReader(new FileReader(nombreFichero))

String linea = 0

int i = 0

double suma = 0

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 159

while (linea = null)

i++

suma += DoubleparseDouble(linea)

linea = bfreadLine()

i--

bfclose()

Systemoutprintln(La media es + suma (double)i)

catch (IOException e)

Systemoutprintln(egetMessage())

112 Escritura sobre un fichero de texto

La escritura en un fichero de texto es si cabe maacutes faacutecil que la lectura Solo hay quecambiar Systemoutprint(texto) por manejadorwrite(texto) Se pueden incluir saltosde liacutenea tabuladores y espacios igual que al mostrar un mensaje por pantallaEs importante ejecutar close() despueacutes de realizar la escritura de esta manera nosaseguramos que se graba toda la informacioacuten en el discoAl realizar escrituras en ficheros con Java hay que tener ciertas precauciones Cuandotoca dar este tema en clase es frecuente que a maacutes de un alumno le empiece a irlento el ordenador luego se le queda inutilizado y por uacuteltimo ni siquiera le arrancaiquestqueacute ha pasado Pues que ha estado escribiendo datos en ficheros y por alguna razoacutensu programa se ha metido en un bucle infinito lo que da como resultado cuelgues yficheros de varios gigabytes de basura Por eso es muy importante asegurarse biende que la informacioacuten que se va a enviar a un fichero es la correcta iquestcoacutemo muy faacutecilenviaacutendola primero a la pantalla

Primero a pantalla y luego a ficheroEnviacutea primero a la pantalla todo lo que quieras escribir en el fichero Cuandocompruebes que lo que se ve por pantalla es realmente lo que quieres grabaren el fichero entonces y solo entonces cambia Systemoutprint(texto) pormanejadorwrite(texto)

A continuacioacuten se muestra un programa de ejemplo que crea un fichero de texto yluego esribe en eacutel tres palabras una por cada liacutenea

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 160

Ejemplo de uso de la clase File Escritura en un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedWriterimport javaioFileWriterimport javaioIOException

class EjemploFichero02

public static void main(String[] args)

try

BufferedWriter bw = new BufferedWriter(new FileWriter(frutatxt))

bwwrite(naranjan)

bwwrite(mangon)

bwwrite(chirimoyan)

bwclose()

catch (IOException ioe)

Systemoutprintln(No se ha podido escribir en el fichero)

113 Lectura y escritura combinadas

Las operaciones de lectura y escritura sobre ficheros se pueden combinar de tal formaque haya un flujo de lectura y otro de escritura uno de lectura y dos de escritura tresde lectura etcEn el ejemplo que presentamos a continuacioacuten hay dos flujos de lectura y uno deescritura Observa que se declaran en total tres manejadores de fichero (dos paralectura y uno para escritura) El programa va leyendo de forma alterna una liacutenea decada fichero - una liacutenea de fichero1txt y otra liacutenea de fichero2txt - mientras quedenliacuteneas por leer en alguno de los ficheros y al mismo tiempo va guardando esas liacuteneasen otro fichero con nombre mezclatxt

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 161

Ejemplo de uso de la clase File Mezcla de dos ficheros author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioBufferedWriterimport javaioFileReaderimport javaioFileWriterimport javaioIOException

class EjemploFichero03

public static void main(String[] args)

try

BufferedReader bf1 = new BufferedReader(new FileReader(fichero1txt))

BufferedReader bf2 = new BufferedReader(new FileReader(fichero2txt))

BufferedWriter bw = new BufferedWriter(new FileWriter(mezclatxt))

String linea1 =

String linea2 =

while ( (linea1 = null) || (linea2 = null) )

linea1 = bf1readLine()

linea2 = bf2readLine()

if (linea1 = null) bwwrite(linea1 + n)

if (linea2 = null) bwwrite(linea2 + n)

bf1close()

bf2close()

bwclose()

catch (IOException ioe)

Systemoutprintln(Se ha producido un error de lecturaescritura)

Systemerrprintln(ioegetMessage())

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 162

114 Otras operaciones sobre ficheros

Ademaacutes de leer desde o escribir en un fichero hay otras operaciones relacionadas conlos archivos que se pueden realizar desde un programa escrito en JavaVeremos tan solo un par de ejemplos Si quieres profundizar maacutes eacutechale un vistazo ala documentacioacuten oficial de la clase File2El siguiente ejemplo muestra por pantalla un listado con todos los archivos quecontiene un directorio

Ejemplo de uso de la clase File Listado de los archivos del directorio actual author Luis Joseacute Saacutenchez

import javaioFile

class EjemploFichero04

public static void main(String[] args)

File fichero = new File() se indica la ruta entre comillas el punto () es el directorio actual

String[] listaArchivos = ficherolist()

for(int i = 0 i lt listaArchivoslength i++)

Systemoutprintln(listaArchivos[i])

El siguiente programa de ejemplo comprueba si un determinado archivo existe ono mediante exists() y en caso de que exista lo elimina mediante delete() Siintentaacuteramos borrar un archivo que no existe obtendriacuteamos un error

2httpdocsoraclecomjavase7docsapijavaioFilehtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 163

Ejemplo de uso de la clase File Comprobacioacuten de existencia y borrado de un fichero author Luis Joseacute Saacutenchez

import javaioFile

class EjemploFichero05

public static void main(String[] args)

Systemoutprint(Introduzca el nombre del archivo que desea borrar )

String nombreFichero = Systemconsole()readLine()

File fichero = new File(nombreFichero)

if (ficheroexists())

ficherodelete()

Systemoutprintln(El fichero se ha borrado correctamente)

else

Systemoutprintln(El fichero + nombreFichero + no existe)

115 Paso de argumentos por liacutenea de comandos

Como dijimos al comienzo de este capiacutetulo el paso de argumentos por liacutenea decomandos no estaacute directamente relacionado con los ficheros aunque es muy frecuentecombinar estos dos recursosSeguro que has usado muchas veces el paso de argumentos por liacutenea de comandossin saberlo Por ejemplo si tecleas el siguiente comando en una ventana de terminal

$ head -5 etcbashbashrc

se muestran por pantalla las 5 primeras liacuteneas del fichero bashbashrc que se encuentraen el directorio etc En este caso head es el nombre del programa que estamosejecutando y los valores -5 y etcbashbashrc son los argumentosVolvamos al comienzo al primer capiacutetulo iquestRecuerdas coacutemo ejecutaste tu primerprograma en Java iexclQueacute tiempos aqueacutellos El programa HolaMundo se ejecutaba asiacute

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 164

$ java HolaMundo

Para probar los ejemplos que te presentamos maacutes adelante deberaacutes hacer lo mismo yademaacutes antildeadir a continuacioacuten y separados por espacios los argumentos que quieresque lea el programa Vamos a verlo en detalleEl siguiente programa de ejemplo simplemente muestra por pantalla los argumentosintroducidos Compila el programa y prueba a ejecutar lo siguiente

$ java EjemploArgumentos06 hola que tal 24 12 fin

con lo que obtendraacutes el siguiente resultado

Los argumentos introducidos son

hola

que

tal

24

12

fin

Los argumentos han pasado al programa en virtud del paraacutemetro que incluimos en laliacutenea del main

public static void main(String[] args)

Fiacutejate en lo que hay entre pareacutentesis String[] args Se trata de un array de cadenasde caracteres (String) donde cada uno de los elementos seraacute un argumento que se hapasado como paraacutemetro Si has ejecutado el ejemplo tal y como se ha indicado args[0]vale ldquoholardquo args[1] vale ldquoquerdquo args[2] vale ldquotalrdquo args[3] vale ldquo24rdquo args[4] vale ldquo12rdquo yargs[5] vale ldquofinrdquo

Paso de argumentos en la liacutenea de comandos author Luis Joseacute Saacutenchez

class EjemploArgumentos06

public static void main(String[] args)

Systemoutprintln(Los argumentos introducidos son )

for (int i = 0 i lt argslength i++)

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 165

Systemoutprintln(args[i])

Hagamos algo un poco maacutes uacutetil con los argumentos En el siguiente ejemplo se sumantodos los argumentos que se pasan como paraacutemetros y se muestra por pantalla elresultado de la sumaDespueacutes de compilar deberaacutes ejecutar desde una ventana de terminal lo siguiente(puedes cambiar los nuacutemeros si quieres)

$ java EjemploArgumentos07 10 36 44

con lo que obtendraacutes este resultado

90

es decir la suma de los nuacutemeros que has pasado como paraacutemetros

Paso de argumentos en la liacutenea de comandos author Luis Joseacute Saacutenchez

class EjemploArgumentos07

public static void main(String[] args)

int suma = 0

for (int i = 0 i lt argslength i++)

suma += IntegerparseInt(args[i])

Systemoutprintln(suma)

Observa que el programa convierte en nuacutemeros enteros todos y cada uno de losargumentos mediante el meacutetodo IntegerparseInt() para poder sumarlos

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 166

Los argumentos recogidos por liacutenea de comandos se guardan siempre enun array de String Cuando sea necesario realizar operaciones matemaacuteticascon esos argumentos habriacutea que convertirlos al tipo adecuado medianteIntegerparseInt() o DoubleparseDouble()

116 Combinacioacuten de ficheros y paso de argumentos

Llegoacute el momento de combinar las operaciones con ficheros con el paso de paraacutemetrospor liacutenea de comandos El ejemplo que mostramos a continuacioacuten es parecido al quehemos visto en el apartado anterior calcula la media de una serie de nuacutemeros peroesta vez esos nuacutemeros se leen desde un fichero y lo que se pasa como paraacutemetro por laliacutenea de comandos es precisamente el nombre del fichero donde estaacuten esos nuacutemerosCrea un fichero y noacutembralo numerostxt e introduce los siguientes nuacutemeros (es impor-tante que esteacuten separados por un salto de liacutena para que el programa funcione bien)

25

100

44

17

6

8

A continuacioacuten compila el programa de ejemplo EjemploFichero09java y teclea losiguiente en la ventana de terminal

$ java EjemploFichero09 numerostxt

Apareceraacute el siguiente resultado

La media es 33333333333333336

Ejemplo de uso de la clase File Calcula la media de los nuacutemeros que se encuentran en un fichero de texto El nombre del fichero se pasa como argumento en la liacutenea de comandos author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileReader

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 167

import javaioIOException

class EjemploFichero09

public static void main(String[] args)

if (argslength = 1)

Systemoutprintln(Este programa calcula la media de los nuacutemeros contenidos en un f

ichero)

Systemoutprintln(Uso del programa java EjemploFichero09 FICHERO)

Systemexit(-1) sale del programa

try

BufferedReader bf = new BufferedReader(new FileReader(args[0]))

String linea = 0

int i = 0

double suma = 0

while (linea = null)

i++

suma += DoubleparseDouble(linea)

linea = bfreadLine()

i--

bfclose()

Systemoutprintln(La media es + suma(double)i)

catch (IOException e)

Systemoutprintln(egetMessage())

Observa que el programa comprueba el nuacutemero de argumentos que se pasan por laliacutenea de comandos mediante if (argslength = 1) y si este nuacutemero es distinto de 1muestra este mensaje

Este programa calcula la media de los nuacutemeros contenidos en un fichero

Uso del programa java EjemploFichero09 FICHERO

y sale del programa De esta manera el usuario sabe exactamente coacutemo hay queutilizar el programa y coacutemo hay que pasarle la informacioacuten

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 168

117 Procesamiento de archivos de texto

La posibilidad de realizar desde Java operaciones con ficheros abre muchas posibili-dades a la hora de procesar archivos cambiar una palabra por otra eliminar ciertoscaracteres mover de sitio una liacutenea o una palabra borrar espacios o tabulaciones alfinal de las liacuteneas o cualquier otra cosa que se nos pueda ocurrirCuando se procesa un archivo de texto los pasos a seguir son los siguientes

1 Leer una liacutenea del fichero origen mientras quedan liacuteneas por leer2 Modificar la liacutenea (normalmente utilizando los meacutetodos que ofrece la clase String)3 Grabar la liacutenea modificada en el fichero destino4 Volver al paso 1

A continuacioacuten tienes algunos meacutetodos de la clase String que pueden resultar muyuacutetiles para procesar archivos de texto

bull charAt(int n) Devuelve el caraacutecter que estaacute en la posicioacuten n-eacutesima de la cadenaRecuerda que la primera posicioacuten es la nuacutemero 0

bull indexOf(String palabra) Devuelve un nuacutemero que indica la posicioacuten en la quecomienza una palabra determinada

bull length() Devuelve la longitud de la cadenabull replace(char c1 char c2) Devuelve una cadena en la que se han cambiado

todas las ocurrencias del caraacutecter c1 por el caraacutecter c2bull substring(int inicioint fin) Devuelve una subcadenabull toLowerCase() Convierte todas las letras en minuacutesculasbull toUpperCase() Convierte todas las letras en mayuacutesculas

Puedes consultar todos los meacutetodos de la clase String en la documentacioacuten oficial3A continuacioacuten tienes un ejemplo en el que se usan los meacutetodos descritos anterior-mente

Ejemplos de uso de String author Luis Joseacute Saacutenchez

public class EjemplosString

public static void main(String[] args)

Systemoutprintln(nEjemplo 1)

Systemoutprintln(En la posicioacuten 2 de berengena estaacute la letra

3httpdocsoraclecomjavase7docsapijavalangStringhtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 169

+ berengenacharAt(2))

Systemoutprintln(nEjemplo 2)

String frase = Hola caracola

char[] trozo = new char[10]trozo[0] = z trozo[1] = z trozo[2] = z

frasegetChars(2 7 trozo 1)

Systemoutprint(El array de caracteres vale )

Systemoutprintln(trozo)

Systemoutprintln(nEjemplo 3)

Systemoutprintln(La secuencia co aparece en la frase en la posicioacuten

+ fraseindexOf(co))

Systemoutprintln(nEjemplo 4)

Systemoutprintln(La palabra murcieacutelago tiene

+ murcieacutelagolength() + letras)

Systemoutprintln(nEjemplo 5)

String frase2 = frasereplace(o u)

Systemoutprintln(frase2)

Systemoutprintln(nEjemplo 6)

frase2 = frasesubstring(3 10)

Systemoutprintln(frase2)

Systemoutprintln(nEjemplo 7)

Systemoutprintln(frasetoLowerCase())

Systemoutprintln(nEjemplo 8)

Systemoutprintln(frasetoUpperCase())

A continuacioacuten se muestra un programa que procesa archivos de texto Lo que hacees cambiar cada tabulador por dos espacios en blanco Lo hice a propoacutesito cuandoestaba escribiendo este manual ya que el estaacutendar de Google para la codificacioacuten enJava4 especifica que la sangriacutea debe ser precisamente de dos espacios Teniacutea muchosprogramas escritos en Java (ejemplos y soluciones a ejercicios) que no cumpliacutean esterequisito porque la sangriacutea estaba aplicada con el caraacutecter de tabulacioacuten teniacutea dosposibilidades abrir todos y cada uno de los ficheros y cambiarlo a mano o escribir unprograma que lo hiciera Opteacute por la segunda opcioacuten y aquiacute tienes el programa iquestverdadque es muy sencillo

4httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 170

import javaioBufferedReaderimport javaioBufferedWriterimport javaioFileimport javaioFileReaderimport javaioFileWriterimport javaioIOException

Cambia los tabuladores por 2 espacios author Luis Joseacute Saacutenchez

public class EjemploProcesamiento10

public static void main(String[] args)

for (int i = 0 i lt argslength i++)

Systemoutprint(Procesando el archivo + args[i] + )

try

renombra el fichero antildeadiendo tmpFile ficheroOriginal = new File(args[i])

File ficheroTemporal = new File(args[i] + tmp)

ficheroOriginalrenameTo(ficheroTemporal)

lee los datos del archivo temporalBufferedReader bf = new BufferedReader(new FileReader(args[i] + tmp))

crea un fichero nuevo con el nombre originalBufferedWriter bw = new BufferedWriter(new FileWriter(args[i]))

String linea =

while ( linea = null )

linea = bfreadLine()

if (linea = null)

cambia el tabulador por 2 espacioslinea = lineareplace(t )

bwwrite(linea + n)

bfclose()

bwclose()

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 171

borra el fichero temporalficheroTemporaldelete()

catch (IOException ioe)

Systemoutprintln(Se ha producido un error de lecturaescritura)

Systemerrprintln(ioegetMessage())

Systemoutprintln(hecho)

118 Ejercicios

Ejercicio 1Escribe un programa que guarde en un fichero con nombre primosdat losnuacutemeros primos que hay entre 1 y 500

Ejercicio 2Realiza un programa que lea el fichero creado en el ejercicio anterior y quemuestre los nuacutemeros por pantalla

Ejercicio 3Escribe un programa que guarde en un fichero el contenido de otros dosficheros de tal forma que en el fichero resultante aparezcan las liacuteneas de losprimeros dos ficheros mezcladas es decir la primera liacutenea seraacute del primerfichero la segunda seraacute del segundo fichero la tercera seraacute la siguiente delprimer fichero etcLos nombres de los dos ficheros origen y el nombre del fichero destino se debenpasar como argumentos en la liacutenea de comandosHay que tener en cuenta que los ficheros de donde se van cogiendo las liacuteneaspueden tener tamantildeos diferentes

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 172

Ejercicio 4Realiza un programa que sea capaz de ordenar alfabeacuteticamente las palabrascontenidas en un fichero de texto El nombre del fichero que contiene laspalabras se debe pasar como argumento en la liacutenea de comandos El nombredel fichero resultado debe ser el mismo que el original antildeadiendo la coletillasort por ejemplo palabras_sorttxt Suponemos que cada palabra ocupa unaliacutenea

Ejercicio 5Escribe un programa capaz de quitar los comentarios de un programa de JavaSe utilizariacutea de la siguiente maneraquita_commentarios PROGRAMA_ORIGINAL PROGRAMA_LIMPIO

Por ejemploquita_comentarios holajava holav2java

crea un fichero con nombre holav2java que contiene el coacutedigo de holajava perosin los comentarios

Ejercicio 6Realiza un programa que diga cuaacutentas ocurrencias de una palabra hay en unfichero Tanto el nombre del fichero como la palabra se deben pasar comoargumentos en la liacutenea de comandos

12 Aplicaciones web en Java (JSP)Hasta el momento los programas realizados funcionan en una austera ventana determinal No se trata de algo casual hemos elegido esta manera de trabajar de formadeliberada para que el estudiante se centre en resolver el problema y no se distraigadaacutendole sombra a un botoacuten o escogiendo la mejor imagen de fondo para un listadoLlegamos no obstante a un punto en que algunos programas piden a gritos unaapariencia maacutes vistosaEn este capiacutetulo vamos a aprender coacutemo utilizar paacuteginas web como interfaz paraprogramas en Java Usaremos JSP (JavaServer Pages) que nos permitiraacute mezclar coacutedigoen Java con coacutedigo HTML El coacutedigo en Java que utilizaremos seraacute muy parecido alque hemos venido utilizando hasta ahora Cambiaraacute uacutenicamente lo relativo a mostrarinformacioacuten por pantalla (ahora se volcaraacute todo a HTML) y la manera en que seintroducen los datos que se realizaraacute mediante formularios

El lector deberaacute tener unos conocimientos baacutesicos de HTML para entender bieny sacar provecho de este capiacutetulo Una web excelente para aprender HTML esW3Schools1

El estaacutendar de programacioacuten de Google para el coacutedigo fuente escrito en Java2 noespecifica ninguna regla en cuanto a la manera de nombrar los ficheros correspon-dientes a las aplicaciones JSP Por tanto vamos a adoptar las convenciones de Oracle3

en esta materia Seguacuten estas convenciones los nombres de los ficheros JSP debenestar escritos en lowerCamelCase es decir la primera letra siempre es minuacutesculay en caso de utilizar varias palabras dentro del nombre eacutestas van seguidas unade otra empezando cada una por mayuacutescula Finalmente se antildeade la extensioacuten jspPor ejemplo listadoSociosjsp es un nombre correcto mientras que ListadoSociosjsplistado_sociosjsp o Listadosociosjsp son incorrectos

121 Hola Mundo en JSP

Para desarrollar aplicaciones en JSP utilizaremos el entorno de desarrollo NetbeansEste IDE se puede descargar de forma gratuita en httpsnetbeansorgdownloadsnota12_-14

Sigue estos pasos para crear una aplicacioacuten en JSP con Netbeans1httpw3schoolscom2httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml3httpwwworaclecomtechnetworkarticlesjavasecode-convention-138726html4ParamaacutesdetallessobrelainstalacioacutenyconfiguracioacutendeNetbeansverel[ApeacutendiceB](apendiceb)

173

Aplicaciones web en Java (JSP) 174

bull En el menuacute principal selecciona Archivo y a continuacioacuten Nuevo Proyecto Sepuede hacer maacutes raacutepido con la combinacioacuten Control + Mayuacutescula + N

bull Apareceraacute una ventana emergente para elegir el tipo de proyecto SeleccionaJava Web en el apartado ldquoCategoriacuteasrdquo y Aplicacioacuten Web en el apartadoldquoProyectosrdquo Haz clic en Siguiente

bull Ahora hay que darle el nombre al proyecto lo puedes llamar por ejemploSaludo1 Recuerda no utilizar caracteres especiales ni signos de puntuacioacuten Secrearaacute una carpeta con el mismo nombre que el proyecto que contendraacute todoslos ficheros necesarios Haz clic en Siguiente

bull En la siguiente ventana tendraacutes que elegir el servidor la versioacuten de Java y laruta Elige Glass Fish Server En caso de no haber ninguacuten servidor disponibleNetbeans permite antildeadir uno sobre la marcha (se lo descarga y lo instala) Hazclic en Finalizar

A la izquierda en la ventana de proyectos debe aparecer el que acabas de crearSaludo1 Navegando por la estructura del proyecto veraacutes que hay una carpeta connombre Web Pages en esta carpeta se deberaacuten guardar los archivos correspondien-tes a la aplicacioacuten archivos jsp html css imaacutegenes archivos de audio etc Para quelos archivos esteacuten ordenados se pueden organizar a su vez en subcarpetas dentrode Web PagesPor defecto cuando se crea un proyecto JSP se crea el archivo indexhtml Elimina estearchivo de tu proyecto y luego crea indexjsp haciendo clic con el botoacuten derecho enWeb Pages rarr Nuevo rarr JSP Al indicar el nombre no hay que poner la extensioacutenYa tienes un ldquoHola Mundordquo en ingleacutes Si lo quieres en espantildeol solo tienes que cambiarldquoHello Worldrdquo por ldquoHola Mundordquo con lo que la aplicacioacuten quedariacutea como sigue

lt-- saludo1jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Mundolth1gt

En esta paacutegina se usa uacutenicamente HTML

ltbodygt

lthtmlgt

Para ejecutar la aplicacioacuten hay que hacer clic en el botoacuten verde Ejecutar Proyecto opulsar F6 En ese momento Netbeans buscaraacute un fichero con el nombre indexjsp ylo lanzaraacute en el navegador

Aplicaciones web en Java (JSP) 175

Observa que el programa del ejemplo se llama saludo1jsp y no indexjsp En estecaso para ejecutar la aplicacioacuten hay que hacer clic con el botoacuten derecho encima desaludo1jsp y seleccionar EjecutarDe momento solo hemos visto coacutedigo HTML iquestdoacutende estaacute Java Bien vamos a verlopero antes hay entender bien coacutemo funciona JSPUna aplicacioacuten JSP consistiraacute en una o varias paacuteginas web que normalmente contendraacutecoacutedigo HTML y que llevaraacuten ldquoinsertadordquo coacutedigo en Java Este coacutedigo en Java puedecolocarse en cualquier parte del archivo y se delimita mediante las etiquetas lt y gtCuando se pulsa F6 para ejecutar la aplicacioacuten sucede lo siguiente

1 Todo el coacutedigo (tanto HTML como JAVA) se enviacutea al servidor (Glass Fish o ApacheTomcat por ejemplo)

2 El servidor deja intacto el coacutedigo HTML y compila y ejecuta el coacutedigo en JavaGeneralmente el coacutedigo Java genera coacutedigo HTML mediante las instruccionesoutprint y outprintln

3 Por uacuteltimo todo el coacutedigo (ya solo queda HTML) se enviacutea al navegador que es elque muestra la paacutegina Recuerda que el navegador no entiende Java (entiendeJavascript que es otro lenguaje diferente) y es imprescindible que todo el coacutedigoJava haya sido traducido previamente

122 Mezclando Java con HTML

A continuacioacuten se muestra un ejemplo que siacute tiene Java Como ves el coacutedigo Java estaacutedelimitado por los caracteres lt y gt

lt-- saludo2jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt outprintln(lth1gtiexclHola Mundolth1gt) gt

ltbodygt

lthtmlgt

Mediante Java se puede generar cualquier contenido HTML por ejemplo para modi-ficar estilos crear tablas mostrar imaacutegenes etc Trabajando en consola lo que seincluye en un print es exactamente lo que se muestra por pantalla Ahora con JSP loque se incluye dentro del print es ldquorenderizadordquo a posteriori por el navegador En elsiguiente ejemplo se puede ver claramente este comportamiento

Aplicaciones web en Java (JSP) 176

lt-- saludo3jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Caracolalth1gt

lt outprint(ltbgtltigt) gt

Esta liacutenea se ha puesto en negrita y cursiva mediante Java

lt outprint(ltigtltbgt) gt

ltbodygt

lthtmlgt

Es muy uacutetil ver el coacutedigo fuente que se ha generado una vez que se puede visualizarla aplicacioacuten en el navegador Para ver el coacutedigo fuente tanto en Firefox como enChrome hay que hacer clic con el botoacuten derecho en la paacutegina y seleccionar la opcioacutenldquoVer coacutedigo fuente de la paacuteginardquoCuando el contenido que se quiere volcar en HTML es el resultado de una expresioacutense pueden utilizar de forma opcional las etiquetas lt= y gt

lt-- saludo4jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Caracolalth1gt

lt= ltbgtltigt gt

Esta liacutenea se ha puesto en negrita y cursiva mediante Java

lt= ltigtltbgt gt

ltbodygt

lthtmlgt

En el coacutedigo Java que se inserta en las aplicaciones JSP se pueden utilizar todos loselemento del lenguaje vistos anteriormente bucles sentencias de control arraysdiccionarios etcEn el siguiente ejemplo se utiliza un bucle for para mostrar texto en diferentestamantildeos utilizando las etiquetas desde la lth6gt (cabecera pequentildea) hasta la lth1gt

(cabecera maacutes grande)

Aplicaciones web en Java (JSP) 177

lt-- pruebaVariable1 --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

for (int i = 1 i lt 7 i++)

outprintln(lth + (7-i) + gt+ i + lth + (7-i) + gt)

gt

ltbodygt

lthtmlgt

El coacutedigo en Java se puede insertar en cualquier parte dentro del coacutedigo HTML eincluso se pueden insertar varios trozos como se puede ver en el siguiente ejemploAunque una variable se haya definido en una determinada zona su aacutembito deactuacioacuten no se ve reducido a ese fragmento de coacutedigo sino que se puede utilizarposteriormente en otro lugar de la aplicacioacutenObserva que en el siguiente ejemplo la definicioacuten e inicializacioacuten de la variable x serealiza en un bloque de coacutedigo en Java y que luego esta variable se utiliza en otros dosbloques diferentes

lt-- pruebaVariable2 --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt int x = 3 gt

lthlt outprint(x) gtgtholalthlt outprint(x) gtgt

ltbodygt

lthtmlgt

En ocasiones puede ser uacutetil recabar informacioacuten del sistema versioacuten de Java en usosistema operativo nombre de usuario etc Estos datos se pueden obtener medianteSystemgetProperty(propiedad)

Aplicaciones web en Java (JSP) 178

lt-- muestraInfojsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtInformacioacuten del entorno de trabajolth1gt

lt

outprint(Fabricante de Java + SystemgetProperty(javavendor))

outprint(ltbrgtUrl del fabricante + SystemgetProperty(javavendorurl))

outprint(ltbrgtVersioacuten + SystemgetProperty(javaversion))

outprint(ltbrgtSistema operativo + SystemgetProperty(osname))

outprint(ltbrgtUsuario + SystemgetProperty(username))

gt

ltbodygt

lthtmlgt

Para mostrar informacioacuten en una paacutegina de forma ordenada es muy frecuente utilizartablas Las tablas son especialmente uacutetiles para mostrar listados obtenidos de unabase de datos como veremos en el siguiente capiacutetuloEn el siguiente ejemplo se muestra una tabla con dos columnas en la primera columnase muestran los nuacutemeros del 0 al 9 y en la segunda sus correspondientes cuadrados

lt-- tablajsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltbodygt

lth1gtEjemplo de tablalth1gt

lttable border=2gt

lttrgt

lttdgtNuacutemerolttdgtlttdgtCuadradolttdgt

lttrgt

lt

for(int i = 0 i lt 10 i++)

outprintln(lttrgt)

outprintln(lttdgt + i + lttdgt)

outprintln(lttdgt)

outprintln(i i)

outprintln(lttdgtlttrgt)

Aplicaciones web en Java (JSP) 179

gt

lttablegt

ltbodygt

lthtmlgt

123 Recogida de datos en JSP

En cualquier aplicacioacuten web la introduccioacuten de datos se realiza mediante formulariosAunque se puede hacer todo en la misma paacutegina de momento vamos a tener dos Laprimera paacutegina contendraacute un formulario y seraacute la encargada de recoger la informacioacuteny enviarla a una segunda paacutegina Esta uacuteltima paacutegina recibiraacute los datos realizaraacute unaserie de caacutelculos u operaciones si procede y por uacuteltimo mostraraacute un resultadoEn el primer ejemplo - un proyecto que llamaremos PasoDeCadena - tenemos una paacuteginacon nombre indexjsp que contiene un formulario HTML Este formulario contiene unaentrada de texto donde el usuario introduciraacute una cadena de caracteres Es muyimportante darle un valor a la etiqueta name En el caso que nos ocupa tenemosname=cadenaIntro por tanto el dato que recoge el formulario se llama de esa maneraseriacutea el equivalente al nombre de la variable en Java No menos importante es indicarla paacutegina que recibiraacute los datos que recoge el formulario Esta informacioacuten se indicacon la etiqueta action en nuestro ejemplo action=frasejsp indica que seraacute el ficherofrasejsp el que recibiraacute cadenaIntroEl fichero indexjsp uacutenicamente contiene coacutedigo HTML por tanto se podriacutea llamarindexhtml y la aplicacioacuten funcionariacutea exactamente igual

lt-- indexjsp (proyecto PasoDeCadena) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtPaso de cadenalttitlegt

ltheadgt

ltbodygt

lth1gtPasando una cadena de caractereslth1gt

ltform method=post action=frasejspgt

Introduzca el nombre de una fruta

ltinput type=text name=cadenaIntrogt

ltinput type=submit value=OKgt

ltformgt

ltbodygt

lthtmlgt

Para recoger los datos enviados por un formulario se utiliza requestgetParameter(nombreDeVariable)

donde nombreDeVariable es el dato que se enviacutea desde el formulario En caso de que el

Aplicaciones web en Java (JSP) 180

dato enviado sea un texto que pueda contener tildes o entildees hay que especificar lacodificacioacuten mediante requestsetCharacterEncoding(UTF-8) antes de recoger el dato

lt-- frasejsp (proyecto PasoDeCadena) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtPaso de cadenalttitlegt

ltheadgt

ltbodygt

lt requestsetCharacterEncoding(UTF-8) gt

Me gusta mucho comer

lt outprint(requestgetParameter(cadenaIntro))gt

ltbodygt

lthtmlgt

En el siguiente ejemplo llamado Incrementa5 se muestra coacutemo manipular en JSP un datonumeacuterico La aplicacioacuten recoge un nuacutemero y luego muestra ese nuacutemero incrementadoen 5 unidades

lt-- indexjsp (proyecto Incrementa5) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

ltform method=get action=incrementa5jspgt

Introduzca un nuacutemero (puede tener decimales)

ltinput type=text name=numeroIntrogt

ltinput type=submit value=OKgt

ltformgt

ltbodygt

lthtmlgt

Observa en el fichero incrementa5jsp coacutemo se transforma la cadena de caracteresque se recibe en numeroIntro en un dato numeacuterico con el meacutetodo DoubleparseDoubleexactamente igual que si estuvieacuteramos leyendo un nuacutemero desde teclado en laventana de terminal

Aplicaciones web en Java (JSP) 181

lt-- incrementa5jsp (proyecto Incrementa5) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

El nuacutemero introducido maacutes cinco es

lt

double resultado

resultado = DoubleparseDouble(requestgetParameter(numeroIntro)) + 5

outprint(resultado)

gt

ltbodygt

lthtmlgt

El siguiente ejemplo ilustra la recogida y enviacuteo de dos variables x e y Observa queahora el formulario contiene dos entradas de texto una para cada variable

lt-- indexjsp (proyecto Suma) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtSumalttitlegt

ltheadgt

ltbodygt

lth1gtSupercalculadoralth1gt

ltform method=get action=resultadojspgt

x ltinput type=text name=xgtltbrgt

y ltinput type=text name=ygtltbrgt

ltinput type=submitgt

ltformgt

ltbodygt

lthtmlgt

En el fichero resultadojsp se reciben las variables recogidas en indexjsp y se sumanRecuerda que por defecto la informacioacuten enviada por un formulario es una cadenade caracteres Si queremos sumar los valores introducidos debemos transformar lascadenas de caracteres a nuacutemeros enteros con el meacutetodo IntegervalueOf()

Aplicaciones web en Java (JSP) 182

lt-- resultadojsp (proyecto Suma) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtSumalttitlegt

ltheadgt

ltbodygt

La suma es

lt

int primerNumero = IntegervalueOf(requestgetParameter(x))

int segundoNumero = IntegervalueOf(requestgetParameter(y))

outprintln(primerNumero + segundoNumero)

gt

ltbodygt

lthtmlgt

El siguiente proyecto de ejemplo es Animales En la paacutegina principal (indexjsp) se puedeseleccionar un animal - gato o caracol - y un nuacutemero Una vez introducidos los datoseacutestos se enviacutean a animalesjsp

lt-- indexjsp (proyecto Animales) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtAnimaleslttitlegt

ltheadgt

ltbodygt

ltform method=post action=animalesjspgt

Seleccione animal a visualizar

ltselect name=animalgt

ltoptiongtGatoltoptiongt

ltoptiongtCaracolltoptiongt

ltselectgt

ltbrgt

Nuacutemero de animales ltinput type=text name=numero size=3gt

ltbrgt

ltinput type=submitgt

ltformgt

ltbodygt

lthtmlgt

Aplicaciones web en Java (JSP) 183

La paacutegina animalesjsp nos mostraraacute una imagen del animal elegido repetida el nuacutemerode veces que hemos indicado

lt-- animalesjsp (proyecto Animales) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtAnimaleslttitlegt

ltheadgt

ltbodygt

lt

String nombreAnimal = requestgetParameter(animal)

String nombreImagen

if (nombreAnimalequals(Gato))

nombreImagen = gatojpg

else

nombreImagen = caracoljpg

int veces = IntegerparseInt(requestgetParameter(numero))

for (int i = 0 i lt veces i++)

outprint(ltimg src= + nombreImagen + width=20gt)

gt

ltbodygt

lthtmlgt

124 POO en JSP

En las aplicaciones realizadas en JSP se puenden incluir clases definidas por el usuariopara posteriormente crear objetos de esas clases Lo habitual es que el fichero quecontiene la definicioacuten de la clase se encuentre separado del programa principalEn un nuevo proyecto con nombre GatosConClase vamos a crear la clase Gato paraello haz clic derecho sobre el icono del proyecto selecciona Nuevo y luego seleccionaClase de Java El nombre de la clase seraacute Gato y el nombre del paquete seraacute porejemplo daw1El fichero Gatojava quedariacutea como el que se muestra a continuacioacuten

Aplicaciones web en Java (JSP) 184

Gatojava (proyecto GatosConClase)

package daw1

public class Gato

private String nombre

private String imagen

public Gato(String nombre String imagen)

thisnombre = nombre

thisimagen = imagen

public String getNombre()

return nombre

public String getImagen()

return imagen

Override

public String toString()

return ltimg src= + imagen + width=80gtHola soy + nombre + ltbrgt

public String maulla()

return ltimg src= + imagen + width=80gtMiauuuuuuuultbrgt

public String come(String comida)

return ltimg src= + imagen + width=80gtEstoy comiendo + comida + ltbrgt

Hemos creado una clase Gato muy sencilla que uacutenicamente contiene dos atributosel nombre del gato y el nombre del fichero de su foto Como meacutetodos se hanimplementado toString() maulla() y come()

Aplicaciones web en Java (JSP) 185

lt-- indexjsp (proyecto GatosConClase) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltpage import=daw1Gatogt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtGatos con claselttitlegt

ltheadgt

ltbodygt

lth1gtGatos con claselth1gt

lthrgt

lt

Gato g1 = new Gato(Pepe gatojpg)

Gato g2 = new Gato(Garfield garfieldjpg)

Gato g3 = new Gato(Tom tompng)

outprintln(g1)

outprintln(g2)

outprintln(g3)

outprintln(g1maulla())

outprintln(g2come(sardinas))

gt

ltbodygt

lthtmlgt

El coacutedigo Java del programa principal es casi ideacutentico al que tendriacuteamos en unprograma para consolaEl siguiente ejemplo - GatosConClaseYBocadillos - es una mejora del anterior Seantildeaden estilos5 para mostrar lo que dicen los gatos igual que en un coacutemic

Gatojava (proyecto GatosConClaseYBocadillos)

package daw1

public class Gato

private String nombre

private String imagen

public Gato(String nombre String imagen)

thisnombre = nombre

thisimagen = imagen

5httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos12_JSPGatosConClaseYBocadillosestiloscss

Aplicaciones web en Java (JSP) 186

public String getNombre()

return nombre

public String getImagen()

return imagen

Override

public String toString()

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspHola soy + nombre + ampnbspltdivgtltdivgt

public String maulla()

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspMiauuuuuuuuampnbspltdivgtltdivgt

public String come(String comida)

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspEstoy comiendo + comida + ampnbspltdivgtltdivgt

El uacutenico antildeadido al programa principal es una liacutenea situada en la cabecera de la paacuteginaque carga la hoja de estilos estiloscss

lt-- indexjsp (proyecto GatosConClaseYBocadillos) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltpage import=daw1Gatogt

ltDOCTYPE htmlgtlthtmlgt

ltheadgtltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gtlttitlegtGatos con clase y bocadilloslttitlegt

ltlink rel=stylesheet type=textcss href=estiloscss gtltheadgtltbodygtlth1gtGatos con claselth1gtlthrgtlt

Gato g1 = new Gato(Pepe gatojpg)

Aplicaciones web en Java (JSP) 187

Gato g2 = new Gato(Garfield garfieldjpg)

Gato g3 = new Gato(Tom tompng)

outprintln(g1)

outprintln(g2)

outprintln(g3)

outprintln(g1maulla())

outprintln(g2come(sardinas))

gt

ltbodygtlthtmlgt

Aplicaciones web en Java (JSP) 188

125 Ejercicios

Ejercicio 1Crea una aplicacioacuten web en Java que muestre tu nombre y tus datos personalespor pantalla La paacutegina principal debe ser un archivo con la extensioacuten jspComprueba que se lanzan bien el servidor y el navegador web Observa losmensajes que da el servidor Fiacutejate en la direccioacuten que aparece en la barra dedirecciones del navegador

Ejercicio 2Mejora el programa anterior de tal forma que la apariencia de la paacuteginaweb que muestra el navegador luzca maacutes bonita mediante la utilizacioacuten deCSS (utiliza siempre ficheros independientes para CSS para no mezclarlo conHTML)

Ejercicio 3Escribe una aplicacioacuten que pida tu nombre A continuacioacuten mostraraacute ldquoHolardquoseguido del nombre introducido El nombre se deberaacute recoger mediante unformulario

Ejercicio 4Realiza una aplicacioacuten que calcule la media de tres notas

Ejercicio 5Realiza un conversor de euros a pesetas

Ejercicio 6Realiza un conversor de pesetas a euros

Ejercicio 7Combina las dos aplicaciones anteriores en una sola de tal forma que en lapaacutegina principal se pueda elegir pasar de euros a pesetas o de pesetas a eurosAdorna la paacutegina con alguna foto o dibujo

Aplicaciones web en Java (JSP) 189

Ejercicio 8Realiza una aplicacioacuten que pida un nuacutemero y que luego muestre la tabla demultiplicar de ese nuacutemero El resultado se debe mostrar en una tabla (lttablegten HTML)

Ejercicio 9Realiza una aplicacioacuten que pinte una piraacutemide La altura se pediraacute en unformulario La piraacutemide estaraacute hecha de bolitas ladrillos o cualquier otraimagen

Ejercicio 10Realiza un cuestionario con 10 preguntas tipo test sobre las asignaturasque se imparten en el curso Cada pregunta acertada sumaraacute un punto Elprograma mostraraacute al final la calificacioacuten obtenida Paacutesale el cuestionario a tuscompantildeeros y piacutedeles que lo hagan para ver queacute tal andan de conocimientosen las diferentes asignaturas del curso Utiliza radio buttons en las preguntasdel cuestionario

Ejercicio 11Escribe una aplicacioacuten que genere el calendario de un mes Se pediraacute elnombre del mes el antildeo el texto que queremos que aparezca sobre elcalendario el diacutea de la semana en que cae el diacutea 1 y el nuacutemero de diacuteas quetiene el mes

Ejercicio 12Mejora la aplicacioacuten anterior de tal forma que no haga falta introducir el diacuteade la semana en que cae el diacutea 1 y el nuacutemero de diacuteas que tiene el mes Elprograma debe deducir estos datos del mes y el antildeo Pista puedes usar laclase Calendar (javautilCalendar)

Ejercicio 13Transforma el test de infidelidad realizado anteriormente para consola en unaaplicacioacuten web

Aplicaciones web en Java (JSP) 190

Ejercicio 14Escribe un programa que muestre los n primeros teacuterminos de la serie deFibonacci El primer teacutermino de la serie de Fibonacci es 0 el segundo es 1y el resto se calcula sumando los dos anteriores por lo que tendriacuteamos quelos teacuterminos son 0 1 1 2 3 5 8 13 21 34 55 89 144hellip El nuacutemero n sedebe introducir por teclado

Ejercicio 15Realiza una aplicacioacuten que genere 100 nuacutemeros aleatorios del 1 al 200 Losprimos deberaacuten aparecer en un color diferente al resto

Ejercicio 16Realiza una aplicacioacuten que muestre la tirada aleatoria de tres dados de poacutekerUtiliza imaacutegenes de dados reales

Ejercicio 17Realiza un configurador del interior de un vehiacuteculo El usuario puede elegirmediante un formulario el color de la tapiceriacutea ndash blanco negro o berengena -y el material de las molduras ndash madera o carbono Se debe mostrar el interiordel coche tal y como lo quiere el usuario

Ejercicio 18Crea la aplicacioacuten ldquoEl Trilerdquo Deben aparecer tres cubiletes por pantalla y elusuario deberaacute seleccionar uno de ellos Para dicha seleccioacuten se puede usar unformulario con radio-button una lista desplegable hacer clic en el cubilete o loque resulte maacutes faacutecil Se levantaraacuten los tres cubiletes y se veraacute si estaba o nola bolita dentro del que el usuario indicoacute asiacute mismo se mostraraacute un mensajediciendo ldquoLo siento no has acertadordquo o ldquoiexclEnhorabuena has encontrado labolitardquo La probabilidad de encontrar la bolita es de 13

Ejercicio 19Crea el juego ldquoApuesta y ganardquo El usuario debe introducir inicialmente unacantidad de dinero A continuacioacuten apareceraacute por pantalla una imagen deforma aleatoria Si sale una calavera el usuario pierde todo su dinero y terminael juego Si sale medio limoacuten el usuario pierde la mitad del dinero y puedeseguir jugando con esa cantidad o puede dejar de jugar Si sale el gato chinode la suerte el usuario multiplica por dos su dinero y puede seguir jugandocon esa cantidad o puede dejar de jugar

Aplicaciones web en Java (JSP) 191

Ejercicio 20Crea una aplicacioacuten que dibuje un tablero de ajedrez mediante una tabla HTMLgenerada con bucles usando JSP y que situacutee dentro del tablero un alfil y uncaballo en posiciones aleatorias Las dos figuras no pueden estar colocadas enla misma casilla Las filas y las columnas del tablero deben estar etiquetadascorrectamente

13 Acceso a bases de datosEn el capiacutetulo 11 vimos coacutemo almacenar informacion en ficheros de texto de tal formaque esta informacioacuten no se pierde cuando el programa se cierra Normalmente losficheros de texto se usan en casos concretos como archivos de configuracioacuten o archivosde registro (log)Las bases de datos relacionales entran en juego cuando se necesita almacenar muchainformacioacuten y ademaacutes esta informacioacuten es homogeacutenea y se puede representarmediante tablas Por ejemplo una aplicacioacuten que permita gestionar la matriculacioacutende los alumnos de un centro educativo deberaacute ser capaz de almacenar los datos degran cantidad de alumnos (puede que miles) En este caso concreto cada alumno serepresenta mediante un registro que contiene determinados datos como el nuacutemerode expediente el nombre los apellidos la nota media etc A estos datos se les llamacamposEn este capiacutetulo vamos a ver coacutemo se puede acceder mediante Java a una basede datos relacional MySQL para hacer listados insertar nuevos elementos y borrarelementos existentesLos programas de ejemplo que se muestran en este capiacutetulo son aplicaciones JSPaprovechando lo visto en el capiacutetulo anterior aunque tambieacuten se puede acceder auna base de datos desde un programa en Java escrito para la consola

131 Socios de un club de baloncesto

Para ilustrar el acceso a una base de datos mediante Java vamos a utilizar comoejemplo un club de baloncesto Nuestro club necesita tener almacenada la informacioacutende todos los socios Sobre cada socio se necesita saber su nombre completo suestatura su edad y su localidad de residencia Cada socio tendraacute ademaacutes un nuacutemerode identificacioacuten uacutenico que seraacute el nuacutemero de socioNuestra aplicacioacuten consistiraacute en varias paacuteginas JSP que van a permitir ver un listadocon los datos de todos los socios dar de alta un nuevo miembro en el club y tambieacutenborrar o modificar los datos de un determinado socioSi todaviacutea no tienes instalado en tu equipo el gestor de bases de datosMySQL deberaacutesinstalarlo Tambieacuten es recomendable instalar PHPMyAdmin que es una aplicacioacuten quepermite crear y manejar bases de datos MySQL de una forma muy sencilla medianteuna interfaz web

192

Acceso a bases de datos 193

Instalacioacuten de MySQL

sudo apt-get install mysql-server

sudo apt-get install mysql-client

Para el usuario root de MySQL deberaacutes establecer la contrasentildea root para quete funcionen correctamente los ejemplos

Instalacioacuten de PHPMyAdmin

sudo apt-get install phpmyadmin

Para acceder a PHPMyAdmin debes escribir httplocalhostphpmyadmin en labarra de direcciones del navegador

Deberaacutes crear la base de datos MySQL a la que llamaraacutes baloncesto que contendraacuteuna tabla de nombre socio con los campos socioID nombre estatura edad y localidad yluego deberaacutes antildeadir los datos de los socios Todo esto lo tienes ya preparado en unfichero con nombre baloncestosql que estaacute en GitHub en la direccioacuten httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDbaloncestosql Descaacutergate este fichero lo utilizaremos en seguidaA continuacioacuten mostramos un fragmento del fichero baloncestosql para que veas coacutemose crea la base de datos la tabla socio y coacutemo se introducen los datos de muestra

---- Base de datos `baloncesto`--CREATE DATABASE IF NOT EXISTS `baloncesto` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

USE `baloncesto`

-- --------------------------------------------------------

---- Estructura de tabla para la tabla `socio`--

CREATE TABLE IF NOT EXISTS `socio` (

`socioID` int(11) NOT NULL`nombre` varchar(40) COLLATE utf8_spanish2_ci DEFAULT NULL`estatura` int(11) DEFAULT NULL`edad` int(11) DEFAULT NULL`localidad` varchar(30) COLLATE utf8_spanish2_ci DEFAULT NULLPRIMARY KEY (`socioID`)

Acceso a bases de datos 194

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci

---- Volcado de datos para la tabla `socio`--

INSERT INTO `socio` (`socioID` `nombre` `estatura` `edad` `localidad`) VALUES(1235 Bermuacutedez Espada Ana Mariacutea 186 46 Maacutelaga)

(1236 Cano Cuenca Margarita 161 48 Maacutelaga)

En dos sencillos pasos tendraacutes preparada y lista para usar la base de datos de ejemploPara acceder a PHPMyAdmin debes escribir httplocalhostphpmyadmin en la barrade direcciones de tu navegador A continuacioacuten teclea el nombre de usuario y lacontrasentildea Si has instalado MySQL como te hemos indicado tanto el nombre deusuario como la contrasentildea deberiacutean ser root

A continuacioacuten haz clic en la pestantildea Importar y seguidamente en el botoacuten Exami-nar Selecciona el fichero baloncestosql que descargaste antes

Acceso a bases de datos 195

Si has seguido correctamente los pasos ya tienes la base de datos lista para usardesde un programa escrito en Java

132 Preparacioacuten del proyecto de ejemplo

1321 Activar la conexioacuten a MySQL

Abre el entorno Netbeans y crea un nuevo proyecto del tipo Java Web - como vimosen el capiacutetulo 12 - y noacutembralo BaloncestoAhora es necesario activar el servicio de bases de datos Haz clic en la pestantildeaServicios (estaacute junto a la pestantildea Proyectos) Haz clic con el botoacuten derecho enBasesde datos y luego selecciona Nueva conexioacuten A continuacioacuten aparece una ventanapara seleccionar el driver debes seleccionar MySQL (ConnectorJdriver)

Acceso a bases de datos 196

Una vez se haya establecido el servicio veraacutes las bases de datos disponibles en unaestructura de aacuterbol Puedes ir desplegando hasta encontrar la base de datos baloncesto

y la tabla socio que contiene los campos socioID nombre estatura edad y localidad

Una vez activada la conexioacuten a MySQL no es necesario realizarla de nuevo para cada

Acceso a bases de datos 197

proyecto

1322 Incluir la libreriacutea MySQL JDBC

Cada proyecto de aplicacioacuten en Java que haga uso de una base de datos MySQLdeberaacute incluir la libreriacutea MySQL JDBC Para incluir esta libreriacutea despliega el proyectoBaloncesto haz clic con el botoacuten derecho en Libreriacuteas selecciona Antildeadir libreriacuteay por uacuteltimo selecciona MySQL JDBC Driver

133 Listado de socios

El primer ejemplo de acceso a una base de datos mediante Java que veremos seraacute unlistado Si echas un vistazo desde PHPMyAdmin a la tabla socio de la base de datosbaloncesto veraacutes que ya contiene informacioacuten sobre maacutes de 20 socios Nuestro primerejemplo seraacute una aplicacioacuten en Java que mueste todos esos datos en una paacuteginaweb Copia el archivo listadoSociosjsp1 a la carpeta principal del proyecto (donde estaacuteindexhtml) Para ejecutarlo haz clic con el botoacuten derecho y selecciona EjecutarA continuacioacuten tienes el coacutedigo JSP del listado de socios

1httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDBaloncestolistadoSociosjsp

Acceso a bases de datos 198

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtListado Socioslttitlegt

ltheadgt

ltbodygt

lth1gtListado de Socioslth1gt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balonce

storoot root)

Statement s = conexioncreateStatement()

ResultSet listado = sexecuteQuery (SELECT FROM socio)

while (listadonext())

outprintln(listadogetString(socioID) + + listadogetString(nombre) + ltbrgt

)

conexionclose()

gt

ltbodygt

lthtmlgt

Si todo ha salido bien al ejecutar el archivo - haciendo clic con el botoacuten derecho sobreel archivo y seleccionando Ejecutar - veraacutes por pantalla un listado como el siguientecon el nuacutemero y el nombre de cada socio

Acceso a bases de datos 199

Vamos a ldquodiseccionarrdquo el coacutedigo Las siguientes tres liacuteneas son obligatorias y deberaacutescopiarlas en todas las paacuteginas JSP que accedan a una base de datos Lo uacutenico quetendraacutes que cambiar es el nombre de la base de datos - la de nuestro ejemplo sellama baloncesto - seguacuten el caso

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306baloncesto

root root)

Statement s = conexioncreateStatement()

La siguiente liacutenea ejecuta la consulta

SELECT FROM socio

sobre la base de datos y guarda el resultado en el objeto listado Esta consulta extraetodos los datos () de la tabla socio Si quisieacuteramos obtener esos datos ordenados pornombre la consulta seriacutea

SELECT FROM socio ORDER BY nombre

Aquiacute estaacute la liacutenea en cuestioacuten

Acceso a bases de datos 200

ResultSet listado = sexecuteQuery (SELECT FROM socio)

Una vez extraiacutedos los datos en bruto hace falta ir sacando cada uno de los registroses decir cada una de las liacuteneas En cada liacutenea se van a mostrar los datos de un socioPara ello usamos un while que va extrayendo liacuteneas mientras quede alguna en el objetolistado

while (listadonext())

outprintln(listadogetString(socioID) + + listadogetString(nombre) + ltbrgt)

Observa que el meacutetodo getString toma como paraacutemetro el nombre de un campoEn este ejemplo estamos mostrando uacutenicamente los nuacutemeros de socio con suscorrespondientes nombres Si quisieacuteramos mostrar tambieacuten la altura de cada sociola podemos extraer mediante listadogetString(altura)

134 Alta

Para dar de alta un nuevo socio necesitamos recoger los datos mediante un formularioque puede ser un programa JSP o simplemente una paacutegina HTML Estos datos recogidospor el formulario seraacuten enviados a otra paacutegina encargada de grabarlos en la tabla socio

de la base de datos baloncesto mediante el comando INSERT de SQLA continuacioacuten se muestra el coacutedigo de formularioSociojsp que recoge los datos delnuevo socio Como puedes comprobar es un simple formulario HTML y no contienecoacutedigo en Java

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgtlthtmlgtltheadgtltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgtltbodygtlth2gtIntroduzca los datos del nuevo sociolth2gtltform method=get action=grabaSociojspgtNordm socio ltinput type=text name=numerogtltbrgtNombre ltinput type=text name=nombregtltbrgtEstatura ltinput type=text name=estaturagtltbrgtEdad ltinput type=text name=edadgtltbrgtLocalidad ltinput type=text name=localidadgtltbrgtltinput type=submit value=Aceptargt

ltformgtltbodygt

lthtmlgt

Acceso a bases de datos 201

El siguiente programa - grabaSociojsp - se encarga de tomar los datos que enviacuteaformularioSociojsp y grabarlos en la base de datosIgual que en los programas del capiacutetulo 12 incluimos esta liacutenea para poder recogercorrectamente cadenas de caracteres que contienen tildes la letra ntilde etc

requestsetCharacterEncoding(UTF-8)

La variable insercion es una cadena de caracteres en la que se va componiendo a basede ir juntando trozos la sentencia SQL correspondiente a la insercioacuten

String insercion = INSERT INTO socio VALUES (

+ IntegervalueOf(requestgetParameter(numero))

+ + requestgetParameter(nombre)

+ + IntegervalueOf(requestgetParameter(estatura))

+ + IntegervalueOf(requestgetParameter(edad))

+ + requestgetParameter(localidad) + )

Una vez que se han recogido los datos del formulario y se ha creado la cadena en lavariable insercion deberiacutea quedar algo como esto

INSERT INTO socio VALUES (6789 Brito Fino Alan 180 40 Benalmaacutedena)

Por uacuteltimo se ejecuta la sentencia de insercioacuten mediante sexecute(insercion)A continuacioacuten tienes el coacutedigo completo de grabaSociojsp

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

requestsetCharacterEncoding(UTF-8)

Acceso a bases de datos 202

String insercion = INSERT INTO socio VALUES (

+ IntegervalueOf(requestgetParameter(numero))

+ + requestgetParameter(nombre)

+ + IntegervalueOf(requestgetParameter(estatura))

+ + IntegervalueOf(requestgetParameter(edad))

+ + requestgetParameter(localidad) + )

sexecute(insercion)

conexionclose()

gt

Socio dado de alta

ltbodygt

lthtmlgt

Al componer una sentencia SQL concatenando trozos es frecuente que seproduzcan errores porque faltan o sobran comillas pareacutentesis comas etc Sise produce un error al ejecutar la sentencia la manera maacutes faacutecil de detectarloes mostrar por pantalla la sentencia Por ejemplo si la sentencia es unainsercioacuten de datos y la cadena de caracteres que la contiene se llama insercioncomo en el ejemplo que acabamos de ver simplemente tendriacuteamos queescribir outprintln(insercion)

135 Borrado

El borrado al igual que el alta se realiza en dos pasos En el primer paso se carga lapaacutegina pideNumeroSociojsp que muestra en una tabla todos los socios cada uno en unafila Junto a cada socio se coloca un botoacuten borrar que al ser pulsado enviacutea el nuacutemerode socio a la paacutegina borraSociojsp que se encarga de ejecutar la sentencia SQL deborradoLa tabla con los socios y los botones de borrado quedariacutea como se muestra acontinuacioacuten

Acceso a bases de datos 203

A continucacioacuten se muestra el coacutedigo de pideNumeroSociojsp El fichero estiloscss2 seencuentra disponible en GitHub igual que el resto de archivos

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltlink rel=stylesheet type=textcss href=estiloscss gt

ltheadgt

ltbodygt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

2httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDBaloncestoestiloscss

Acceso a bases de datos 204

ResultSet listado = sexecuteQuery (SELECT FROM socio)

gt

lttablegt

lttrgtltthgtCoacutedigoltthgtltthgtNombreltthgtltthgtEstaturaltthgtltthgtEdadltthgtltthgtLocalidadltthgtlt

trgt

lt

while (listadonext())

outprintln(lttrgtlttdgt)

outprintln(listadogetString(socioID) + lttdgt)

outprintln(lttdgt + listadogetString(nombre) + lttdgt)

outprintln(lttdgt + listadogetString(estatura) + lttdgt)

outprintln(lttdgt + listadogetString(edad) + lttdgt)

outprintln(lttdgt + listadogetString(localidad) + lttdgt)

gt

lttdgt

ltform method=get action=borraSociojspgt

ltinput type=hidden name=codigo value=lt=listadogetString(socioID) gtgt

ltinput type=submit value=borrargt

ltformgt

lttdgtlttrgt

lt

whileconexionclose()

gt

lttablegt

ltbodygt

lthtmlgt

A continuacioacuten se muestra el coacutedigo de borraSociojsp Como puedes comprobar lasentencia SQL que borra el registro deseado es un DELETE que toma como referencia elnuacutemero de socio para realizar el borrado

ltpage import=javasqlResultSetgt

ltpage import=javasqlStatementgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

Acceso a bases de datos 205

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

sexecute (DELETE FROM socio WHERE socioID= + requestgetParameter(codigo))

gt

ltscriptgtdocumentlocation = pideNumeroSociojspltscriptgt

ltbodygt

lthtmlgt

136 CRUD completo con Bootstrap

Los programas que ofrecen la posibilidad de hacer listados y de realizar modificacionesy borrado sobre los registros de una tabla se denominan CRUD que son las siglas eningleacutes de Create Read Update y Delete en espantildeol se diriacutea que es un programa dealta listado modificacioacuten y borrado El coacutedigo fuente completo estaacute disponible en lacarpeta BaloncestoMejorado de nuestro repositorio en GitHub3

Para dar de alta un nuevo socio simplemente habriacutea que rellenar los campos delformulario que aparecen en la primera liacutenea y hacer clic en el botoacuten Antildeadir Laaplicacioacuten comprueba si el nuacutemero de socio introducido ya existe en la base de datosy en tal caso muestra un mensaje de error recuerda que el nuacutemero de socio es uacutenico

3httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciostreemasterejemplos13_JSP_y_BBDDBaloncestoMejorado

Acceso a bases de datos 206

El borrado se lleva a cabo de la misma manera que en el ejemplo del apartado anteriorEl botoacuten Modificar nos lleva a otra paacutegina que contiene un formulario con todos losdatos del socio donde podemos modificar la informacioacuten necesaria A continuacioacuten semuestra una captura

Para los estilos - colores botones iconos etc - hemos utilizado Boostrap4 Boostrapes un framework que incluye unos estilos predefinidos para que con solo incluirloen nuestro proyecto la aplicacioacuten tenga una apariencia bonita y homogeacutenea Puedesencontrar maacutes informacioacuten de coacutemo utilizar este framework en la paacutegina oficial deBoostrap5

4httpgetbootstrapcom5httpgetbootstrapcom

Acceso a bases de datos 207

137 Ejercicios

Ejercicio 1Establece un control de acceso mediante nombre de usuario y contrasentildeapara alguno de los programas de la relacioacuten anterior (por ejemplo el quepinta una piraacutemide) Lo primero que apareceraacute por pantalla seraacute un formulariopidiendo el nombre de usuario y la contrasentildea Si el usuario y la contrasentildea soncorrectos se podraacute acceder al ejercicio en caso contrario volveraacute a aparecerel formulario pidiendo los datos de acceso y no se nos dejaraacute ejecutar laaplicacioacuten hasta que iniciemos sesioacuten con un nombre de usuario y contrasentildeacorrectos Los nombres de usuario y contrasentildeas deben estar almacenados enla tabla de una base de datos

Acceso a bases de datos 208

Ejercicio 2Mejora el programa anterior de tal forma que se puedan dar de alta nuevosusuarios para acceder a la aplicacioacuten Si se introduce un nombre de usuarioque no sea el administrador (admin) y una contrasentildea correcta la aplicacioacutenfuncionaraacute exactamente igual que el ejercicio anterior Si se introduce elusuario admin y la contrasentildea correcta la aplicacioacuten entra en la gestioacuten deusuarios donde se podraacuten dar de alta nuevos usuarios indicando nombre deusuario y contrasentildea No puede haber dos nombres de usuario iguales aunquesiacute puede haber claves repetidas

Acceso a bases de datos 209

Ejercicio 3Ampliacutea el programa anterior para que se pueda asignar o quitar permiso paraejecutar las aplicaciones de la relacioacuten anterior a los distintos usuarios Porejemplo que se pueda especificar que el usuario ldquojaimitordquo pueda ejecutar losejercicios 2 3 y 5 Para ello en la base de datos deberaacute existir una tabla con lasparejas (usuario nordm ejercicio) Por ejemplo si el usuario ldquojaimitordquo tiene accesoa los ejercicios 2 3 y 5 en la tabla correspondiente estaraacuten las parejas (jaimito2) (jaimito 3) y (jaimito 5) Lo ideal es que la asignacioacuten de permisos se hagamediante el marcado de muacuteltiples ldquocheckboxrdquo

Acceso a bases de datos 210

Ejercicio 4Crea una aplicacioacuten web que permita hacer listado alta baja y modificacioacutensobre la tabla cliente de la base de datos banco Un cliente tiene su identifica-dor nombre completo direccioacuten teleacutefono y fecha de nacimiento

Acceso a bases de datos 211

Ejercicio 5Ampliacutea el programa anterior para que se pueda hacer una buacutesqueda por nom-bre El programa buscaraacute la cadena introducida dentro del campo ldquonombrerdquoy si hay varias coincidencias se mostraraacute una lista de clientes para poderseleccionar uno de ellos y ver todos los datos Si solo hay una coincidencia semostraraacuten directamente los datos del cliente en cuestioacuten

Acceso a bases de datos 212

Ejercicio 6Crea una versioacuten web del programa GESTISIMAL (GESTIoacuten SIMplifcada deAlmaceacuten) para llevar el control de los artiacuteculos de un almaceacuten De cada artiacuteculose debe saber el coacutedigo la descripcioacuten el precio de compra el precio de ventay el stock (nuacutemero de unidades) La entrada y salida de mercanciacutea suponerespectivamente el incremento y decremento de stock de un determinadoartiacuteculo Hay que controlar que no se pueda sacar maacutes mercanciacutea de la que hayen el almaceacuten Aprovecha las opciones que puede ofrecer una interfaz webpor ejemplo para eliminar un artiacuteculo ya no seraacute necesario pedir el coacutedigo sinoque se puede mostrar un listado de todos los artiacuteculos de tal forma que sepuedan borrar un artiacuteculo directamente pulsando un botoacuten

213

Apeacutendice A Ejercicios de ampliacioacuten 214

Apeacutendice A Ejercicios de ampliacioacuten

Ejercicio 1 Transcomunicacioacuten instrumental mediante ficherosde texto digitalesSe conoce la transcomunicacioacuten instrumental (TCI) como la teacutecnica decomunicacioacuten que utiliza aparatos electroacutenicos para establecer comunicacioacutencon los espiacuteritus El caso de TCI maacutes conocido es el de la psicofoniacuteaPara realizar una psicofoniacutea se pone a grabar al aire un dispositivo en unlugar donde previamente hayan ocurrido fenoacutemenos extrantildeos o simplementese invoca la entidad que queremos que se comunique mediante el ritualadecuado Posteriormente se escucha la grabacioacuten para comprobar si se hagrabado algo un mensaje una palabra un grito un lamentohellipLos sonidos extrantildeos se graban gracias a lo que se llama en teacuterminosparapsicoloacutegicos una sentildeal portadora puede ser el chasquido de una ramauna racha de viento un golpe La entidad comunicante aprovecha ese sonidopara supuestamente moldearlo y convertirlo en un mensaje inteligible Muchasde las psicofoniacuteas se realizan utilizando como portadora el ruido que produceuna radio que no estaacute sintonizadaEl ejercicio que se propone es la realizacioacuten de un programa que permitarealizar la TCI mediante la creacioacuten y el posterior anaacutelisis de ficherosde textoEn primer lugar el programa deberaacute generar la portadora que seraacute un ficherode texto creado con caracteres producidos de forma aleatoria Se podraacutenespecificar varios paraacutemetros como el nuacutemero de liacuteneas o paacuteginas que sequieren generar si se incluyen letras uacutenicamente o bien letras y nuacutemerosfrecuencia aproximada de espacios saltos de liacutenea y signos de puntuacioacutenetc Se obtienen portadoras de calidad - con maacutes probabilidad de contenermensajes - cuando la proporcioacuten de las letras que contienen eacutestas coincidecon las del idioma espantildeolFrecuencia de aparicioacuten de letrashttpeswikipediaorgwikiFrecuencia_de_apariciC3B3n_de_letras

Una vez creado el fichero de texto el programa deberaacute ser capaz de analizarloal menos de una forma superficial de modo que nos resulte faacutecil encontrar losposibles mensajes Para realizar este anaacutelisis el programa iraacute comparandouna a una todas las palabras que aparecen en el texto con las que hay enel diccionario de espantildeol En caso de coincidencia la palabra o palabrasencontradas deben aparecer resaltadas con un color diferente al resto deltexto o bien en viacutedeo inverso Opcionalmente se pueden mostrar estadiacutesticascon el nuacutemero total de palabras encontradas distancia media entre esaspalabras palabras reales por cada mil palabras generadas etcEl alumno puede encontrar ficheros con las palabras que tiene el idiomaespantildeol en formato digital en la siguiente direccioacuten Se trata de una muestrahay otros muchos diccionarios disponibles en internethttplasrcsuclaedugeoffispell-dictionarieshtmlSpanish-dicts

Apeacutendice A Ejercicios de ampliacioacuten 215

Ejercicio 2 Coleccioacuten de discos ampliado (con canciones)Este ejercicio consiste en realizar una mejora del ejercicio del capiacutetulo 10que permite gestionar una coleccioacuten de discos Ahora cada disco contienecanciones Deberaacutes crear la clase Cancion con los atributos y meacutetodos queestimes oportunos Antildeade el atributo canciones a la clase Disco Este atributocanciones debe ser un array de objetos de la clase CancionFiacutejate bien que Cancion NO ES una subclase de Disco sino que ahora cadadisco puede tener muchas canciones que estaacuten almacenadas en el atributocancionesModifica convenientemente el meacutetodo toString para que al mostrarse los datosde un disco se muestre tambieacuten la informacioacuten sobre las canciones quecontieneLa aplicacioacuten debe permitir antildeadir borrar y modificar las canciones de losdiscos

Apeacutendice B Entorno de Desarrollo IntegradoNetbeansNetbeans es un IDE (Integrated Development Environment) es decir un Entornode Desarrollo Integrado Consta de un potente editor y de todas las herramientasnecesarias para codificar compilar depurar y ejecutar una aplicacioacutenEste IDE tiene algunas caracteriacutesticas que lo hacen muy atractivo para los programa-dores

bull Es el IDE oficial para desarrollar en Java6bull Chequea errores de sintaxis y da advertencias al mismo tiempo que se escribe el

coacutedigobull Tiene autocompletado inteligente de palabras clave clases meacutetodos paraacuteme-

troshellipbull Permite depurar una aplicacioacuten ejecutaacutendola paso a paso y ver el contendido de

todas las variables en tiempo realbull Soporta muchos lenguajes de programacioacuten ademaacutes de Java PHP Groovy HTML

XML Javascript JSPhellipbull Existe una gran variedad de plugins que ampliacutean las funcionalidades del entorno

Descarga e instalacioacuten

Netbeans se puede descargar de forma gratuita y para cualquier plataforma desdehttpsnetbeansorgdownloads

6Esto no es casualidad ya que es la misma empresa - Oracle - la que estaacute detraacutes del desarrollo de Java y tambieacuten la quesoporta Netbeans

216

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 217

Figura B1 Descarga de Netbeans

El programa de instalacioacuten de Netbeans estaacute disponible en varios paquetes seguacutenel lenguaje de programacioacuten y las tecnologiacuteas que se incluyen En el momento deescribir este libro los paquetes disponibles son Java SE Java EE HTML5JavaScriptPHP CC++ All Este uacuteltimo paquete (All) instala todos los lenguajes y tecnologiacuteasdisponibles para el IDE (sin contar los plugins) Para seguir este libro es suficientecon la versioacuten Java EE sin embargo animo al lector a descargar la versioacuten completa yexperimentar con otros lenguajes diferentes a Java por ejemplo con PHP7

Configuracioacuten

En los ejemplos y soluciones a los ejercicios de este libro nos centildeimos al los estaacuten-dares de programacioacuten de Google para el coacutedigo fuente escrito en el lenguaje deprogramacioacuten Java8 Por tanto despueacutes de la instalacioacuten de Netbeans es necesariorealizar algunso ajustes en la configuracioacuten del editor para cumplir con las siguientescondiciones

7httpsleanpubcomaprendephpconejercicios8httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 218

bull La tecla TAB debe insertar espacios no debe insertar el caraacutecter de tabulacioacutenbull La indentacioacuten debe ser de 2 caracteres (por defecto suele estar a 4)bull La condificacioacuten de caracteres debe ser UTF-8

Para ello selecciona Herramientas rarr Opciones rarr Editor A continuacioacuten seleccionala pestantildea Formato y en el menuacute desplegable correspondiente al lenguaje deprogramacioacuten selecciona Java La configuracioacuten deberiacutea quedar como se indica enla imagen

Figura B2 Configuracioacuten de Netbeans

Creacioacuten de un proyecto

Sigue los pasos que damos a continuacioacuten para crear un nuevo proyecto de Java enNetbeansEn primer lugar desde el menuacute principal selecciona Archivo y a continuacioacuten NuevoProyecto Se puede hacer maacutes raacutepido con la combinacioacuten Control + Mayuacutescula + NVeraacutes que aparece una ventana emergente para elegir el tipo de proyecto SeleccionaJava en el apartado ldquoCategoriacuteasrdquo y Aplicacioacuten Java en el apartado ldquoProyectosrdquo Hazclic en Siguiente

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 219

Figura B3 Nuevo proyecto en Java

Ahora es necesario darle el nombre al proyecto lo puedes llamar por ejemplo SaludoRecuerda no utilizar caracteres especiales ni signos de puntuacioacuten Se crearaacute unacarpeta con el mismo nombre que el proyecto que contendraacute todos los ficherosnecesarios Aseguacuterate de que la casilla Crear la clase principal estaacute marcada Hazclic en Terminar

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 220

Figura B4 Proyecto ldquoSaludordquo

Veraacutes que se ha creado el ldquoesqueletordquo de la aplicacioacuten La clase principal se llamaSaludo y contiene el main que seraacute el cuerpo principal del programa Observa que en laparte de la izquierda donde estaacuten todos los proyectos que se van realizando puedesver la estructura de carpetas y ficheros El coacutedigo fuente de nuestra aplicacioacuten estaacuteen el fichero Saludojava Escribe dentro del main la siguiente liacutenea

Systemoutprintln(iexclHola mundo)

Para guardar compilar y ejecutar basta con hacer clic en el botoacuten verde con el iconode Play o bien pulsar la tecla F6

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 221

Figura B5 Ejecucioacuten del proyecto

Si todo ha salido bien veraacutes el mensaje iexclHola mundo en la ventana de terminal integradade Netbeans que hay justo debajo del editor

Depuracioacuten

El entornoNetbeans permite la depuracioacuten paso a paso de un programa En ocasioneses complicado encontrar y corregir los fallos de una aplicacioacuten y ayuda mucho tenerla posibilidad de ir ejecutando un programa liacutenea a liacutenea y ver coacutemo van cambiandolas variablesPara ilustrar la depuracioacuten paso a paso vamos a utilizar un programa de ejemplo delCapiacutetulo 7 Arrays en concreto usaremos el coacutedigo de Array03javaCrea un nuevo proyecto de Java como se ha indicado en el apartado anterior y llaacutemaloArray03 A continuacioacuten copia el contenido del main del fichero Array03java en tuproyecto Ten cuidado de no borrar la liacutenea package array03Comenzaremos la ejecucioacuten paso a paso del programa pulsando de manera sucesivala tecla F7

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 222

Figura B6 Ejecucioacuten paso a paso

Observa coacutemo Netbeans resalta una liacutenea la ejecuta se detiene y espera quesigamos pulsando F7 En la parte de abajo ha aparecido una nueva ventana que resultatremendamente uacutetil Se trata de una zona donde puedes ver en tiempo real el valorque tiene cada variable (por supuesto se incluyen los arrays)Ve pulsando F7 hasta colocarte en la liacutenea siguiente

num[2] = 200

En la ventana inferior donde aparecen todos los datos despliega el array num veraacutesque los elementos 0 y 1 ya tienen los valores 8 y 33 respectivamente Si vuelves apulsar F7 veraacutes que ahora en la posicioacuten 2 se ha almacenado el 200Para salir del modo ldquopaso a pasordquo y terminar de ejecutar el programa pulsa F5Ademaacutes de la ejecucioacuten ldquopaso a pasordquo tambieacuten resultan muy uacutetiles los puntos deruptura o breakpoints Se trata de marcas a modo de sentildeales de STOP dondeindicamos pausas en la ejecucioacuten del programa La depuracioacuten de un programa devarios cientos o miles de liacuteneas puede ser muy tediosa si se ejecuta cada liacutenea paso a

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 223

paso con F7 Los breakpoints permiten parar la ejecucioacuten en liacuteneas concretas dondequeremos ver con maacutes detalle queacute estaacute sucediendo en nuestro programaVamos a colocar varios breakpoints en nuestro coacutedigo Haz clic sobre las liacuteneas 15 20y 24 (justo encima del nuacutemero de liacutenea) Observa que estas liacuteneas quedan marcadascon un pequentildeo cuadradito

Figura B7 Breakpoints

Pulsa la combinacioacuten de teclas Control + F5 Observa coacutemo el programa empiezaa ejecutarse con normalidad y se para justo en la liacutenea 15 donde estaacute el primerbreakpoint Pulsando ahora F5 el programa continuacutea ejecutaacutendose hasta que se paraen la liacutenea 20 donde estaacute el segundo breakpoint Otra pulsacioacuten de F5 hace quecontinuacutee la ejecucioacuten hasta la liacutenea 24 Una uacuteltima pulsacioacuten de esta tecla hace que elprograma continuacutee la ejecucioacuten hasta el final

Apeacutendice C Caracteres especialesLiacuteneas para tablas

Bloques

⊞ ⊟ ⊠ ⊡

Figuras de ajedrez

Ciacuterculos

oplus ⊖ otimes ⊘ ⊙ ⊛ ⊜ ⊝ ⴱ ⴲ ⵀ ⵁ ⵔ ⵕ ⵙ ⵚ

Flechas

larr uarr rarr darr harr ↚ ↛ ↠ ↣ ↦ ↮ crarr ⇎ ⇏ lArr uArr rArr dArr hArr ⇴ ⇵ ⇶ ⇷ ⇸ ⇹ ⇺ ⇻ ⇼ ⇽ ⇾ ⇿

Nuacutemeros en ciacuterculos

❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓

Dados

Fichas de dominoacute

127024 127025 127026 127027 127028 127029 127030 127031 127032 127033 127034 127035 127036 127037 127038 127039 127040 127041 127042 127043 127044 127045 127046 127047 127048 127049127050 127051 127052 127053 127054 127055 127056 127057 127058 127059 127060 127061 127062 127063 127064 127065 127066 127067 127068 127069 127070 127071 127072 127073 127074 127075127076 127077 127078 127079 127080 127081 127082 127083 127084 127085 127086 127087 127088 127089 127090 127091 127092 127093 127094 127095 127096 127097 127098 127099 127100 127101 127102 127103 127104 127105 127106 127107 127108 127109 127110 127111 127112 127113127114 127115 127116 127117 127118 127119 127120 127121 127122 127123

224

Apeacutendice C Caracteres especiales 225

Cartas

127136 127137 127138 127139 127140 127141 127142 127143 127144 127145 127146 127147 127148 127149 127150 127153 127154 127155 127156 127157 127158 127159 127160 127161 127162 127163 127164 127165 127166 127169 127170 127171127172 127173 127174 127175 127176 127177 127178 127179 127180 127181 127182 127183 127185 127186 127187 127188 127189 127190 127191 127192 127193 127194 127195 127196 127197 127198 127199

Caras

128045 128046 128049 128053 128512 128513 128514 128515 128516 128517 128518 128519 128520 128521 128522 128523 128524 128525 128526 128527 128528 128529 128530 128531 128532 128533 128534 128535 128536128537 128538 128539 128540 128541 128542 128543 128544 128545 128546 128547 128549 128550 128551 128552 128553 128554 128555 128557 128558 128559 128560 128561 128562 128563 128564 128565 128566 128567 128568 128569128570 128571 128572 128573 128574 128575 128576

Horoacutescopo

Miscelaacutenea

Ω ꙮ

  • Tabla de contenidos
  • Sobre este libro
  • Sobre el autor
  • Centros en los que se usa este libro
  • Introduccioacuten
  • Instalacioacuten y configuracioacuten del entorno de programacioacuten Java
  • iexclHola mundo - Salida de datos por pantalla
    • iexclHola mundo - Mi primer programa
    • Coloreado de texto
    • Ejercicios
      • Variables
        • Definicioacuten y tipos de variables
          • Enteros (int y long)
          • Nuacutemeros decimales (double y float)
          • Cadenas de caracteres (String)
            • Operadores artimeacuteticos
            • Asignacioacuten de valores a variables
            • Conversioacuten de tipos (casting)
            • Ejercicios
              • Lectura de datos desde teclado
                • Lectura de texto
                • Lectura de nuacutemeros
                • La clase Scanner
                • Ejercicios
                  • Sentencia condicional (if y switch)
                    • Sentencia if
                    • Operadores de comparacioacuten
                    • Operadores loacutegicos
                    • Sentencia switch (seleccioacuten muacuteltiple)
                    • Ejercicios
                      • Bucles
                        • Bucle for
                        • Bucle while
                        • Bucle do-while
                        • Ejercicios
                          • Nuacutemeros aleatorios
                            • Generacioacuten de nuacutemeros aleatorios con y sin decimales
                            • Generacioacuten de palabras de forma aleatoria de un conjunto dado
                            • Ejercicios
                              • Arrays
                                • Arrays de una dimensioacuten
                                • Arrays bidimensionales
                                • Recorrer arrays con for al estilo foreach
                                • Ejercicios
                                  • Arrays de una dimensioacuten
                                  • Arrays bidimensionales
                                      • Funciones
                                        • Implementando funciones para reutilizar coacutedigo
                                        • Comentarios de funciones
                                        • Creacioacuten de bibliotecas de rutinas mediante paquetes
                                        • Aacutembito de las variables
                                        • Paso de paraacutemetros por valor y por referencia
                                        • Ejercicios
                                          • Programacioacuten orientada a objetos
                                            • Clases y objetos
                                            • Encapsulamiento y ocultacioacuten
                                            • Meacutetodos
                                              • Creiacute haber visto un lindo gatito
                                              • Meacutetodos getter y setter
                                              • Meacutetodo toString
                                                • Aacutembitovisibilidad de los elementos de una clase - public protected y private
                                                • Herencia
                                                  • Sobrecarga de meacutetodos
                                                    • Atributos y meacutetodos de clase (static)
                                                    • Interfaces
                                                    • Arrays de objetos
                                                    • Ejercicios
                                                      • Conceptos de POO
                                                      • POO en Java
                                                      • Arrays de objetos
                                                          • Colecciones y diccionarios
                                                            • Colecciones la clase ArrayList
                                                              • Principales meacutetodos de ArrayList
                                                              • Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de sus elementos
                                                              • ArrayList de objetos
                                                              • Ordenacioacuten de un ArrayList
                                                                • Diccionarios la clase HashMap
                                                                  • Principales meacutetodos de HashMap
                                                                  • Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas
                                                                    • Ejercicios
                                                                      • Ficheros de texto y paso de paraacutemetros por liacutenea de comandos
                                                                        • Lectura de un fichero de texto
                                                                        • Escritura sobre un fichero de texto
                                                                        • Lectura y escritura combinadas
                                                                        • Otras operaciones sobre ficheros
                                                                        • Paso de argumentos por liacutenea de comandos
                                                                        • Combinacioacuten de ficheros y paso de argumentos
                                                                        • Procesamiento de archivos de texto
                                                                        • Ejercicios
                                                                          • Aplicaciones web en Java (JSP)
                                                                            • Hola Mundo en JSP
                                                                            • Mezclando Java con HTML
                                                                            • Recogida de datos en JSP
                                                                            • POO en JSP
                                                                            • Ejercicios
                                                                              • Acceso a bases de datos
                                                                                • Socios de un club de baloncesto
                                                                                • Preparacioacuten del proyecto de ejemplo
                                                                                  • Activar la conexioacuten a MySQL
                                                                                  • Incluir la libreriacutea MySQL JDBC
                                                                                    • Listado de socios
                                                                                    • Alta
                                                                                    • Borrado
                                                                                    • CRUD completo con Bootstrap
                                                                                    • Ejercicios
                                                                                      • Apeacutendice A Ejercicios de ampliacioacuten
                                                                                      • Apeacutendice B Entorno de Desarrollo Integrado Netbeans
                                                                                        • Descarga e instalacioacuten
                                                                                        • Configuracioacuten
                                                                                        • Creacioacuten de un proyecto
                                                                                        • Depuracioacuten
                                                                                          • Apeacutendice C Caracteres especiales
                                                                                            • Liacuteneas para tablas
                                                                                            • Bloques
                                                                                            • Figuras de ajedrez
                                                                                            • Ciacuterculos
                                                                                            • Flechas
                                                                                            • Nuacutemeros en ciacuterculos
                                                                                            • Dados
                                                                                            • Fichas de dominoacute
                                                                                            • Cartas
                                                                                            • Caras
                                                                                            • Horoacutescopo
                                                                                            • Miscelaacutenea
Page 2: Aprende Java con Ejercicios - DAM

Iacutendice general

Sobre este libro i

Sobre el autor ii

Centros en los que se usa este libro iii

Introduccioacuten iv

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java v

1 iexclHola mundo - Salida de datos por pantalla 111 iexclHola mundo - Mi primer programa 112 Coloreado de texto 413 Ejercicios 6

2 Variables 821 Definicioacuten y tipos de variables 8

211 Enteros (int y long) 9212 Nuacutemeros decimales (double y float) 9213 Cadenas de caracteres (String) 10

22 Operadores artimeacuteticos 1223 Asignacioacuten de valores a variables 1224 Conversioacuten de tipos (casting) 1325 Ejercicios 15

3 Lectura de datos desde teclado 1631 Lectura de texto 1632 Lectura de nuacutemeros 1733 La clase Scanner 1834 Ejercicios 22

4 Sentencia condicional (if y switch) 2541 Sentencia if 2542 Operadores de comparacioacuten 2843 Operadores loacutegicos 2944 Sentencia switch (seleccioacuten muacuteltiple) 3145 Ejercicios 35

Fernando
Resaltado

IacuteNDICE GENERAL

5 Bucles 3951 Bucle for 3952 Bucle while 4053 Bucle do-while 4154 Ejercicios 44

6 Nuacutemeros aleatorios 5161 Generacioacuten de nuacutemeros aleatorios con y sin decimales 5162 Generacioacuten de palabras de forma aleatoria de un conjunto dado 5563 Ejercicios 58

7 Arrays 6271 Arrays de una dimensioacuten 6272 Arrays bidimensionales 6673 Recorrer arrays con for al estilo foreach 7074 Ejercicios 72

741 Arrays de una dimensioacuten 72742 Arrays bidimensionales 77

8 Funciones 8081 Implementando funciones para reutilizar coacutedigo 8082 Comentarios de funciones 8283 Creacioacuten de bibliotecas de rutinas mediante paquetes 8384 Aacutembito de las variables 8785 Paso de paraacutemetros por valor y por referencia 8786 Ejercicios 92

9 Programacioacuten orientada a objetos 9591 Clases y objetos 9592 Encapsulamiento y ocultacioacuten 9693 Meacutetodos 97

931 Creiacute haber visto un lindo gatito 97932 Meacutetodos getter y setter 101933 Meacutetodo toString 105

94 Aacutembitovisibilidad de los elementos de una clase - public protected y private 10795 Herencia 108

951 Sobrecarga de meacutetodos 11296 Atributos y meacutetodos de clase (static) 11497 Interfaces 11698 Arrays de objetos 12299 Ejercicios 127

991 Conceptos de POO 127992 POO en Java 128993 Arrays de objetos 131

10Colecciones y diccionarios 133

IacuteNDICE GENERAL

101 Colecciones la clase ArrayList 1331011Principales meacutetodos de ArrayList 1331012Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de sus

elementos 1351013ArrayList de objetos 1411014Ordenacioacuten de un ArrayList 142

102 Diccionarios la clase HashMap 1461021Principales meacutetodos de HashMap 1461022Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas 147

103 Ejercicios 152

11Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 155111 Lectura de un fichero de texto 156112 Escritura sobre un fichero de texto 159113 Lectura y escritura combinadas 160114 Otras operaciones sobre ficheros 162115 Paso de argumentos por liacutenea de comandos 163116 Combinacioacuten de ficheros y paso de argumentos 166117 Procesamiento de archivos de texto 168118 Ejercicios 171

12Aplicaciones web en Java (JSP) 173121 Hola Mundo en JSP 173122 Mezclando Java con HTML 175123 Recogida de datos en JSP 179124 POO en JSP 183125 Ejercicios 188

13Acceso a bases de datos 192131 Socios de un club de baloncesto 192132 Preparacioacuten del proyecto de ejemplo 195

1321Activar la conexioacuten a MySQL 1951322Incluir la libreriacutea MySQL JDBC 197

133 Listado de socios 197134 Alta 200135 Borrado 202136 CRUD completo con Bootstrap 205137 Ejercicios 207

Apeacutendice A Ejercicios de ampliacioacuten 213

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 216Descarga e instalacioacuten 216Configuracioacuten 217Creacioacuten de un proyecto 218Depuracioacuten 221

IacuteNDICE GENERAL

Apeacutendice C Caracteres especiales 224Liacuteneas para tablas 224Bloques 224Figuras de ajedrez 224Ciacuterculos 224Flechas 224Nuacutemeros en ciacuterculos 224Dados 224Fichas de dominoacute 224Cartas 225Caras 225Horoacutescopo 225Miscelaacutenea 225

Sobre este libroldquoAprende Java con Ejerciciosrdquo es un manual praacutectico para aprender a programar enJava desde ceroNo es necesario tener conocimientos previos de programacioacuten La dificultad del libroes gradual empieza con conceptos muy baacutesicos y ejercicios muy sencillos y vaaumentando en complejidad y dificultad a medida que avanzan los capiacutetulosLa praacutectica hace al maestro Como de verdad se aprende a programar es programandodesde el principio y esa es la filosofiacutea que sigue este libro En cada capiacutetulo se explicanuna serie de conceptos de programacioacuten y se ilustran con ejemplos Al final de cadauno de los capiacutetulos se plantean ejercicios de diferente dificultadEste libro contiene maacutes de 200 ejercicios Tanto las soluciones a los ejercicios como losejemplos estaacuten disponibles en GitHub httpsgithubcomLuisJoseSanchezaprende-java-con-ejercicios y tanto los unos como los otros siguen los estaacutendares de programacioacutende Google para el coacutedigo fuente escrito en el lenguaje de programacioacuten Java1ldquoAprende Java con Ejerciciosrdquo es un libro hecho casi a medida de la asignatura ldquoProgra-macioacutenrdquo que forma parte del curriacuteculo del primer curso de los ciclos formativos DAW(Desarrollo de Aplicaciones Web) y DAM (Desarrollo de Aplicaciones Multiplataforma)pero igualmente puede ser utilizado por estudiantes de Ingenieriacutea Informaacutetica Ingenie-riacutea de Telecomunicaciones o Ciencias Matemaacuteticas en la asignatura de ldquoProgramacioacutenrdquode los primeros cursosSi tienes alguna duda o quieres hacer alguacuten comentario en relacioacuten a este libro tienesa tu disposicioacuten el grupo de Google httpsgroupsgooglecomdforumaprende-java-con-ejercicios Cualquier sugerencia para mejorar este manual seraacute bienvenida

1httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

i

Sobre el autorLuis Joseacute Saacutenchez Gonzaacutelez es Ingeniero Teacutecnico en Informaacutetica de Gestioacuten por laUniversidad de Maacutelaga (Espantildea) y funcionario de carrera de la Junta de Andaluciacuteadesde 1998 En su trabajo de profesor de Informaacutetica combina sus dos pasiones laensentildeanza y la programacioacutenEn el momento de publicar este libro es profesor del IES Campanillas (Maacutelaga) eimparte clases en el Ciclo Superior de Desarrollo de Aplicaciones WebPuedes ponerte en contacto con el autor mediante la direccioacuten de correo electroacute-nico luisjoseprofegmailcom o mediante LinkedIn (httpseslinkedincompubluis-joseacute-saacutenchez86b0834)

ii

Centros en los que se usa este librobull IES Campanillas Maacutelaga (Espantildea)bull IES Poliacutegono Sur Sevilla (Espantildea)bull IES Murgi El Ejido - Almeriacutea (Espantildea)bull IES Punta del Verde Sevilla (Espantildea)

Si eres profesor y utilizas este libro para ensentildear Java piacutedele al autor que antildeada enesta seccioacuten el nombre de tu centro educativo o empresa escribiendo un correo a ladireccioacuten luisjoseprofegmailcom indicando la localidad y el paiacutes del centro

iii

IntroduccioacutenJava es un lenguaje de programacioacuten es de hecho desde hace maacutes de 10 antildeos ellenguaje de programacioacuten maacutes utilizado en el mundo seguacuten el iacutendice PYPL2(PopularitYof Programming Language index)Los ordenadores no entienden - por ahora - el espantildeol ni el ingleacutes ni ninguacuten otroidioma natural De una forma muy simplificada podriacuteamos decir que un lenguaje deprogramacioacuten es un idioma que entiende el ordenador3 Cualquier aplicacioacuten - proce-sador de textos navegador programa de retoque fotograacutefico etc - estaacute compuesta deuna serie de instrucciones convenientemente empaquetadas en ficheros que le dicenal ordenador de una manera muy precisa queacute tiene que hacer en cada momentoJava es un lenguaje de programacioacuten estructurado y como tal hace uso de variablessentencias condicionales bucles funcioneshellip Java es tambieacuten un lenguaje de progra-macioacuten orientado a objetos y por consiguiente permite definir clases con sus meacutetodoscorrespondientes y crear instancias de esas clases Java no es un lenguaje de marcascomo HTML o XML aunque puede interactuar muy bien con ellos4Las aplicaciones Java se suelen compilar a bytecode que es independiente del sistemaoperativo no a binario que siacute depende del sistema operativo De esta forma elbytecode generado al compilar un programa escrito en Java deberiacutea funcionar encualquier sistema operativo que tenga instalada una maacutequina virtual de java (JVM)Cualquier editor simple como Nano o GEdit es suficiente para escribir coacutedigo enJava aunque se recomiendan IDEs5 como NetBeans o Eclipse ya que tienen algunascaracteriacutesticas que facilitan mucho la programacioacuten como el chequeo de erroresmientras se escribe el autocompletado de nombres de variables y funciones y muchomaacutes

2httppyplgithubioPYPLhtml3En realidad un ordenador no entiende directamente los lenguajes de programacioacuten como Java C Ruby etc Mediante una

herramienta que se llama compilador o traductor seguacuten el caso lo que hay escrito en cualquiera de estos lenguajes se convierteen coacutedigo maacutequina - secuencias de unos y ceros - que es el uacutenico lenguaje que de verdad entiende el ordenador

4El lector deberaacute tener unos conocimientos baacutesicos de HTML para entender bien y sacar provecho del capiacutetulo relativo a JSPde este mismo libro Una web excelente para aprender HTML es httpw3schoolscom

5IDE Integrated Development Enviroment (Entorno de Desarrollo Integrado)

iv

Instalacioacuten y configuracioacuten del entorno deprogramacioacuten JavaTodos los ejemplos que contiene este libro asiacute como las soluciones a los ejerciciosse han escrito sobre Linux en concreto sobre Ubuntu (httpwwwubuntucom) Noobstante todo el coacutedigo deberiacutea compilar y funcionar sin ninguacuten problema en cualquierotra plataformaEl software necesario para seguir este manual es el siguiente6

OpenJDKEl Open Java Development Kit (OpenJDK) contiene una serie de componentesque permiten desarrollar y ejecutar aplicaciones escritas en Java Incluye la maacute-quina virtual de Java (JVM) que permite ejecutar bytecode Como mencionamosen el apartado Introduccioacuten el bytecode es el ejecutable en Java El OpenJDKtambieacuten incluye el compilador javac que permite compilar el coacutedigo fuente paragenerar el bytecode En Ubuntu basta ejecutar una liacutenea en la ventana determinal para instalar el OpenJDK

$ sudo apt-get install openjdk-8-jdk

Para los sitemas operativos Mac OS X y Windows se encuentran disponiblespara su descarga los archivos de instalacioacuten del OpenJDK en la paacutegina UnofficialOpenJDK installers for Windows Linux and Mac OS X7 Otra opcioacuten consiste enutilizar el JDK oficial de Oracle que se puede descargar en el apartado Java SEDevelopment Kit 8 - Downloads8 de la web de esta misma empresa No vamos aexplicar las diferencias entre el OpenJDK y el JDK ya que se escapa al aacutembitode este libro A efectos praacutecticos todos los ejemplos contenidos en este manualfuncionan tanto con en el OpenJDK como con el JDK y los ejercicios se puedenrealizar sin problema sea cual sea el kit de desarrollo instalado

Editor de textos simplePara seguir este manual recomendamos utilizar al principio un editor de textossencillo para probar los primeros programas y realizar los primeros ejercicioscompilando en liacutenea de comandos De esta manera el lector se va familiarizandocon el proceso de edicioacuten de coacutedigo compilacioacuten y ejecucioacuten y va entendiendo loque sucede en cada paso En Ubuntu viene instalado por defecto el editor GEditel sistema operativo Mac OS X viene con TextEdit y en Windows podemos usarel programa Bloc de notas

6En la paacutegina httphelloworldcollectionde se muestra el programa Hola mundo escrito en maacutes de 400 lenguajes deprogramacioacuten

7httpsgithubcomalexkaskoopenjdk-unofficial-builds8httpwwworaclecomtechnetworkjavajavasedownloadsjdk8-downloads-2133151html

v

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java vi

GeanyUna vez que el lector ha superado la barrera de escribir sus primeros programasrecomendamos utilizar el entorno de programacioacuten Geany (por ejemplo a partirdel capiacutetulo 2) Se trata de un IDE muy ligero que permite realizar aplicacionessencillas con rapidez Mediante Geany se puede escribir el coacutedigo chequearsi contiene errores compilar y ejecutar el bytecode generado Para programaspequentildeos - por ej calcular la media de varios nuacutemeros - es recomendable utilizarGeany en lugar de un IDE maacutes complejo como Netbeans Mientras con Geanyda tiempo a escribir el coacutedigo compilar y ejecutar Netbeans todaviacutea estariacuteaarrancandoInstalacioacuten de Geany (y los plugins adicionales) en Ubuntu

$ sudo apt-get install geany

$ sudo apt-get install geany-plugins

En la seccioacuten de descargas de la paacutegina oficial de Geany9 se encuentran losficheros de instalacioacuten de este programa tanto para Mac OS X como paraWindowsUna vez instalado Geany es conveniente realizar algunos ajustes en la configu-racioacuten Presiona Control + Alt + P para abrir la ventana de preferencias Hazclic en la pestantildea Editor y luego en la pestantildea Sangriacutea Establece las opcionestal y como se indican a continuacioacuten

9httpwwwgeanyorgDownloadReleases

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java vii

Figura 01 Configuracioacuten de Geany (sangriacutea)

Tambieacuten es recomendable marcar las casillas Mostrar guiacuteas de sangriacutea y Mostrarnuacutemeros de liacutenea Estas opciones se activan en la pestantildea Mostrar

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java viii

Figura 02 Configuracioacuten de Geany (guiacuteas de sangriacutea y nuacutemeros de liacutenea)

NetbeansCuando las aplicaciones a desarrollar son maacutes complejas y sobre todo cuandoeacutestas constan de varios ficheros se recomienda utilizar Netbeans de la empresaOracle En el capiacutetulo 9 el lector ya podriacutea sacarle mucho partido al uso de esteIDE Se trata de un entorno integrado muy potente y muy usado a nivel profesionalque incluye el autocompletado de sintaxis y permite una depuracioacuten avanzadapaso a paso Netbeans se puede descargar de forma gratuita y para cualquierplataforma desde httpsnetbeansorgdownloadsDespueacutes de la instalacioacuten de Netbeans procedemos a configurar el editorPara ello seleccionamos Herramientas rarr Opciones rarr Editor A continuacioacutenseleccionamos la pestantildea Formato y en el menuacute desplegable correspondiente allenguaje de programacioacuten seleccionamos Java La configuracioacuten deberiacutea quedarcomo se indica en la imagen

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java ix

Figura 03 Configuracioacuten de Netbeans

Es muy importante que los editoresIDEs que se utilicen para esribir coacutedigoen Java se configuren adecuadamente Hemos visto coacutemo configurar Geanyy Netbeans pero si el lector decide utilizar otras herramientas deberaacuteconfigurarlas igualmente En definitiva la configuracioacutenpreferencias de lasherramientas que se utilicen deben establecerse de tal forma que se cumplanestos requisitos

bull La tecla TAB debe insertar espacios no debe insertar el caraacutecter detabulacioacuten

bull La indentacioacuten debe ser de 2 caracteres (por defecto suele estar a 4)bull La condificacioacuten de caracteres debe ser UTF-8

1 iexclHola mundo - Salida de datos por pantalla

11 iexclHola mundo - Mi primer programa

El primer programa que aprende a hacer cualquier aspirante a programador es unHolamundo 1 Es seguramente el programa maacutes sencillo que se puede escribir Se trata deun programa muestra el mensaje ldquoHola mundordquo por pantalla Abre el programa GEditque como hemos comentado en la seccioacuten Instalacioacuten y configuracioacuten del entorno deprogramacioacuten Java viene instalado por defecto en Ubuntu y teclea el siguiente coacutedigo

Muestra por pantalla la frase iexclHola mundo author Luis J Saacutenchez

public class HolaMundo Clase principalpublic static void main(String[] args)

Systemoutprintln(iexclHola mundo)

Veraacutes que en principio el texto del coacutedigo no aparece en colores El coloreado desintaxis es muy uacutetil como comprobaraacutes maacutes adelante sobre todo para detectar erroresGraba el programa como HolaMundojava Al grabar con la extensioacuten java ahora elprograma GEdit siacute sabe que se trata de un programa escrito en Java y reconoce lasintaxis de este lenguaje de forma que puede colorear los distintos elementos queaparecen en el coacutedigo

1En la paacutegina httphelloworldcollectionde se muestra el programa Hola mundo escrito en maacutes de 400 lenguajes deprogramacioacuten

1

iexclHola mundo - Salida de datos por pantalla 2

Figura 11 Programa Hola mundo escrito en el editor GEdit

Fiacutejate que el nombre que le damos al fichero es exactamente igual que la clase principalseguido de la extensioacuten java Abre una ventana de terminal entra en el directoriodonde se encuentra el fichero y teclea lo siguiente

$ javac HolaMundojava

Este comando crea HolaMundoclass que es el bytecode Para ejecutar el programateclea

$ java HolaMundo

iexclEnhorabuena Acabas de realizar tu primer programa en JavaEn la siguiente captura de pantalla puedes ver la ventana de terminal y los comandosque acabamos de describir

iexclHola mundo - Salida de datos por pantalla 3

Figura 12 HolaMundoclass es el bytecode generado (1) El resultado del programa es una liacutenea de textoescrita en pantalla (2)

La instruccioacuten que hemos utilizado para mostrar una frase por pantalla es Sys-

temoutprintln() colocando la frase entre pareacutentesis Tambieacuten se puede volcar textopor pantalla mediante Systemoutprint() La uacutenica diferencia radica en que esta uacuteltimano antildeade un salto de liacutenea al final prueacutebalo en HolaMundojava y comprueacutebalo por timismo Si lo que quieres mostrar es una palabra o una frase como en este ejemploes importante que el texto esteacute entrecomillado

bull El programa propiamente dicho estaacute dentro de lo que llamamos ldquoclaseprincipalrdquo

bull El fichero debe tener el mismo nombre que la clase principal seguido porla extensioacuten java

bull Los comentarios de varias liacuteneas se colocan entre y

bull Los comentarios de liacutenea se indican mediante

bull Para mostrar informacioacuten por pantalla se utilizan Systemoutprintln() ySystemoutprint()

iexclHola mundo - Salida de datos por pantalla 4

12 Coloreado de texto

Mostrar siempre texto blanco sobre fondo negro puede resultar muy aburrido El textoque se muestra por pantalla se puede colorear para ello es necesario insertar unassecuencias de caracteres - que indican el color con el que se quiere escribir - justoantes del propio textoPrueba el siguiente programa y no te preocupes si todaviacutea no lo entiendes del todoen el proacuteximo capiacutetulo se explican los diferentes tipos de datos que se pueden utilizaren Java entre estos tipos estaacute la cadena de caracteres o String

Coloreado de texto Muestra varias palabras en el color que corresponde author Luis Joseacute Saacutenchez

public class Colores

public static void main(String[] args)

String rojo = 033[31m

String verde = 033[32m

String naranja = 033[33m

String azul = 033[34m

String morado = 033[35m

String blanco = 033[37m

Systemoutprint(naranja + mandarina + verde + hierba)

Systemoutprint(naranja + saltamontes + rojo + tomate)

Systemoutprint(blanco + saacutebanas + azul + cielo)

Systemoutprint(morado + nazareno + azul + mar)

Como puedes ver en los dos ejemplos que hemos mostrado algunas liacuteneas estaacutenligeramente desplazadas hacia la derecha es lo que se llama sangriacutea o indentacioacutenEn programacioacuten es muy importante sangrar (indentar) bien porque da una idea de queacutepartes del coacutedigo son las que contienen a otras En este uacuteltimo ejemplo tenemos unprograma que tiene unos comentarios al principio y luego la clase principal marcadapor la liacutenea public class Colores Dentro de la clase Colores estaacute el main o bloque delprograma principal que tiene sangriacutea por estar dentro de la definicioacuten de la claseColores A su vez dentro del main hay una serie de liacuteneas de coacutedigo que igualmentetienen sangriacutea

iexclHola mundo - Salida de datos por pantalla 5

En este libro tanto el coacutedigo de los ejemplos como el de las soluciones a losejercicios siguen el estaacutendar de Google para el coacutedigo fuente escrito en el lenguaje deprogramacioacuten Java2 por tanto cada vez que se aplique la sangriacutea seraacute exactamentede dos espacios

2httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

iexclHola mundo - Salida de datos por pantalla 6

13 Ejercicios

Ejercicio 1Escribe una programa que muestre tu nombre por pantalla

Ejercicio 2Modifica el programa anterior para que ademaacutes se muestre tu direccioacuten ytu nuacutemero de teleacutefono Aseguacuterate de que los datos se muestran en liacuteneasseparadas

Ejercicio 3Escribe un programa que muestre por pantalla 10 palabras en ingleacutes juntoa su correspondiente traduccioacuten al castellano Las palabras deben estardistribuidas en dos columnas y alineadas a la izquierda Pista Se puedeinsertar un tabulador mediante t

Ejercicio 4Escribe un programa que muestre tu horario de clase Puedes usar espacios otabuladores para alinear el texto

Ejercicio 5Modifica el programa anterior antildeadiendo colores Puedes mostrar cada asig-natura de un color diferente

Ejercicio 6Escribe un programa que pinte por pantalla una piraacutemide rellena a base deasteriscos La base de la piraacutemide debe estar formada por 9 asteriscos

Ejercicio 7Igual que el programa anterior pero esta vez la piraacutemide estaraacute hueca (sedebe ver uacutenicamente el contorno hecho con asteriscos)

iexclHola mundo - Salida de datos por pantalla 7

Ejercicio 8Igual que el programa anterior pero esta vez la piraacutemide debe aparecerinvertida con el veacutertice hacia abajo

Ejercicio 9Escribe un programa que pinte por pantalla alguna escena - el campo lahabitacioacuten de una casa un aula etc - o alguacuten objeto animado o inanimado- un coche un gato una taza de cafeacute etc Ten en cuenta que puedes utilizarcaracteres como + lt etc iexclEacutechale imaginacioacuten

2 Variables

21 Definicioacuten y tipos de variables

Una variable es un contenedor de informacioacuten Imagina una variable como una cajitacon una etiqueta que indica su nombre una cajita en la que se puede introducir un va-lor Las variables pueden almacenar valores enteros nuacutemeros decimales caracterescadenas de caracteres (palabras o frases) etc El contenido de las variables puedecambiar durante la ejecucioacuten del programa de ahiacute viene el nombre de ldquovariablerdquoJava es un lenguaje fuertemente tipado es decir es necesario declarar todas lasvariables que utilizaraacute el programa indicando siempre el nombre y el tipo de cadaunaEl nombre que se le da a una variable es muy importante intenta usar siemprenombres significativos que de alguna forma identifiquen el contenido Por ejemplosi usas una variable para almacenar el volumen de una figura una buena opcioacuten seriacuteallamarla volumen si tienes una variable que almacena la edad de una persona lo mejores llamarla edad y asiacute sucesivamenteUn programa se lee y se depura mucho mejor si los nombres de las variables se hanelegido de forma inteligenteiquestPodriacuteas averiguar queacute hace la siguiente liacutenea de coacutedigo

x = vIp3 Weerty - zxc

Ahora observa el mismo coacutedigo pero con otros nombres de variables

precioTotal = cantidad precio - descuento

Se entiende mucho mejor iquestverdadEscribiremos los nombres de variables en formato lowerCamelCase La primera letrase escribe en minuacutescula y a continuacioacuten si se utiliza maacutes de una palabra cada unade ellas empezariacutea con mayuacutescula Por ejemplo edadMin es un buen nombre para unavariable que almacena la edad miacutenima a la que se puede acceder a un sitio webObserva que hemos usado una mayuacutescula para diferenciar dos partes (edad y Min)Puede que en alguacuten libro tambieacuten encuentres nombres de variables con el caraacutecterde subrayado ( _ ) de tal forma que el nombre de la variable seriacutea edad_min pero comohemos comentado anteriormente en este libro nos centildeimos al estaacutendar de Google1que exige el formato lowerCamelCase

1httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

8

Variables 9

No se permiten siacutembolos como $ + - etc Puedes usar nuacutemeros en los nombresde variables pero nunca justo al principio 5x no es un nombre vaacutelido pero x5 siacute lo esNo se debe poner una letra mayuacutescula al comienzo del nombre de una variable parano confundirla con una clase (los nombres de las clases comienzan por mayuacutescula)

211 Enteros (int y long)

Las variables que van a contener nuacutemeros enteros se declaran con int Veamos unejemplo

Uso de variables enteras author Luis J Saacutenchez

public class VariablesEnteras

public static void main(String[] args)

int x Se declara la variable x como entera

x = 5 Se asigna el valor 5 a la variable xSystemoutprintln(El valor actual de mi variable es + x)

x = 7 Se asigna el valor 7 a la variable xSystemoutprintln(y ahora es + x)

Si pretendemos almacenar valores muy grandes en una variable usaremos el tipo long

en lugar de int

212 Nuacutemeros decimales (double y float)

Usamos los tipos double o float cuando queremos (o esperamos) almacenar nuacutemeroscon decimales en las variablesCintildeeacutendonos al estaacutendar de Google no daremos por vaacutelidas definiciones de variablescomo la siguiente (aunque funcionariacutea sin ninguacuten problema)

double x y

Cada variable se debe definir en una liacutenea diferente Lo siguiente siacute seriacutea correcto

Variables 10

double x

double y

A continuacioacuten tienes un ejemplo completo

Uso de variables que contienen nuacutemeros decimales author Luis J Saacutenchez

public class VariablesConDecimales

public static void main(String[] args)

double x Se declaran las variables x e ydouble y de tal forma que puedan almacenar decimales

x = 7

y = 2501

Systemoutprintln( x vale + x)

Systemoutprintln( y vale + y)

Como puedes ver tambieacuten se pueden almacenar nuacutemeros enteros en variables de tipodouble

213 Cadenas de caracteres (String)

Las cadenas de caracteres se utilizan para almacenar palabras y frases Todas lascadenas de caracteres deben ir entrecomilladas

Uso del tipo String author Luis J Saacutenchez

public class UsoDeStrings

public static void main(String[] args)

String miPalabra = cerveza

String miFrase = iquestdoacutende estaacute mi cerveza

Systemoutprintln(Una palabra que uso con frecuencia + miPalabra)

Variables 11

Systemoutprintln(Una frase que uso a veces + miFrase)

Como puedes ver en una cadena de caracteres se pueden almacenar signos depuntuacioacuten espacios y letras con tildes

Variables 12

22 Operadores artimeacuteticos

En Java se puede operar con las variables de una forma muy parecida a como se haceen matemaacuteticas Los operadores aritmeacuteticos de Java son los siguientes

OPERADOR NOMBRE EJEMPLO DESCRIPCIOacuteN+ suma 20 + x suma dos nuacutemeros- resta a - b resta dos nuacutemeros multiplicacioacuten 10 7 multiplica dos nuacutemeros divisioacuten altura 2 divide dos nuacutemeros resto (moacutedulo) 5 2 resto de la divisioacuten entera

++ incremento a++ incrementa en 1 elvalor de la variable

- - decremento a- - decrementa en 1 elvalor de la variable

A continuacioacuten tienes un programa que ilustra el uso de los operadores aritmeacuteticos

Uso de los operadores aritmeacuteticos author Luis J Saacutenchez

public class UsoDeOperadoresAritmeticos

public static void main(String[] args)

int x

x = 100

Systemoutprintln(x + + (x + 5) + + (x - 5))

Systemoutprintln((x 5) + + (x 5) + + (x 5))

23 Asignacioacuten de valores a variables

La sentencia de asignacioacuten se utiliza para dar un valor a una variable En Java (y enla mayoriacutea de lenguajes de programacioacuten) se utiliza el siacutembolo igual ( = ) para estecometido Es importante recalcar que una asignacioacuten no es una ecuacioacuten Por ejemplox = 7 + 1 es una asignacioacuten en la cual se evaluacutea la parte derecha 7 + 1 y el resultadode esa evaluacioacuten se almacena en la variable que se coloque a la izquierda del iguales decir en la x o lo que es lo mismo el nuacutemero 8 se almacena en x La sentenciax + 1 = 23 2 no es una asignacioacuten vaacutelida ya que en el lado izquierdo debemos teneruacutenicamente un nombre de variableVeamos un ejemplo con algunas operaciones y asignaciones

Variables 13

Operaciones y asignaciones author Luis J Saacutenchez

public class Asignaciones

public static void main(String[] args)

int x = 2

int y = 9

int sum = x + y

Systemoutprintln(La suma de mis variables es + sum)

int mul = x y

Systemoutprintln(La multiplicacioacuten de mis variables es + mul)

24 Conversioacuten de tipos (casting)

En ocasiones es necesario convertir una variable (o una expresioacuten en general) de untipo a otro Simplemente hay que escribir entre pareacutentesis el tipo que se quiere obtenerExperimenta con el siguiente programa y observa los diferentes resultados que seobtienen

Conversioacuten de tipos author Luis J Saacutenchez

public class ConversionDeTipos

public static void main(String[] args)

int x = 2

int y = 9

double division

division = (double)y (double)xdivision = y x Comenta esta liacutenea y

observa la diferencia

Variables 14

Systemoutprintln(El resultado de la divisioacuten es + division)

Variables 15

25 Ejercicios

Ejercicio 1Escribe un programa en el que se declaren las variables enteras x e y Asignaleslos valores 144 y 999 respectivamente A continuacioacuten muestra por pantallael valor de cada variable la suma la resta la divisioacuten y la multiplicacioacuten

Ejercicio 2Crea la variable nombre y asiacutegnale tu nombre completo Muestra su valor porpantalla de tal forma que el resultado del programa sea el mismo que en elejercicio 1 del capiacutetulo 1

Ejercicio 3Crea las variables nombre direccion y telefono y asiacutegnale los valores corres-pondientes Muestra los valores de esas variables por pantalla de tal formaque el resultado del programa sea el mismo que en el ejercicio 2

Ejercicio 4Realiza un conversor de euros a pesetas La cantidad en euros que se quiereconvertir deberaacute estar almacenada en una variable

Ejercicio 5Realiza un conversor de pesetas a euros La cantidad en pesetas que se quiereconvertir deberaacute estar almacenada en una variable

Ejercicio 6Escribe un programa que calcule el total de una factura a partir de la baseimponible (precio sin IVA) La base imponible estaraacute almacenada en unavariable

3 Lectura de datos desde tecladoHemos visto en los capiacutetulos anteriores coacutemo mostrar informacioacuten por pantalla ycoacutemo usar variables Veremos ahora algo muy importante que te permitiraacute realizarprogramas algo maacutes funcionales que tengan una utilidad real aprenderaacutes a leer lainformacioacuten que introduce un usuario mediante el tecladoEl funcionamiento de casi todos los programas se podriacutea resumir en los siguientespuntos

1 Entrada de datos desde teclado (o desde cualquier otro dispositivo de entrada)2 Procesamiento de los datos de entrada para producir un resultado3 Visualizacioacuten de los resultados por pantalla

De momento hemos visto coacutemo realizar los puntos 2 y 3 Vamos a ver a continuacioacutencoacutemo se recoge la informacioacuten desde el teclado

31 Lectura de texto

Para recoger datos por teclado usamos Systemconsole()readLine() Cuando llegamos aesta sentencia el programa se detiene y espera que el usuario introduzca informacioacutenmediante el teclado La introduccioacuten de datos termina con la pulsacioacuten de la teclaINTRO Una vez que el usuario presiona INTRO todo lo que se ha tecleado se almacenaen una variable en el siguiente ejemplo esa variable es nombre

Lectura de datos desde teclado author Luis J Sanchez

public class DimeTuNombre

public static void main(String[] args)

String nombre

Systemoutprint(Por favor dime coacutemo te llamas )

nombre = Systemconsole()readLine()

Systemoutprintln(Hola + nombre + iexclencantado de conocerte)

16

Lectura de datos desde teclado 17

Mediante Systemconsole()readLine() se recoge una liacutenea de texto introducidapor teclado

Cuando se piden datos por teclado es importante que el programa especifiqueclaramente cuaacutel es exactamente la informacioacuten que requiere por parte del usuarioDate cuenta que este programa muestra el mensaje ldquoPor favor dime coacutemo te llamasrdquoImagina que se omite este mensaje en la pantalla apareceriacutea uacutenicamente un cursorparpadeando y el usuario no sabriacutea queacute tiene que hacer o queacute dato introducirTambieacuten es importante resentildear que los datos introducidos por teclado se recogen comouna cadena de caracteres (un String)

32 Lectura de nuacutemeros

Si en lugar de texto necesitamos datos numeacutericos deberemos convertir la cadenaintroducida en un nuacutemero con el meacutetodo adecuado Como se muestra en el ejemploIntegerparseInt() convierte el texto introducido por teclado en un dato numeacutericoconcretamente en un nuacutemero entero

Lectura de datos desde teclado author Luis J Saacutenchez

public class LeeNumeros

public static void main(String[] args)

String linea

Systemoutprint(Por favor introduce un nuacutemero )

linea = Systemconsole()readLine()

int primerNumero

primerNumero = IntegerparseInt( linea )

Systemoutprint(introduce otro por favor )

linea = Systemconsole()readLine()

int segundoNumero

segundoNumero = IntegerparseInt( linea )

int total

total = (2 primerNumero) + segundoNumero

Systemoutprint(El primer nuacutemero introducido es + primerNumero)

Lectura de datos desde teclado 18

Systemoutprintln( y el segundo es + segundoNumero)

Systemoutprint(El doble del primer nuacutemero maacutes el segundo es )

Systemoutprint(total)

Este uacuteltimo programa se podriacutea acortar un poco Por ejemplo estas dos liacuteneas

int total

total = (2 primerNumero) + segundoNumero

se podriacutean quedar en una sola liacutenea

int total = (2 primerNumero) + segundoNumero

De igual modo estas tres liacuteneas

linea = Systemconsole()readLine()

int primerNumero

primerNumero = IntegerparseInt( linea )

tambieacuten se podriacutean reducir a una sola tal que asiacute

int primerNumero = IntegerparseInt( Systemconsole()readLine() )

Es muy importante que el coacutedigo de nuestros programas sea limpio y legible A vecesabreviando demasiado el coacutedigo se hace maacutes difiacutecil de leer es preferible tener unasliacuteneas de maacutes y que el coacutedigo se entienda bien a tener un coacutedigo muy compacto peromenos legible

33 La clase Scanner

El meacutetodo Systemconsole()readLine() funciona bien en modo consola (en una ventana determinal) pero puede provocar problemas cuando se trabaja con IDEs como EclipseNetbeans JavaEdit etc Para evitar estos problemas puedes usar la clase Scanner

cuando necesites recoger datos desde teclado La clase Scanner funciona tanto enentornos integrados como en una ventana de terminal

Lectura de datos desde teclado 19

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScanner01

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tu nombre )

String nombre = snextLine()

Systemoutprint(Introduce tu edad )

int edad = IntegerparseInt(snextLine())

Systemoutprintln(Tu nombre es + nombre + y tu edad es + edad)

Fiacutejate que en el programa anterior la sentencia

snextLine()

seriacutea el equivalente a

Systemconsole()readLine()`

Mediante el uso de la clase Scanner es posible leer varios datos en una misma liacutenea Enel programa anterior se pediacutea un nombre y una edad en total dos datos que habiacutea queintroducir en liacuteneas separadas Observa coacutemo en el siguiente ejemplo se piden esosdos datos en una sola liacutenea y separados por un espacio

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScanner02

Lectura de datos desde teclado 20

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tu nombre y tu edad separados por un espacio )

String nombre = snext()

int edad = snextInt()

Systemoutprintln(Tu nombre es + nombre + y tu edad es + edad)

Fiacutejate coacutemo se ha utilizado snext() para leer una cadena de caracteres y snextInt()

para leer un nuacutemero entero todo ello en la misma liacuteneaEl siguiente programa de ejemplo calcula la media de tres nuacutemeros decimales Paraleer cada uno de los nuacutemeros en la misma liacutenea se utiliza snextDouble

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScannerMedia

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tres nuacutemeros (pueden contener decimales) separados por esp

acios )

double x1 = snextDouble()

double x2 = snextDouble()

double x3 = snextDouble()

double media = (x1 + x2 + x3) 3

Systemoutprintln(La media de esos tres nuacutemeros es + media)

Lectura de datos desde teclado 21

Recuerda que iexcla programar se aprende programando Es muy importanteque pruebes los ejemplos - si los modificas y experimentas todaviacutea mejor - yque realices los ejercicios Para aprender a programar no basta con leer el libroy entenderlo es una condicioacuten necesaria pero no suficiente Igual que paraser piloto hacen falta muchas horas de vuelo para ser programador hacenfalta muchas horas picando coacutedigo probando corrigiendo erroreshellip iexclAacutenimoiexclEl esfuerzo merece la pena

Lectura de datos desde teclado 22

34 Ejercicios

Ejercicio 1Realiza un programa que pida dos nuacutemeros y que luego muestre el resultadode su multiplicacioacuten

Ejercicio 2Realiza un conversor de euros a pesetas La cantidad de euros que se quiereconvertir debe ser introducida por teclado

Ejercicio 3Realiza un conversor de pesetas a euros La cantidad de pesetas que se quiereconvertir debe ser introducida por teclado

Ejercicio 4Escribe un programa que sume reste multiplique y divida dos nuacutemerosintroducidos por teclado

Ejercicio 5Escribe un programa que calcule el aacuterea de un rectaacutengulo

Ejercicio 6Escribe un programa que calcule el aacuterea de un triaacutengulo

Ejercicio 7Escribe un programa que calcule el total de una factura a partir de la baseimponible

Ejercicio 8Escribe un programa que calcule el salario semanal de un empleado en basea las horas trabajadas a razoacuten de 12 euros la hora

Lectura de datos desde teclado 23

Ejercicio 9Escribe un programa que calcule el volumen de un cono seguacuten la foacutermula V =13πr

2h

Ejercicio 10Realiza un conversor de Mb a Kb

Ejercicio 11Realiza un conversor de Kb a Mb

Ejercicio 12Escribe un programa que calcule el precio final de un producto seguacuten subase imponible (precio antes de impuestos) el tipo de IVA aplicado (generalreducido o superreducido) y el coacutedigo promocional Los tipos de IVA generalreducido y superreducido son del 21 10 y 4 respectivamente Los coacutedi-gos promocionales pueden ser nopro mitad meno5 o 5porc que significanrespectivamente que no se aplica promocioacuten el precio se reduce a la mitadse descuentan 5 euros o se descuenta el 5 El ejercicio se da por bueno si semuestran los valores correctos aunque los nuacutemeros no esteacuten tabuladosEjemplo

Introduzca la base imponible 25

Introduzca el tipo de IVA (general reducido o superreducido) reducido

Introduzca el coacutedigo promocional (nopro mitad meno5 o 5porc) mitad

Base imponible 2500

IVA (10) 250

Precio con IVA 2750

Coacuted promo (mitad) -1375

TOTAL 1375

Lectura de datos desde teclado 24

Ejercicio 13Realiza un programa que calcule la nota que hace falta sacar en el segundoexamen de la asignatura Programacioacuten para obtener la media deseada Hayque tener en cuenta que la nota del primer examen cuenta el 40 y la delsegundo examen un 60Ejemplo 1

Introduce la nota del primer examen 7

iquestQueacute nota quieres sacar en el trimestre 85

Para tener un 85 en el trimestre necesitas sacar un 95 en el segundo examen

Ejemplo 2

Introduce la nota del primer examen 8

iquestQueacute nota quieres sacar en el trimestre 7

Para tener un 7 en el trimestre necesitas sacar un 633 en el segundo examen

4 Sentencia condicional (if y switch)Una sentencia condicional permite al programa bifurcar el flujo de ejecucioacuten deinstrucciones dependiendo del valor de una expresioacuten

41 Sentencia if

La sentencia if permite la ejecucioacuten de una serie de instrucciones en funcioacuten delresultado de una expresioacuten loacutegica El resultado de evaluar una expresioacuten loacutegica essiempre verdadero (true) o falso (false) Es muy simple en lenguaje natural seriacutea algocomo rdquosi esta condicioacuten es verdadera entonces haz esto sino haz esto otrordquoEl formato de la sentencia if es el siguiente

if (condicioacuten)

instrucciones a ejecutar si la condicioacuten es verdadera

else

instrucciones a ejecutar si la condicioacuten es falsa

A continuacioacuten se muestra un ejempo del uso de la sentencia if

Sentencia if author Luis J Saacutenchez

public class SentenciaIf01

public static void main(String[] args)

Systemoutprint(iquestCuaacutel es la capital de Kiribati )

String respuesta = Systemconsole()readLine()

if (respuestaequals(Tarawa))

Systemoutprintln(iexclLa respuesta es correcta)

else

Systemoutprintln(Lo siento la respuesta es incorrecta)

25

Sentencia condicional (if y switch) 26

En el programa se le pregunta al usuario cuaacutel es la capital de Kiriwati La respuestaintroducida por el usuario se almacena en la variable respuesta A continuacioacuten vienela sentencia condicional if

if (respuestaequals(Tarawa))

Llegado a este punto el programa evaluacutea la expresioacuten respuestaequals(Tarawa)Observa que para comparar dos cadenas de caracteres se utiliza equals() Ima-ginemos que el usuario ha introducido por teclado Madrid entonces la expresioacutenMadridequals(Tarawa) dariacutea como resultado false (falso)Si la expresioacuten hubiera dado como resultado true (verdadero) se ejecutaria la liacutenea

Systemoutprintln(iexclLa respuesta es correcta)

pero no es el caso el resultado de la expresioacuten ha sido false (falso) todo el mundosabe que la capital de Kiriwati no es Madrid por tanto se ejecutariacutea la liacutenea

Systemoutprintln(Lo siento la respuesta es incorrecta)

Vamos a ver otro ejemplo esta vez con nuacutemeros El usuario introduciraacute un nuacutemero porteclado y el programa diraacute si se trata de un nuacutemero positivo o negativo

Sentencia if author Luis J Saacutenchez

public class SentenciaIf02

public static void main(String[] args)

Systemoutprint(Por favor introduce un nuacutemero entero )

String linea = Systemconsole()readLine()

int x = IntegerparseInt( linea )

if (x lt 0)

Systemoutprintln(El nuacutemero introducido es negativo)

else

Systemoutprintln(El nuacutemero introducido es positivo)

El siguiente bloque de coacutedigo

Sentencia condicional (if y switch) 27

if (x lt 0)

Systemoutprintln(El nuacutemero introducido es negativo)

elseSystemoutprintln(El nuacutemero introducido es positivo)

compilariacutea y funcionariacutea sin problemas - fiacutejate que hemos quitado las llaves - ya queantes y despueacutes del else hay una sola sentencia y en estos casos no es obligatorioponer llaves Sin embargo nosotros siempre usaremos llaves es una exigencia delestaacutendar de Google al que nos centildeimos en este manual

Llaves egipcias (egyptian brackets)Fiacutejate en la manera de colocar las llaves dentro del coacutedigo de un programaen Java La llave de apertura de bloque se coloca justo al final de la liacutenea y lallave de cierre va justo al principio de la liacutenea Se llaman llaves egipcias1 porla similitud entre las llaves y las manos de los egipcios que aparecen en lospapiros

1httpblogcodinghorrorcomnew-programming-jargon

Sentencia condicional (if y switch) 28

42 Operadores de comparacioacuten

En el ejemplo anterior usamos el operador lt en la comparacioacuten if (x lt 0) para saber sila variable x es menor que cero Hay maacutes operadores de comparacioacuten en la siguientetabla se muestran todos

OPERADOR NOMBRE EJEMPLO DESCRIPCIOacuteN== igual a == b a es igual a b= distinto a = b a es distinto de blt menor que a lt b a es menor que bgt mayor que a gt b a es mayor que b

lt= mayor o igual que a gt = b a es mayor o igual que b

El siguiente ejemplo muestra el uso de uno de estos operadores concretamente de gt=

(mayor o igual) El usuario introduce una nota si esta nota es mayor o igual a 5 sele mostraraacute un mensaje diciendo que ha aprobado y en caso de que no se cumpla lacondicioacuten se mostraraacute un mensaje diciendo que estaacute suspenso

Sentencia if author Luis J Saacutenchez

public class SentenciaIf03

public static void main(String[] args)

Systemoutprint(iquestQueacute nota has sacado en el uacuteltimo examen )

String line = Systemconsole()readLine()

double nota = DoubleparseDouble( line )

if (nota gt= 5)

Systemoutprintln(iexclEnhorabuena iexclhas aprobado)

else

Systemoutprintln(Lo siento has suspendido)

Sentencia condicional (if y switch) 29

43 Operadores loacutegicos

Los operadores de comparacioacuten se pueden combinar con los operadores loacutegicos Porejemplo si queremos saber si la variable a es mayor que b y ademaacutes es menor que cescribiriacuteamos if ((a gt b) ampamp (a lt c)) En la siguiente tabla se muestran los operadoresloacutegicos de Java

OPERADOR NOMBRE EJEMPLO DEVUELVEVERDADEROCUANDOhellip

ampamp y (7 gt 2) ampamp (2 lt 4) las dos condicionesson verdaderas

|| o (7 gt 2) || (2 lt 4) al menos una de lascondiciones es

verdadera no (7 gt 2) la condicioacuten es falsa

Vamos a ver coacutemo funcionan los operadores loacutegicos con un ejemplo Mediante if ((n lt

1) || (n gt 100)) se pueden detectar los nuacutemeros que no estaacuten en el rango de 1 a 100literalmente seriacutea ldquosi n es menor que 1 o n es mayor que 100rdquo

Operadores loacutegicos author Luis J Saacutenchez

public class OperadoresLogicos01

public static void main(String[] args)

Systemoutprintln(Adivina el nuacutemero que estoy pensando)

Systemoutprint(Introduce un nuacutemero entre el 1 y el 100 )

String linea = Systemconsole()readLine()

int n = IntegerparseInt( linea )

if ((n lt 1) || (n gt 100))

Systemoutprintln(El nuacutemero introducido debe estar en el intervalo 1 - 100)

Systemoutprint(Tienes otra oportunidad introduce un nuacutemero )

linea = Systemconsole()readLine()

n = IntegerparseInt( linea )

if (n == 24)

Systemoutprintln(iexclEnhorabuena iexclhas acertado)

else

Systemoutprintln(Lo siento ese no es el nuacutemero que estoy pensando)

Sentencia condicional (if y switch) 30

En el siguiente programa puedes ver el uso de operadores loacutegicos combinado conoperadores relacionales (operadores de comparacioacuten) Intenta adivinar cuaacutel seraacute elresultado mirando el coacutedigo

Operadores loacutegicos y relacionales author Luis J Saacutenchez

public class OperadoresLogicos02

public static void main(String[] args)

boolean a = trueboolean b = falseSystemoutprintln(a = + a)

Systemoutprintln(b = + b)

Systemoutprintln(a ampamp b = + (a ampamp b))

Systemoutprintln(a || b = + (a || b))

Systemoutprintln(a = + a)

Systemoutprintln(a || (6 gt 10) = + (a || (6 gt 10)))

Systemoutprintln(((4 lt= 4) || false) ampamp (a) = + (((4 lt= 4) || false) ampamp (a)))

Sentencia condicional (if y switch) 31

44 Sentencia switch (seleccioacuten muacuteltiple)

A veces es necesario comparar el valor de una variable con una serie de valoresconcretos La seleccioacuten muacuteltiple es muy parecida (aunque no es exactamente igual) auna secuencia de varias sentencias ifEl formato de switch es el que se muestra a continuacioacuten En legunaje natural seriacutea algoasiacute como ldquoSi variable vale valor1 entonces entra por case valor1 si variable vale valor2

entonces entra por case valor2hellip si variable no vale ninguno de los valores que hay enlos distintos case entonces entra por default

switch(variable)

case valor1

sentencias

break

case valor2

sentencias

break

default

sentencias

A continuacioacuten tienes un ejemplo completo en Java Se pide al usuario un nuacutemero demes y el programa da el nombre del mes que corresponde a ese nuacutemero

Sentencia muacuteltiple (switch) author Luis Joseacute Saacutenchez

public class SentenciaSwitch

public static void main(String[] args)

Systemoutprint(Por favor introduzca un numero de mes )

int mes = IntegerparseInt(Systemconsole()readLine())

String nombreDelMes

switch (mes)

Sentencia condicional (if y switch) 32

case 1

nombreDelMes = enero

breakcase 2

nombreDelMes = febrero

breakcase 3

nombreDelMes = marzo

breakcase 4

nombreDelMes = abril

breakcase 5

nombreDelMes = mayo

breakcase 6

nombreDelMes = junio

breakcase 7

nombreDelMes = julio

breakcase 8

nombreDelMes = agosto

breakcase 9

nombreDelMes = septiembre

breakcase 10

nombreDelMes = octubre

breakcase 11

nombreDelMes = noviembre

breakcase 12

nombreDelMes = diciembre

breakdefault

nombreDelMes = no existe ese mes

Systemoutprintln(Mes + mes + + nombreDelMes)

Observa que es necesario introducir un break despueacutes de la asignacioacuten de la variable

Sentencia condicional (if y switch) 33

nombreDelMes En caso de no encontrarse el break el programa continuacutea la ejecucioacuten enla liacutenea siguienteEl bloque que corresponde al default se ejecuta cuando la variable no coincide conninguno de los valores de los case Escribiremos siempre el default al final de lasentencia switch aunque no sea necesarioLa sentencia switch se utiliza con frecuencia para crear menuacutes

Ejemplo de un menuacute con switch author Luis Joseacute Saacutenchez

public class MenuConSwitch

public static void main(String[] args)

Systemoutprintln( CAacuteLCULO DE AacuteREAS)

Systemoutprintln( ----------------)

Systemoutprintln( 1 Cuadrado)

Systemoutprintln( 2 Rectaacutengulo)

Systemoutprintln( 3 Triaacutengulo)

Systemoutprint(n Elija una opcioacuten (1-3) )

int opcion = IntegerparseInt(Systemconsole()readLine())

double lado

double base

double altura

switch (opcion)

case 1

Systemoutprint(nIntroduzca el lado del cuadrado en cm )

lado = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(nEl aacuterea del cuadrado es + (lado lado) + cm2)

break

case 2

Systemoutprint(nIntroduzca la base del rectaacutengulo en cm )

base = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura del rectaacutengulo en cm )

altura = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El aacuterea del rectaacutengulo es + (base altura) + cm2)

break

Sentencia condicional (if y switch) 34

case 3

Systemoutprint(nIntroduzca la base del triaacutengulo en cm )

base = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura del triaacutengulo en cm )

altura = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El aacuterea del triaacutengulo es + ((base altura) 2) + cm2)

break

default

Systemoutprint(nLo siento la opcioacuten elegida no es correcta)

Sentencia condicional (if y switch) 35

45 Ejercicios

Ejercicio 1Escribe un programa que pida por teclado un diacutea de la semana y que diga queacuteasignatura toca a primera hora ese diacutea

Ejercicio 2Realiza un programa que pida una hora por teclado y que muestre luegobuenos diacuteas buenas tardes o buenas noches seguacuten la hora Se utilizaraacuten lostramos de 6 a 12 de 13 a 20 y de 21 a 5 respectivamente Soacutelo se tienen encuenta las horas los minutos no se deben introducir por teclado

Ejercicio 3Escribe un programa en que dado un nuacutemero del 1 a 7 escriba el correspon-diente nombre del diacutea de la semana

Ejercicio 4Vamos a ampliar uno de los ejercicios de la relacioacuten anterior para considerarlas horas extras Escribe un programa que calcule el salario semanal de untrabajador teniendo en cuenta que las horas ordinarias (40 primeras horas detrabajo) se pagan a 12 euros la hora A partir de la hora 41 se pagan a 16euros la hora

Ejercicio 5Realiza un programa que resuelva una ecuacioacuten de primer grado (del tipo ax+b = 0)

Ejercicio 6Realiza un programa que calcule el tiempo que tardaraacute en caer un objeto desdeuna altura h Aplica la foacutermula t =

radic2hg siendo g = 981ms2

Ejercicio 7Realiza un programa que calcule la media de tres notas

Sentencia condicional (if y switch) 36

Ejercicio 8Ampliacutea el programa anterior para que diga la nota del boletiacuten (insuficientesuficiente bien notable o sobresaliente)

Ejercicio 9Realiza un programa que resuelva una ecuacioacuten de segundo grado (del tipoax2 + bx+ c = 0)

Ejercicio 10Escribe un programa que nos diga el horoacutescopo a partir del diacutea y el mes denacimiento

Ejercicio 11Escribe un programa que dada una hora determinada (horas y minutos)calcule los segundos que faltan para llegar a la medianoche

Ejercicio 12Realiza un minicuestionario con 10 preguntas tipo test sobre las asignaturasque se imparten en el curso Cada pregunta acertada sumaraacute un punto Elprograma mostraraacute al final la calificacioacuten obtenida Paacutesale el minicuestionarioa tus compantildeeros y piacutedeles que lo hagan para ver queacute tal andan de conoci-mientos en las diferentes asignaturas del curso

Ejercicio 13Escribe un programa que ordene tres nuacutemeros enteros introducidos porteclado

Ejercicio 14Realiza un programa que diga si un nuacutemero introducido por teclado es par yodivisible entre 5

Ejercicio 15Escribe un programa que pinte una piraacutemide rellena con un caraacutecter introdu-cido por teclado que podraacute ser una letra un nuacutemero o un siacutembolo como +- $ amp etc El programa debe permitir al usuario mediante un menuacute elegir siel veacutertice de la piraacutemide estaacute apuntando hacia arriba hacia abajo hacia laizquierda o hacia la derecha

Sentencia condicional (if y switch) 37

Ejercicio 16Realiza un programa que nos diga si hay probabilidad de que nuestra parejanos estaacute siendo infiel El programa iraacute haciendo preguntas que el usuariocontestaraacute con verdadero o falso Cada pregunta contestada como verdaderosumaraacute 3 puntos Las preguntas contestadas con falso no suman puntos Utili-za el fichero test_infidelidadtxt para obtener las preguntas y las conclusionesdel programa

Ejercicio 17Escribe un programa que diga cuaacutel es la uacuteltima cifra de un nuacutemero enterointroducido por teclado

Ejercicio 18Escribe un programa que diga cuaacutel es la primera cifra de un nuacutemero enterointroducido por teclado Se permiten nuacutemeros de hasta 5 cifras

Ejercicio 19Realiza un programa que nos diga cuaacutentos diacutegitos tiene un nuacutemero entero quepuede ser positivo o negativo Se permiten nuacutemeros de hasta 5 diacutegitos

Ejercicio 20Realiza un programa que diga si un nuacutemero entero positivo introducido porteclado es capicuacutea Se permiten nuacutemeros de hasta 5 cifras

Sentencia condicional (if y switch) 38

Ejercicio 21Calcula la nota de un trimestre de la asignatura Programacioacuten El programapediraacute las dos notas que ha sacado el alumno en los dos primeros controlesSi la media de los dos controles da un nuacutemero mayor o igual a 5 el alumnoestaacute aprobado y se mostraraacute la media En caso de que la media sea un nuacutemeromenor que 5 el alumno habraacute tenido que hacer el examen de recuperacioacutenque se califica como apto o no apto por tanto se debe preguntar al usuarioiquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) Si elresultado de la recuperacioacuten es apto la nota seraacute un 5 en caso contrario semantiene la nota media anteriorEjemplo 1

Nota del primer control 7

Nota del segundo control 10

Tu nota de Programacioacuten es 85

Ejemplo 2

Nota del primer control 6

Nota del segundo control 3

iquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) apto

Tu nota de Programacioacuten es 5

Ejemplo 3

Nota del primer control 6

Nota del segundo control 3

iquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) no apto

Tu nota de Programacioacuten es 45

Ejercicio 22Realiza un programa que dado un diacutea de la semana (de lunes a viernes) y unahora (horas y minutos) calcule cuaacutentos minutos faltan para el fin de semanaSe consideraraacute que el fin de semana comienza el viernes a las 1500h Se dapor hecho que el usuario introduciraacute un diacutea y hora correctos anterior al viernesa las 1500h

5 BuclesLos bucles se utilizan para repetir un conjunto de sentencias Por ejemplo imagina quees necesario introducir la notas de 40 alumnos con el fin de calcular la media la notamaacutexima y la nota miacutenima Podriacuteamos escribir 40 veces la intruccioacuten que pide un datopor teclado Systemconsole()readLine() y convertir cada uno de esos datos a un nuacutemerocon decimales con 40 instrucciones DoubleparseDouble() no parece algo muy eficienteEs mucho maacutes praacutectico meter dentro de un bucle aquellas sentencias que queremosque se repitanNormalmente existe una condicioacuten de salida que hace que el flujo del programaabandone el bucle y continuacutee justo en la siguiente sentencia Si no existe condicioacuten desalida o si esta condicioacuten no se cumple nunca se produciriacutea lo que se llama un bucleinfinito y el programa no terminariacutea nunca

51 Bucle for

Se suele utilizar cuando se conoce previamente el nuacutemero exacto de iteraciones(repeticiones) que se van a realizar La sintaxis es la siguiente

for (expresion1 expresion2 expresion3)

sentencias

Justo al principio se ejecuta expresion1 normalmente se usa para inicializar una variableEl bucle se repite mientras se cumple expresion2 y en cada iteraccioacuten del bucle seejecuta expresion3 que suele ser el incremento o decremento de una variable Conun ejemplo se veraacute mucho maacutes claro

Bucle for author Luis Joseacute Saacutenchez

public class EjemploFor

public static void main(String[] args)

for (int i = 1 i lt 11 i++)

Systemoutprintln(i)

39

Bucles 40

En este ejemplo int i = 1 se ejecuta solo una vez antes que cualquier otra cosa comoves esta expresioacuten se utiliza para inicializar la variable i a 1 Mientra se cumpla lacondicioacuten i lt 11 el contenido del bucle o sea Systemoutprintln(i) se va a ejecutarEn cada iteracioacuten del bucle i++ hace que la variable i se incremente en 1 El resultadodel ejemplo es la impresioacuten en pantalla de los nuacutemeros del 1 al 10Intenta seguir mentalmente el flujo del programa Experimenta inicializando la variablei con otros valores cambia la condicioacuten con gt o lt= y observa lo que sucede Pruebatambieacuten a cambiar el incremento de la variable i por ejemplo con i = i + 2

52 Bucle while

El bucle while se utiliza para repetir un conjunto de sentencias siempre que se cumplauna determinada condicioacuten Es importante resentildear que la condicioacuten se comprueba alcomienzo del bucle por lo que se podriacutea dar el caso de que dicho bucle no se ejecutasenunca La sintaxis es la siguiente

while (expresion)

sentencias

Las sentencias se ejecutan una y otra vez mientras expresion sea verdadera El siguienteejemplo produce la misma salida que el ejemplo anterior muestra coacutemo cambian losvalores de i del 1 al 10

Bucle while author Luis Joseacute Saacutenchez

public class EjemploWhile

public static void main(String[] args)

int i = 1

while (i lt 11)

Systemoutprintln(i)

Bucles 41

i++

En el siguiente ejemplo se cuentan y se suman los nuacutemeros que se van introduciendopor teclado Para indicarle al programa que debe dejar de pedir nuacutemeros el usuariodebe introducir un nuacutemero negativo esa seraacute la condicioacuten de salida del bucle Observaque el bucle se repite mientras el nuacutemero introducido sea mayor o igual que cero

Bucle while que termina cuando se introduce por teclado un nuacutemero negativo author Luis Joseacute Saacutenchez

public class CuentaPositivos

public static void main(String[] args)

Systemoutprintln(Por favor vaya introduciendo nuacutemeros y pulsando INTRO)

Systemoutprintln(Para terminar introduzca un nuacutemero negativo)

int numeroIntroducido = 0

int cuentaNumeros = 0

int suma = 0

while (numeroIntroducido gt= 0)

numeroIntroducido = IntegerparseInt(Systemconsole()readLine())

cuentaNumeros++ Incrementa en uno la variablesuma += numeroIntroducido Equivale a suma = suma + NumeroIntroducido

Systemoutprintln(Has introducido + (cuentaNumeros - 1) + nuacutemeros positivos)

Systemoutprintln(La suma total de ellos es + (suma - numeroIntroducido))

53 Bucle do-while

El bucle do-while funciona de la misma manera que el bucle while con la salvedad deque expresion se evaluacutea al final de la iteraccioacuten Las sentencias que encierran el bucledo-while por tanto se ejecutan como miacutenimo una vez La sintaxis es la siguiente

Bucles 42

do

sentencias

while (expresion)

El siguiente ejemplo es el equivalente do-while a los dos ejemplos anteriores quecuentan del 1 al 10

Bucle do-while author Luis Joseacute Saacutenchez

public class EjemploDoWhile

public static void main(String[] args)

int i = 1

do

Systemoutprintln(i)

i++

while (i lt 11)

Veamos otro ejemplo En este caso se van a ir leyendo nuacutemeros de teclado mientrasel nuacutemero introducido sea par el programa pararaacute por tanto cuando se introduzcaun nuacutemero impar

Bucle do-while que termina cuando se introduce por teclado un nuacutemero impar author Luis Joseacute Saacutenchez

public class TerminaCuandoEsImpar

public static void main(String[] args)

int numero

Bucles 43

do

Systemoutprint(Dime un nuacutemero )

numero = IntegerparseInt(Systemconsole()readLine())

if (numero 2 == 0) comprueba si el nuacutemero introducido es parSystemoutprintln(Queacute bonito es el + numero)

else

Systemoutprintln(No me gustan los nuacutemeros impares adioacutes)

while (numero 2 == 0)

Te invito a que realices una modificacioacuten sobre este uacuteltimo ejemplo Despueacutes de pedirun nuacutemero haz que el programa diga iquestQuiere continuar (sn) Si el usuario introduceuna s o una S el programa deberaacute continuar pidiendo nuacutemerosCualquier bucle que un programador quiera realizar en Java lo puede implementar confor while o do-while por tanto con una sola de estas tres opciones tendriacutea suficienteNo obstante seguacuten el programa en cuestioacuten una u otra posibilidad se adapta mejorque las otras y resulta maacutes elegante Con la experiencia te iraacutes dando cuenta cuaacutendoes mejor utilizar cada una

Bucles 44

54 Ejercicios

Ejercicio 1Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle for

Ejercicio 2Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle while

Ejercicio 3Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle do-while

Ejercicio 4Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 hacia atraacutesutilizando un bucle for

Ejercicio 5Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 hacia atraacutesutilizando un bucle while

Ejercicio 6Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 utilizando un bucledo-while

Ejercicio 7Realiza el control de acceso a una caja fuerte La combinacioacuten seraacute unnuacutemero de 4 cifras El programa nos pediraacute la combinacioacuten para abrirla Si noacertamos se nos mostraraacute el mensaje ldquoLo siento esa no es la combinacioacutenrdquoy si acertamos se nos diraacute ldquoLa caja fuerte se ha abierto satisfactoriamenterdquoTendremos cuatro oportunidades para abrir la caja fuerte

Ejercicio 8Muestra la tabla de multiplicar de un nuacutemero introducido por teclado

Bucles 45

Ejercicio 9Realiza un programa que nos diga cuaacutentos diacutegitos tiene un nuacutemero introducidopor teclado

Ejercicio 10Escribe un programa que calcule la media de un conjunto de nuacutemeros positivosintroducidos por teclado A priori el programa no sabe cuaacutentos nuacutemeros seintroduciraacuten El usuario indicaraacute que ha terminado de introducir los datoscuando meta un nuacutemero negativo

Ejercicio 11Escribe un programa que muestre en tres columnas el cuadrado y el cubo delos 5 primeros nuacutemeros enteros a partir de uno que se introduce por teclado

Ejercicio 12Escribe un programa que muestre los n primeros teacuterminos de la serie deFibonacci El primer teacutermino de la serie de Fibonacci es 0 el segundo es 1y el resto se calcula sumando los dos anteriores por lo que tendriacuteamos quelos teacuterminos son 0 1 1 2 3 5 8 13 21 34 55 89 144hellip El nuacutemero n sedebe introducir por teclado

Ejercicio 13Escribe un programa que lea una lista de diez nuacutemeros y determine cuaacutentosson positivos y cuaacutentos son negativos

Ejercicio 14Escribe un programa que pida una base y un exponente (entero positivo) yque calcule la potencia

Ejercicio 15Escribe un programa que dados dos nuacutemeros uno real (base) y un enteropositivo (exponente) saque por pantalla todas las potencias con base elnumero dado y exponentes entre uno y el exponente introducido No se debenutilizar funciones de exponenciacioacuten Por ejemplo si introducimos el 2 y el 5se deberaacuten mostrar 21 22 23 24 y 25

Bucles 46

Ejercicio 16Escribe un programa que diga si un nuacutemero introducido por teclado es o noprimo Un nuacutemero primo es aquel que soacutelo es divisible entre eacutel mismo y launidad

Ejercicio 17Realiza un programa que sume los 100 nuacutemeros siguientes a un nuacutemero enteroy positivo introducido por teclado Se debe comprobar que el dato introducidoes correcto (que es un nuacutemero positivo)

Ejercicio 18Escribe un programa que obtenga los nuacutemeros enteros comprendidos entredos nuacutemeros introducidos por teclado y validados como distintos el programadebe empezar por el menor de los enteros introducidos e ir incrementando de7 en 7

Ejercicio 19Realiza un programa que pinte una piraacutemide por pantalla La altura se debepedir por teclado El caraacutecter con el que se pinta la piraacutemide tambieacuten se debepedir por teclado

Ejercicio 20Igual que el ejercicio anterior pero esta vez se debe pintar una piraacutemide hueca

Ejercicio 21Realiza un programa que vaya pidiendo nuacutemeros hasta que se introduzca unnumero negativo y nos diga cuantos nuacutemeros se han introducido la media delos impares y el mayor de los pares El nuacutemero negativo soacutelo se utiliza paraindicar el final de la introduccioacuten de datos pero no se incluye en el coacutemputo

Ejercicio 22Muestra por pantalla todos los nuacutemeros primos entre 2 y 100 ambos incluidos

Bucles 47

Ejercicio 23Escribe un programa que permita ir introduciendo una serie indeterminadade nuacutemeros mientras su suma no supere el valor 10000 Cuando esto uacuteltimoocurra se debe mostrar el total acumulado el contador de los nuacutemerosintroducidos y la media

Ejercicio 24Escribe un programa que lea un nuacutemero n e imprima una piraacutemide de nuacutemeroscon n filas como en la siguiente figura

1

121

12321

1234321

Ejercicio 25Realiza un programa que pida un nuacutemero por teclado y que luego muestre esenuacutemero al reveacutes

Ejercicio 26Realiza un programa que pida primero un nuacutemero y a continuacioacuten un diacutegitoEl programa nos debe dar la posicioacuten (o posiciones) contando de izquierda aderecha que ocupa ese diacutegito en el nuacutemero introducido

Ejercicio 27Escribe un programa que muestre cuente y sume los muacuteltiplos de 3 que hayentre 1 y un nuacutemero leiacutedo por teclado

Ejercicio 28Escribe un programa que calcule el factorial de un nuacutemero entero leiacutedo porteclado

Ejercicio 29Escribe un programa que muestre por pantalla todos los nuacutemeros enterospositivos menores a uno leiacutedo por teclado que no sean divisibles entre otrotambieacuten leiacutedo de igual forma

Bucles 48

Ejercicio 30Realiza una programa que calcule las horas transcurridas entre dos horas dedos diacuteas de la semana No se tendraacuten en cuenta los minutos ni los segundosEl diacutea de la semana se puede pedir como un nuacutemero (del 1 al 7) o comouna cadena (de ldquolunesrdquo a ldquodomingordquo) Se debe comprobar que el usuariointroduce los datos correctamente y que el segundo diacutea es posterior al primeroA continuacioacuten se muestra un ejemplo

Por favor introduzca la primera hora

Diacutea lunes

Hora 18

Por favor introduzca la segunda hora

Diacutea martes

Hora 20

Entre las 1800h del lunes y las 2000h del martes hay 26 horas

Ejercicio 31Realiza un programa que pinte la letra L por pantalla hecha con asteriscos Elprograma pediraacute la altura El palo horizontal de la L tendraacute una longitud de lamitad (divisioacuten entera entre 2) de la altura maacutes unoEjemplo

Introduzca la altura de la L 5

Bucles 49

Ejercicio 32Escribe un programa que dado un nuacutemero entero diga cuaacuteles son y cuaacutentosuman los diacutegitos pares Los diacutegitos pares se deben mostrar en orden deizquierda a derecha Usa long en lugar de int donde sea necesario para admitirnuacutemeros largosEjemplo 1

Por favor introduzca un nuacutemero entero positivo 94026782

Diacutegitos pares 4 0 2 6 8 2

Suma de los diacutegitos pares 22

Ejemplo 2

Por favor introduzca un nuacutemero entero positivo 31779

Diacutegitos pares

Suma de los diacutegitos pares 0

Ejemplo 3

Por favor introduzca un nuacutemero entero positivo 2404

Diacutegitos pares 2 4 0 4

Suma de los diacutegitos pares 10

Ejercicio 33Realiza un programa que pinte la letra U por pantalla hecha con asteriscos Elprograma pediraacute la altura Fiacutejate que el programa inserta un espacio y pintados asteriscos menos en la base para simular la curvatura de las esquinasinferioresEjemplo

Introduzca la altura de la U 5

Bucles 50

Ejercicio 34Escribe un programa que pida dos nuacutemeros por teclado y que luego mezcle endos nuacutemeros diferentes los diacutegitos pares y los impares Se van comprobandolos diacutegitos de la siguiente manera primer diacutegito del primer nuacutemero primerdiacutegito del segundo nuacutemero segundo diacutegito del primer nuacutemero segundodiacutegito del segundo nuacutemero tercer diacutegito del primer nuacutemerohellip Para facilitarel ejercicio podemos suponer que el usuario introduciraacute dos nuacutemeros de lamisma longitud y que siempre habraacute al menos un diacutegito par y uno impar Usalong en lugar de int donde sea necesario para admitir nuacutemeros largosEjemplo 1

Por favor introduzca un nuacutemero 9402

Introduzca otro nuacutemero 6782

El nuacutemero formado por los diacutegitos pares es 640822

El nuacutemero formado por los diacutegitos impares es 97

Ejemplo 2

Por favor introduzca un nuacutemero 137

Introduzca otro nuacutemero 909

El nuacutemero formado por los diacutegitos pares es 0

El nuacutemero formado por los diacutegitos impares es 19379

6 Nuacutemeros aleatoriosLos nuacutemeros aleatorios se utilizan con frecuencia en programacioacuten para emular elcomportamiento de alguacuten fenoacutemeno natural el resultado de un juego de azar o engeneral para generar cualquier valor impredecible a prioriPor ejemplo se pueden utilizar nuacutemeros aleatorios para generar tiradas de dados detal forma que de antemano no se puede saber el resultado Antes de tirar un dado nosabemos si saldraacute un 3 o un 5 se trataraacute pues de un nuacutemero impredecible lo que siacutesabemos es que saldraacute un nuacutemero entre el 1 y el 6 es decir podemos acotar el rangode los valores que vamos a obtener de forma aleatoria

61 Generacioacuten de nuacutemeros aleatorios con y sin decimales

Para generar valores aleatorios utilizaremos Mathrandom() Esta funcioacuten genera unnuacutemero con decimales (de tipo double) en el intervalo [0 - 1) es decir genera un nuacutemeromayor o igual que 0 y menor que 1El siguiente programa genera diez nuacutemeros aleatorios

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio01

public static void main(String[] args)

Systemoutprintln(Diez nuacutemeros aleatoriosn)

for (int i = 1 i lt 11 i++)

Systemoutprintln(Mathrandom())

La salida del programa puede ser algo como esto

51

Nuacutemeros aleatorios 52

030830376099567813

08330493363981046

02322483682676435

03130746053770094

034192944433558736

09636470440975567

03398896383918959

079825461825305

09868509622870223

09967893773101499

Te invito a que ejecutes varias veces el programa Podraacutes observar que cada vez salennuacutemeros diferentes aunque siempre estaacuten comprendidos entre 0 y 1 (incluyendo el0)Pensaraacutes que no es muy uacutetil generar nuacutemeros aleatorios entre 0 y 1 si lo que queremoses por ejemplo sacar una carta al azar de la baraja espantildeola pero en realidad unnuacutemero decimal entre 0 y 1 es lo uacutenico que nos hace falta para generar cualquier tipode valor aleatorio siempre y cuando se manipule ese nuacutemero de la forma adecuadaPor ejemplo si queremos generar valores aleatorios entre 0 y 10 (incluyendo el 0 y sinllegar a 10) simplemente tendremos que correr la coma un lugar o lo que es lo mismomultiplicar por 10

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio02

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 0 y 10)

Systemoutprintln( sin llegar a 10 (con decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprintln( Mathrandom()10 + )

El programa anterior genera una salida como eacutesta

Nuacutemeros aleatorios 53

007637674702636321

1025787417143682

1854993461897163

5690351111720931

382310645589797

5518007662236258

923529380254256

39201032643833376

5836554253122096

6224559064261578

7652976185871555

49922807025365135

7498156441347868

8743251697509109

9727764845406675

2929766691797686

005801413446517634

21575652936687284

Si queremos generar nuacutemeros enteros en lugar de nuacutemeros con decimales basta conhacer un casting para convertir los nuacutemeros de tipo double en nuacutemeros de tipo intRecuerda que (int)x transforma x en una variable de tipo entero si x era de tipo float

o double perderiacutea todos los decimales

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio03

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 0 y 9 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint((int)(Mathrandom()10) + )

Systemoutprintln()

La salida del programa debe ser algo muy parecido a esto

Nuacutemeros aleatorios 54

20 nuacutemeros aleatorios entre 0 y 9 (sin decimales)

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

iquestY si en lugar de generar nuacutemeros enteros entre 0 y 9 queremos generar nuacutemeros entre1 y 10 Como habraacutes podido adivinar simplemente habriacutea que sumar 1 al nuacutemerogenerado de esta forma se ldquodesplazan un pasordquo los valores generados al azar de talforma que el miacutenimo valor que se produce seriacutea el 0 + 1 = 1 y el maacuteximo seriacutea 9 + 1= 10

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio04

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 1 y 10 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint( (int)(Mathrandom()10 + 1) + )

Systemoutprintln()

Vamos a ponerlo un poco maacutes difiacutecil Ahora vamos a generar nuacutemeros enteros entre50 y 60 ambos incluidos Primero multiplicamos Mathrandom() por 11 con lo queobtenemos nuacutemeros decimales entre 0 y 109999hellip (sin llegar nunca hasta 11) Luegodesplazamos ese intervalo sumando 50 por lo que obtenemos nuacutemeros decimalesentre 50 y 609999hellip Por uacuteltimo quitamos los decimales haciendo casting y voilagraveya tenemos nuacutemeros enteros aleatorios entre 50 y 60 ambos incluidos

Nuacutemeros aleatorios 55

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio05

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 50 y 60 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint(((int)(Mathrandom()11) + 50 ) + )

Systemoutprintln()

62 Generacioacuten de palabras de forma aleatoria de un conjuntodado

Hemos visto coacutemo generar nuacutemeros aleatorios con y sin decimales y en diferentesintervalos Vamos a producir ahora de forma aleatoria una palabra - piedra papel otijera - generando primero un nuacutemero entero entre 0 y 2 y posteriormente haciendocorresponder una palabra a cada nuacutemero

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio06

public static void main(String[] args)

Systemoutprintln(Genera al azar piedra papel o tijera)

int mano = (int)(Mathrandom()3) genera un nuacutemero al azar entre 0 y 2 ambos incluidos

switch(mano)

case 0

Systemoutprintln(piedra)

Nuacutemeros aleatorios 56

breakcase 1

Systemoutprintln(papel)

breakcase 2

Systemoutprintln(tijera)

breakdefault

iquestCoacutemo podriacuteamos generar un diacutea de la semana de forma aleatoria En efecto primerogeneramos un nuacutemero entre 1 y 7 ambos inclusive y luego hacemos corresponder undiacutea de la semana a cada uno de los nuacutemeros

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio07

public static void main(String[] args)

Systemoutprintln(Muestra un diacutea de la semana al azar)

int dia = (int)(Mathrandom()7) + 1 genera un nuacutemero aleatorio entre el 1 y el 7

switch(dia)

case 1

Systemoutprintln(lunes)

breakcase 2

Systemoutprintln(martes)

breakcase 3

Systemoutprintln(mieacutercoles) breakcase 4

Systemoutprintln(jueves)

breakcase 5

Systemoutprintln(viernes)

breakcase 6

Nuacutemeros aleatorios 57

Systemoutprintln(saacutebado)

breakcase 7

Systemoutprintln(domingo)

breakdefault

Nuacutemeros aleatorios 58

63 Ejercicios

Ejercicio 1Escribe un programa que muestre la tirada de tres dados Se debe mostrartambieacuten la suma total (los puntos que suman entre los tres dados)

Ejercicio 2Realiza un programa que muestre al azar el nombre de una carta de labaraja francesa Esta baraja estaacute dividida en cuatro palos picas corazonesdiamantes y treacuteboles Cada palo estaacute formado por 13 cartas de las cuales 9cartas son numerales y 4 literales 2 3 4 5 6 7 8 9 10 J Q K y A (queseriacutea el 1) Para convertir un nuacutemero en una cadena de caracteres podemosusar StringvalueOf(n)

Ejercicio 3Igual que el ejercicio anterior pero con la baraja espantildeola Se utilizaraacute la barajade 40 cartas 2 3 4 5 6 7 sota caballo rey y as

Ejercicio 4Muestra 20 nuacutemeros enteros aleatorios entre 0 y 10 (ambos incluidos) sepa-rados por espacios

Ejercicio 5Muestra 50 nuacutemeros enteros aleatorios entre 100 y 199 (ambos incluidos)separados por espacios Muestra tambieacuten el maacuteximo el miacutenimo y la mediade esos nuacutemeros

Ejercicio 6Escribe un programa que piense un nuacutemero al azar entre 0 y 100 El usuariodebe adivinarlo y tiene para ello 5 oportunidades Despueacutes de cada intentofallido el programa diraacute cuaacutentas oportunidades quedan y si el nuacutemero intro-ducido es menor o mayor que el nuacutemero secreto

Ejercicio 7Escribe un programa que muestre tres apuestas de la quiniela en tres colum-nas para los 14 partidos y el pleno al quince (15 filas)

Nuacutemeros aleatorios 59

Ejercicio 8Modifica el programa anterior para que la probabilidad de que salga un 1 seade 12 la probabilidad de que salga x sea de 13 y la probabilidad de que salga2 sea de 16 Pista 12 = 36 y 13 = 26

Ejercicio 9Realiza un programa que vaya generando nuacutemeros aleatorios pares entre 0y 100 y que no termine de generar nuacutemeros hasta que no saque el 24 Elprograma deberaacute decir al final cuaacutentos nuacutemeros se han generado

Ejercicio 10Realiza un programa que pinte por pantalla diez liacuteneas formadas por carac-teres El caraacutecter con el que se pinta cada liacutenea se elige de forma aleatoriaentre uno de los siguientes - = | Las liacuteneas deben tener una longitudaleatoria entre 1 y 40 caracteres

Ejercicio 11Escribe un programa que muestre 20 notas generadas al azar Las notas debenaparecer de la forma suspenso suficiente bien notable o sobresaliente Alfinal apareceraacute el nuacutemero de suspensos el nuacutemero de suficientes el nuacutemerode bienes etc

Ejercicio 12Realiza un programa que llene la pantalla de caracteres aleatorios (a lo Matrix)con el coacutedigo ascii entre el 32 y el 126 Puedes hacer casting con (char) paraconvertir un entero en un caraacutecter

Ejercicio 13Escribe un programa que simule la tirada de dos dados El programa deberaacutecontinuar tirando los dados una y otra vez hasta que en alguna tirada los dosdados tengan el mismo valor

Ejercicio 14Realiza un programa que haga justo lo contrario a lo que hace el ejercicio 6El programa intentaraacute adivinar el nuacutemero que estaacutes pensando - un nuacutemeroentre 0 y 100 - teniendo para ello 5 oportunidades En cada intento fallido elprograma debe preguntar si el nuacutemero que estaacutes pensando es mayor o menorque el que te acaba de decir

Nuacutemeros aleatorios 60

Ejercicio 15Realiza un generador de melodiacutea con las siguientes condicionesa) Las notas deben estar generadas al azar Las 7 notas son do re mi fasol la y sib) Una melodiacutea estaacute formada por un nuacutemero aleatorio de notas mayor o iguala 4 menor o igual a 28 y siempre muacuteltiplo de 4 (4 8 12hellip)c) Cada grupo de 4 notas seraacute un compaacutes y estaraacute separado del siguientecompaacutes mediante la barra vertical ldquo|rdquo (Alt + 1) El final de la melodiacutea se marcacon dos barrasd) La uacuteltima nota de la melodiacutea debe coincidir con la primeraEjemplo 1

do mi fa mi | si do sol fa | fa re si do | sol mi re do ||

Ejemplo 2

la re mi sol | fa mi mi si | do la sol fa | fa re si sol | do sol mi re | fa la do la ||

Nuacutemeros aleatorios 61

Ejercicio 16Realiza un simulador de maacutequina tragaperras simplificada que cumpla lossiguientes requisitosa) El ordenador mostraraacute una tirada que consiste en mostrar 3 figuras Hay 5figuras posibles corazoacuten diamante herradura campana y limoacutenb) Si las tres figuras son diferentes se debe mostrar el mensaje ldquoLo sientoha perdidordquoc) Si hay dos figuras iguales y una diferente se debe mostrar el mensaje ldquoBienha recuperado su monedardquod) Si las tres figuras son iguales se debe mostrar ldquoEnhorabuena ha ganado10 monedasrdquoEjemplo 1

diamante diamante limoacuten

Bien ha recuperado su moneda

Ejemplo 2

herradura campana diamante

Lo siento ha perdido

Ejemplo 3

corazoacuten corazoacuten corazoacuten

Enhorabuena ha ganado 10 monedas

7 Arrays

71 Arrays de una dimensioacuten

Un array es un tipo de dato capaz de almacenar muacuteltiples valores Se utiliza paraagrupar datos muy parecidos por ejemplo si se necesita almacenar la temperaturamedia diaria en Maacutelaga durante el uacuteltimo antildeo se pueden utilizar las variables temp0temp1 temp2 temp3 temp4 hellip y asiacute hasta 365 variables distintas pero seriacutea poco praacutectico esmejor utilizar un array de nombre temp y usar un iacutendice para referanciar la temperaturade un diacutea concreto del antildeoEn matemaacuteticas un array de una dimensioacuten se llama vector En este libro noutilizaremos este teacutermino para no confundirlo con la clase Vector de JavaVeamos con un ejemplo coacutemo se crea y se utiliza un array

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array01

public static void main(String[] args)

int[] n se define n como un array de enterosn = new int[4] se reserva espacio para 4 enteros

n[0] = 26

n[1] = -30

n[2] = 0

n[3] = 100

Systemoutprint(Los valores del array n son los siguientes )

Systemoutprint(n[0] + + n[1] + + n[2] + + n[3])

int suma = n[0] + n[3]

Systemoutprintln(nEl primer elemento del array maacutes el uacuteltimo suman + suma)

Observa que el iacutendice de cada elemento de un array se indica entre corchetes de talforma que n[3] es el cuarto elemento ya que el primer iacutendice es el 0

62

Arrays 63

Array n

Iacutendice Valor0 261 -302 03 11

Fiacutejate que la definicioacuten del array y la reserva de memoria para los cuatro elementosque la componen se ha realizado en dos liacuteneas diferentes Se pueden hacer ambascosas en una sola liacutenea como veremos en el siguiente ejemplo

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array02

public static void main(String[] args)

definicioacuten del array y reserva de memoria en la misma liacuteneaint[] x = new int[5]

x[0] = 8

x[1] = 33

x[2] = 200

x[3] = 150

x[4] = 11

Systemoutprintln(El array x tiene 5 elementos iquestcuaacutel de ellos quiere ver)

Systemoutprint(Introduzca un nuacutemero del 0 al 4 )

int indice = IntegerparseInt(Systemconsole()readLine())

Systemoutprint(El elemento que se encuentra en la posicioacuten + indice)

Systemoutprintln( es el + x[indice])

El array x del ejemplo anterior se ha ido rellenando elemento a elemento Si se conocenpreviamente todos los valores iniciales del array se puede crear e inicializar en unasola liacutenea de la siguiente forma

int[] x = 8 33 200 150 11

Cada elemento del array se puede utilizar exactamente igual que cualquier otravariable es decir se le puede asignar un valor o se puede usar dentro de una

Arrays 64

expresioacuten En el siguiente ejemplo se muestran varias operaciones en las que losoperandos son elementos del array numPara recorrer todos los elementos de un array se suele utilizar un bucle for junto conun iacutendice que va desde 0 hasta el tamantildeo del array menos 1

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array03

public static void main(String[] args)

int[] num = new int[10]

num[0] = 8

num[1] = 33

num[2] = 200

num[3] = 150

num[4] = 11

num[5] = 88

num[6] = num[2] 10

num[7] = num[2] 10

num[8] = num[0] + num[1] + num[2]

num[9] = num[8]

Systemoutprintln(El array num contiene los siguientes elementos)

for (int i = 0 i lt 10 i++)

Systemoutprintln(num[i])

En Java a diferencia de otros lenguajes como Ruby o PHP todos los elementos de unarray deben ser del mismo tipo por ejemplo no puede haber un entero en la posicioacuten2 y una cadena de caracteres en la posicioacuten 7 del mismo array En el siguiente ejemplose muestra un array de caracteres

Arrays 65

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array04

public static void main(String[] args)

char[] caracter = new char[6]

caracter[0] = R

caracter[1] =

caracter[2] = amp

caracter[3] = +

caracter[4] = A

caracter[5] = 2

Systemoutprintln(El array caracter contiene los siguientes elementos)

for (int i = 0 i lt 6 i++)

Systemoutprintln(caracter[i])

En el siguiente ejemplo se muestra un array de nuacutemeros de tipo double que almacenanotas de alumnos

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array05

public static void main(String[] args)

double[] nota = new double[4]

Systemoutprintln(Para calcular la nota media necesito saber la )

Systemoutprintln(nota de cada uno de tus exaacutemenes)

for (int i = 0 i lt 4 i++)

Arrays 66

Systemoutprint(Nota del examen nordm + (i + 1) + )

nota[i] = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(Tus notas son )

double suma = 0

for (int i = 0 i lt 4 i++)

Systemoutprint(nota[i] + )

suma += nota[i]

Systemoutprintln(nLa media es + suma 4)

72 Arrays bidimensionales

Un array bidimensional utiliza dos iacutendices para localizar cada elemento Podemos vereste tipo de dato como un array que a su vez contiene otros arrays Tambieacuten se puedever como una cuadriacutecula en la que los datos quedan distribuidos en filas y columnasEn el siguiente ejemplo se muestra la definicioacuten y el uso de un array de dosdimensiones

author Luis Joseacute Saacutenchez Ejemplo de uso de arrays bidimensionales

public class ArrayBi01

public static void main(String[] args)

throws InterruptedException Se antildeade esta liacutenea para poder usar sleep

int[][] n = new int[3][2] array de 3 filas por 2 columnas

n[0][0]=20

n[1][0]=67

n[1][1]=33

n[2][1]=7

int fila columna

Arrays 67

for(fila = 0 fila lt 3 fila++)

Systemoutprint(Fila + fila)

for(columna = 0 columna lt 2 columna++)

Systemoutprintf(10d n[fila][columna])

Threadsleep(1000) retardo de un segundo

Systemoutprintln()

Mediante la liacutenea int[][] n = new int[3][2] se define un array bidimensional de 3 filaspor 2 columnas pero bien podriacutean ser 2 filas por 3 columnas seguacuten el objetivo y eluso que del array haga el programadorLos valores del array bidimensional se pueden proporcionar en la misma liacutenea de ladefinicioacuten como se muestra en el siguiente ejemplo

author Luis Joseacute Saacutenchez Ejemplo de uso de arrays bidimensionales

public class ArrayBi02

public static void main(String[] args)

throws InterruptedException Se antildeade esta liacutenea para poder usar sleep

int fila columna

int[][] n = 20 4 67 33 07

for(fila = 0 fila lt 3 fila++)

Systemoutprint(Fila + fila)

for(columna = 0 columna lt 2 columna++)

Systemoutprintf(10d n[fila][columna])

Threadsleep(1000) retardo de un segundo

Systemoutprintln()

Arrays 68

Los arrays bidimensionales se utilizan con frecuencia para situar objetos en un planocomo por ejemplo las piezas de ajedrez en un tablero o un personaje de video-juegoen un laberintoEn el siguiente programa se colocan una mina y un tesoro de forma aleatoria en uncuadrante de cuatro filas por cinco columnas El usuario intentaraacute averiguar doacutendeestaacute el tesoro indicando las coordenadas (x y)

Minijuego Busca el tesoro Se colocan una mina y un tesoro de forma aleatoria en un cuadrante de cuatro filas por cinco columnas El usuario intentaraacute averiguar doacutende estaacute el tesoro author Luis Joseacute Saacutenchez

public class BuscaTesoro

se definen constantes para representar el contenido de las celdasstatic final int VACIO = 0

static final int MINA = 1

static final int TESORO = 2

static final int INTENTO = 3

public static void main(String[] args)

int x

int y

int[][] cuadrante = new int[5][4]

inicializa el arrayfor(x = 0 x lt 4 x++)

for(y = 0 y lt 3 y++)

cuadrante[x][y] = VACIO

coloca la minaint minaX = (int)(Mathrandom()4)int minaY = (int)(Mathrandom()3)cuadrante[minaX][minaY] = MINA

coloca el tesoroint tesoroX

Arrays 69

int tesoroY

do

tesoroX = (int)(Mathrandom()4)tesoroY = (int)(Mathrandom()3)

while ((minaX == tesoroX) ampamp (minaY == tesoroY))

cuadrante[tesoroX][tesoroY] = TESORO

juegoSystemoutprintln(iexclBUSCA EL TESORO)

boolean salir = falseString c =

do

pinta el cuadrantefor(y = 3 y gt= 0 y--)

Systemoutprint(y + |)

for(x = 0 x lt 5 x++)

if (cuadrante[x][y] == INTENTO)

Systemoutprint(X )

elseSystemoutprint( )

Systemoutprintln()

Systemoutprintln( ----------n 0 1 2 3 4n)

pide las coordenadasSystemoutprint(Coordenada x )

x = IntegerparseInt(Systemconsole()readLine())

Systemoutprint(Coordenada y )

y = IntegerparseInt(Systemconsole()readLine())

mira lo que hay en las coordenadas indicadas por el usuarioswitch(cuadrante[x][y])

case VACIO

cuadrante[x][y] = INTENTO

breakcase MINA

Systemoutprintln(Lo siento has perdido)

salir = truebreak

case TESOROSystemoutprintln(Enhorabuena has encontrado el tesoro)

salir = truebreak

default

Arrays 70

while (salir)

pinta el cuadrantefor(y = 3 y gt= 0 y--)

Systemoutprint(y + )

for(x = 0 x lt 5 x++)

switch(cuadrante[x][y])

case VACIO

c =

breakcase MINA

c =

breakcase TESORO

c = euro

breakcase INTENTO

c = x

breakdefault

Systemoutprint(c)

Systemoutprintln()

Systemoutprintln( ----------n 0 1 2 3 4n)

73 Recorrer arrays con for al estilo foreach

Al trabajar con arrays es muy frecuente cometer errores utilizando los iacutendices El errormaacutes tiacutepico consiste en intentar acceder a un elemento mediante un iacutendice que se salede los liacutemites Por ejemplo si tenemos el array n definido de la siguiente forma int[] n =

new int[10] cuando intentamos acceder a n[-1] o a n[10] obtenemos un error en tiempode ejecucioacutenPara recorrer un array de un modo maacutes praacutectico y sencillo sin que tengamos quepreocuparnos de los liacutemites podemos utilizar el bucle for con el formato foreach Deesta forma indicamos simplemente el nombre del array que queremos recorrer y enqueacute variable se va a ir colocando cada elemento con cada iteraccioacuten del bucle No hayque especificar con queacute iacutendice comienza y termina el bucle de eso se encarga JavaA continuacioacuten se muestra el ejemplo Array05java visto anteriormente pero esta vezutilizando el for a la manera foreach

Arrays 71

Recorre un array con un for al estilo foreach author Luis Joseacute Saacutenchez

public class ArrayForEach

public static void main(String[] args)

double[] nota = new double[4]

Systemoutprintln(Para calcular la nota media necesito saber la )

Systemoutprintln(nota de cada uno de tus exaacutemenes)

for (int i = 0 i lt 4 i++)

Systemoutprint(Nota del examen nordm + (i + 1) + )

nota[i] = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(Tus notas son )

double suma = 0

for (double n nota) for al estilo foreachSystemoutprint(n + )

suma += n

Systemoutprintln(nLa media es + suma 4)

Fiacutejate en el segundo for en este caso no se utiliza ninguacuten iacutendice simplemente decimosldquove sacando uno a uno los elementos del array nota y deposita cada uno de esoselementos en la variable n que es de tipo doublerdquo

Arrays 72

74 Ejercicios

741 Arrays de una dimensioacuten

Ejercicio 1Define un array de 12 nuacutemeros enteros con nombre num y asigna los valoresseguacuten la tabla que se muestra a continuacioacuten Muestra el contenido de todoslos elementos del array iquestQueacute sucede con los valores de los elementos que nohan sido inicializados

Ejercicio 2Define un array de 10 caracteres con nombre simbolo y asigna valores a loselementos seguacuten la tabla que se muestra a continuacioacuten Muestra el contenidode todos los elementos del array iquestQueacute sucede con los valores de los elementosque no han sido inicializados

Ejercicio 3Escribe un programa que lea 10 nuacutemeros por teclado y que luego los muestreen orden inverso es decir el primero que se introduce es el uacuteltimo enmostrarse y viceversa

Ejercicio 4Define tres arrays de 20 nuacutemeros enteros cada una con nombres numerocuadrado y cubo Carga el array numero con valores aleatorios entre 0 y 100 En elarray cuadrado se deben almacenar los cuadrados de los valores que hay en elarray numero En el array cubo se deben almacenar los cubos de los valores quehay en numero A continuacioacuten muestra el contenido de los tres arrays dispuestoen tres columnas

Arrays 73

Ejercicio 5Escribe un programa que pida 10 nuacutemeros por teclado y que luego muestrelos nuacutemeros introducidos junto con las palabras ldquomaacuteximordquo y ldquomiacutenimordquo al ladodel maacuteximo y del miacutenimo respectivamente

Ejercicio 6Escribe un programa que lea 15 nuacutemeros por teclado y que los almacene en unarray Rota los elementos de ese array es decir el elemento de la posicioacuten 0debe pasar a la posicioacuten 1 el de la 1 a la 2 etc El nuacutemero que se encuentra enla uacuteltima posicioacuten debe pasar a la posicioacuten 0 Finalmente muestra el contenidodel array

Ejercicio 7Escribe un programa que genere 100 nuacutemeros aleatorios del 0 al 20 y que losmuestre por pantalla separados por espacios El programa pediraacute entoncespor teclado dos valores y a continuacioacuten cambiaraacute todas las ocurrencias delprimer valor por el segundo en la lista generada anteriormente Los nuacutemerosque se han cambiado deben aparecer entrecomillados

Ejercicio 8Realiza un programa que pida la temperatura media que ha hecho en cada mesde un determinado antildeo y que muestre a continuacioacuten un diagrama de barrashorizontales con esos datos Las barras del diagrama se pueden dibujar a basede asteriscos o cualquier otro caraacutecter

Ejercicio 9Realiza un programa que pida 8 nuacutemeros enteros y que luego muestre esosnuacutemeros junto con la palabra ldquoparrdquo o ldquoimparrdquo seguacuten proceda

Ejercicio 10Escribe un programa que genere 20 nuacutemeros enteros aleatorios entre 0 y 100y que los almacene en un array El programa debe ser capaz de pasar todoslos nuacutemeros pares a las primeras posiciones del array (del 0 en adelante) ytodos los nuacutemeros impares a las celdas restantes Utiliza arrays auxiliares sies necesario

Arrays 74

Ejercicio 11Realiza un programa que pida 10 nuacutemeros por teclado y que los almacene enun array A continuacioacuten se mostraraacute el contenido de ese array junto al iacutendice(0 ndash 9) utilizando para ello una tabla Seguidamente el programa pasaraacute losprimos a las primeras posiciones desplazando el resto de nuacutemeros (los queno son primos) de tal forma que no se pierda ninguno Al final se debe mostrarel array resultantePor ejemplo

Array inicial

Array final

Ejercicio 12Realiza un programa que pida 10 nuacutemeros por teclado y que los almacene enun array A continuacioacuten se mostraraacute el contenido de ese array junto al iacutendice(0 ndash 9) Seguidamente el programa pediraacute dos posiciones a las que llamaremosldquoinicialrdquo y ldquofinalrdquo Se debe comprobar que inicial es menor que final y queambos nuacutemeros estaacuten entre 0 y 9 El programa deberaacute colocar el nuacutemero dela posicioacuten inicial en la posicioacuten final rotando el resto de nuacutemeros para que nose pierda ninguno Al final se debe mostrar el array resultantePor ejemplo para inicial = 3 y final = 7

Array inicial

Array final

Arrays 75

Ejercicio 13Escribe un programa que rellene un array de 100 elementos con nuacutemeros ente-ros aleatorios comprendidos entre 0 y 500 (ambos incluidos) A continuacioacutenel programa mostraraacute el array y preguntaraacute si el usuario quiere destacar elmaacuteximo o el miacutenimo Seguidamente se volveraacute a mostrar el array escribiendoel nuacutemero destacado entre dobles asteriscosEjemplo

459 204 20 250 178 90 353 32 229 357 224 454 260 310 140 249 332 426 423 413 96 447 465 29

8 459 411 118 480 302 417 42 82 126 82 474 362 76 190 104 21 257 88 21 251 6 383 47 78 392

394 244 494 87 253 376 379 98 364 237 13 299 228 409 402 225 426 267 330 243 209 426 435

309 356 173 130 416 15 477 34 28 377 193 481 368 466 262 422 275 384 399 397 87 218 84 312

480 207 68 108

iquestQueacute quiere destacar (1 ndash miacutenimo 2 ndash maacuteximo) 1

459 204 20 250 178 90 353 32 229 357 224 454 260 310 140 249 332 426 423 413 96 447 465 29

8 459 411 118 480 302 417 42 82 126 82 474 362 76 190 104 21 257 88 21 251 6 383 47 78

392 394 244 494 87 253 376 379 98 364 237 13 299 228 409 402 225 426 267 330 243 209 426

435 309 356 173 130 416 15 477 34 28 377 193 481 368 466 262 422 275 384 399 397 87 218 84

312 480 207 68 108

Ejercicio 14Escribe un programa que pida 8 palabras y las almacene en un array Acontinuacioacuten las palabras correspondientes a colores se deben almacenar alcomienzo y las que no son colores a continuacioacuten Puedes utilizar tantos arraysauxiliares como quieras Los colores que conoce el programa deben estar enotro array y son los siguientes verde rojo azul amarillo naranja rosa negroblanco y moradoEjemplo

Array original

0 1 2 3 4 5 6 7

casa azul verde orden morado bombillabici rosa

Array resultado

0 1 2 3 4 5 6 7

azul verde morado rosa casa orden bombillabici

Arrays 76

Ejercicio 15Un restaurante nos ha encargado una aplicacioacuten para colocar a los clientes ensus mesas En una mesa se pueden sentar de 0 (mesa vaciacutea) a 4 comensales(mesa llena) Cuando llega un cliente se le pregunta cuaacutentos son De momentoel programa no estaacute preparado para colocar a grupos mayores a 4 por tantosi un cliente dice por ejemplo que son un grupo de 6 el programa daraacute elmensaje ldquoLo siento no admitimos grupos de 6 haga grupos de 4personas como maacuteximo e intente de nuevordquo Para el grupo que llegase busca siempre la primera mesa libre (con 0 personas) Si no quedan mesaslibres se busca donde haya un hueco para todo el grupo por ejemplo si elgrupo es de dos personas se podraacute colocar donde haya una o dos personasInicialmente las mesas se cargan con valores aleatorios entre 0 y 4 Cadavez que se sientan nuevos clientes se debe mostrar el estado de las mesasLos grupos no se pueden romper aunque haya huecos sueltos suficientes Elfuncionamiento del programa se ilustra a continuacioacutenEjemplo

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 0 2 4 1 0 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 2

Por favor sieacutentense en la mesa nuacutemero 3

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 1 0 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 4

Por favor sieacutentense en la mesa nuacutemero 7

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 1 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 3

Tendraacuten que compartir mesa Por favor sieacutentense en la mesa nuacutemero 6

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 4 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 4

Lo siento en estos momentos no queda sitio

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 4 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) -1

Gracias Hasta pronto

Arrays 77

Ejercicio 16Escribe un programa que rellene un array de 20 elementos con nuacutemeros ente-ros aleatorios comprendidos entre 0 y 400 (ambos incluidos) A continuacioacutenel programa mostraraacute el array y preguntaraacute si el usuario quiere resaltar losmuacuteltiplos de 5 o los muacuteltiplos de 7 Seguidamente se volveraacute a mostrar elarray escribiendo los nuacutemeros que se quieren resaltar entre corchetesEjemplo ldquolsquoconsole159 204 20 250 178 90 353 32 229 357 224 54 260 310 140 249 335 326 22313 iquestQueacute nuacutemeros quiere resaltar (1 ndash los muacuteltiplos de 5 2 ndash los muacuteltiplos de7) 1 159 204 [20] [250] 178 [90] 353 32 229 357 224 54 [260] [310] [140]249 [335] 326 223 13 ldquolsquo

742 Arrays bidimensionales

Ejercicio 1Define un array de nuacutemeros enteros de 3 filas por 6 columnas con nombre num

y asigna los valores seguacuten la siguiente tabla Muestra el contenido de todoslos elementos del array dispuestos en forma de tabla como se muestra en lafigura

Ejercicio 2Escribe un programa que pida 20 nuacutemeros enteros Estos nuacutemeros se debenintroducir en un array de 4 filas por 5 columnas El programa mostraraacute lassumas parciales de filas y columnas igual que si de una hoja de caacutelculo setratara La suma total debe aparecer en la esquina inferior derecha

Arrays 78

Ejercicio 3Modifica el programa anterior de tal forma que los nuacutemeros que se introducenen el array se generen de forma aleatoria (valores entre 100 y 999)

Ejercicio 4Modifica el programa anterior de tal forma que las sumas parciales y la sumatotal aparezcan en la pantalla con un pequentildeo retardo dando la impresioacuten deque el ordenador se queda ldquopensandordquo antes de mostrar los nuacutemeros

Ejercicio 5Realiza un programa que rellene un array de 6 filas por 10 columnas connuacutemeros enteros positivos comprendidos entre 0 y 1000 (ambos incluidos)A continuacioacuten el programa deberaacute dar la posicioacuten tanto del maacuteximo comodel miacutenimo

Ejercicio 6Modifica el programa anterior de tal forma que no se repita ninguacuten nuacutemero enel array

Ejercicio 7Mejora el juego ldquoBusca el tesorordquo de tal forma que si hay una mina a una casillade distancia el programa avise diciendo iexclCuidado iexclHay una mina cerca

Ejercicio 8Escribe un programa que dada una posicioacuten en un tablero de ajedrez nos digaa queacute casillas podriacutea saltar un alfil que se encuentra en esa posicioacuten Como seindica en la figura el alfil se mueve siempre en diagonal El tablero cuenta con64 casillas Las columnas se indican con las letras de la ldquoardquo a la ldquohrdquo y las filasse indican del 1 al 8

Arrays 79

Ejemplo

Introduzca la posicioacuten del alfil d5

El aacutelfil puede moverse a las siguientes posiciones

h1 a2 g2 b3 e3 c4 e4 c6 e6 b7 f7 a8 g8

Ejercicio 9Realiza un programa que sea capaz de rotar todos los elementos de unamatriz cuadrada una posicioacuten en el sentido de las agujas del reloj La matrizdebe tener 12 filas por 12 columnas y debe contener nuacutemeros generados alazar entre 0 y 100 Se debe mostrar tanto la matriz original como la matrizresultado ambas con los nuacutemeros convenientemente alineados

Ejercicio 10Realiza el juego de las tres en raya

8 Funciones

81 Implementando funciones para reutilizar coacutedigo

En programacioacuten es muy frecuente reutilizar coacutedigo es decir usar coacutedigo ya exis-tente Cuando una parte de un programa requiere una funcionalidad que ya estaacuteimplementada en otro programa no tiene mucho sentido emplear tiempo y energiacuteaen implementarla otra vezUna funcioacuten es un trozo de coacutedigo que realiza una tarea muy concreta y que se puedeincluir en cualquier programa cuando hace falta resolver esa tarea Opcionalmentelas funciones aceptan una entrada (paraacutemetros de entrada) y devuelven una salidaObserva el siguiente ejemplo Se trata de un programa que pide un nuacutemero por tecladoy luego dice si el nuacutemero introducido es o no es primo

Dice si un nuacutemero es o no es primo (sin funciones) author Luis Joseacute Saacutenchez

public class NumeroPrimo

public static void main(String[] args)

Systemoutprint(Introduce un nuacutemero entero positivo )

int n = IntegerparseInt(Systemconsole()readLine())

boolean esPrimo = truefor (int i = 2 i lt n i++)

if ((n i) == 0)

esPrimo = false

if (esPrimo)

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

80

Funciones 81

Podemos intuir que la tarea de averiguar si un nuacutemero es o no primo seraacute algo queutilizaremos con frecuencia maacutes adelante asiacute que podemos aislar el trozo de coacutedigoque realiza ese cometido para usarlo con comodidad en otros programas

Dice si un nuacutemero es o no es primo usando una funcioacuten author Luis Joseacute Saacutenchez

public class NumeroPrimoConFuncion

Programa principal

public static void main(String[] args)

Systemoutprint(Introduzca un nuacutemero entero positivo )

int n = IntegerparseInt(Systemconsole()readLine())

if (esPrimo(n))

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

Funciones

Comprueba si un nuacutemero entero positivo es primo o no Un nuacutemero es primo cuando uacutenicamente es divisible entre eacutel mismo y la unidad param x un nuacutemero entero positivo return ltcodegttrueltcodegt si el nuacutemero es primo return ltcodegtfalseltcodegt en caso contrario

public static boolean esPrimo(int x)

for (int i = 2 i lt x i++)

if ((x i) == 0)

return false

Funciones 82

return true

Cada funcioacuten tiene una cabecera y un cuerpo En el ejemplo anterior la cabecera es

public static boolean esPrimo(int x)

De momento no vamos a explicar queacute significa public static lo dejaremos para cuandoveamos el capiacutetulo 9 ldquoProgramacioacuten orientada a objetosrdquo por ahora lo escribiremos talcual cada vez que definamos una funcioacuten A continuacioacuten se escribe el tipo de dato quedevuelve la funcioacuten en este caso es boolean porque la funcioacuten devolveraacute siempre true

(verdadero) o false falso Lo uacuteltimo que lleva la cabecera son los paraacutemetros encerradosentre pareacutentesis Esos paraacutemetros son los valores que se le pasan a la funcioacuten paraque realice los caacutelculos En este caso concreto el paraacutemetro que se pasa es x o seael nuacutemero que queremos saber si es primo o no Es necesario indicar siempre el tipode cada paraacutemetro en esta ocasioacuten el paraacutemetro que se pasa es de tipo entero (int)

82 Comentarios de funciones

Los comentarios tienen un papel muy importante en los programas ya que aunque nose compilan ni se ejecutan permiten describir aclarar o dar informacioacuten relevantesobre queacute hace exactamente el coacutedigo Un programa bien comentado es muchomaacutes faacutecil de corregir mantener y mejorar que un programa mal comentado o quesimplemente no tiene comentariosExiste una herramienta llamada javadoc que crea unos documentos en HTML coninformacioacuten sobre programas escritos en Java Para ello javadoc utiliza los comentariosque se han hecho y ademaacutes la meta-informacioacuten que se incluye en esos comentariosEsta meta-informacioacuten es muy faacutecil de distinguir pues va precedida siempre de uncaraacutecter Te habraacutes dado cuenta que en los comentarios de los programas que hemos visto eneste manual se indica el nombre del autor mediante authorSi los comentarios de los programas en general son importantes debemos prestarespecial atencioacuten a los comentarios de las funciones ya que posiblemente seraacutenusadas por otros programadores que querraacuten saber exactamente coacutemo se utilizanCon la etiqueta param seguida de un nombre de paraacutemetro se indica queacute paraacutemetroespera como entrada la funcioacuten Si una funcioacuten acepta varios paraacutemetros se especifi-caraacuten varias etiquetas param en los comentariosMediante la etiqueta return especificamos queacute devuelve exactamente la funcioacutenAunque el tipo de dato que se devuelve ya viene indicado en la cabecera de la funcioacutenmediante la etiqueta return podemos explicarlo con maacutes detalle

Funciones 83

En los comentarios se pueden incluir elementos de HTML como ltcodegt ampnbsp etc yaque los entiende perfectamente javadocPuedes hacer una prueba generando la documentacioacuten del ejemplo ejecutando lasiguiente liacutenea en una ventana de terminal Como tenemos tildes en los comentariossi queremos que salgan bien en las paacuteginas de documentacioacuten debemos indicar lacodificacioacuten de caracteres

javadoc -encoding UTF-8 -charset UTF-8 -docencoding UTF-8 NumeroPrimoConFuncionjava

Para aprender maacutes sobre javadoc puedes consultar la documentacioacuten oficial de Oracle1

83 Creacioacuten de bibliotecas de rutinas mediante paquetes

Si la funcioacuten esPrimo() va a ser usada en tres programas diferentes se puede copiary pegar su coacutedigo en cada uno de los programas pero hay una solucioacuten mucho maacuteselegante y praacutecticaLas funciones de un determinado tipo (por ejemplo funciones matemaacuteticas) se puedenagrupar para crear un paquete (package) que luego se importaraacute desde el programa quenecesite esas funcionesCada paquete se corresponde con un directorio Por tanto si hay un paquete connombre matematicas debe haber un directorio llamado tambieacuten matematicas en la mismaubicacioacuten del programa que importa ese paquete (normalmente el programa princi-pal)Las funciones se pueden agrupar dentro de un paquete de dos maneras diferentesPuede haber subpaquetes dentro de un paquete por ejemplo si quisieacuteramos dividirlas funciones matemaacuteticas en funciones relativas al caacutelculo de aacutereas y voluacutemenesde figuras geomeacutetricas y funciones relacionadas con caacutelculos estadiacutesticos podriacuteamoscrear dos directorios dentro de matematicas con nombres geometria y estadistica respecti-vamente Estos subpaquetes se llamariacutean matematicasgeometria y matematicasestadisticaOtra manera de agrupar las funciones dentro de un mismo paquete consiste en crearvarios ficheros dentro de un mismo directorio En este caso se podriacutean crear los ficherosGeometriajava y EstadisticajavaEntenderemos mejor todos estos conceptos con un ejemplo completo Vamos a crearun paquete con nombre matematicas que contenga dos clases Varias (para funcionesmatemaacuteticas de propoacutesito general) y Geometria Por tanto en el disco duro tendremosuna carpeta con nombre matematicas que contiene los ficheros Variasjava y GeometriajavaEl contenido de estos ficheros se muestra a continuacioacuten

1httpwwworaclecomtechnetworkjavajavasedocumentationindex-137868html

Funciones 84

Funciones matemaacuteticas de propoacutesito general author Luis Joseacute Saacutenchez

package matematicas

public class Varias

Comprueba si un nuacutemero entero positivo es primo o no Un nuacutemero es primo cuando uacutenicamente es divisible entre eacutel mismo y la unidad param x un nuacutemero entero positivo return ltcodegttrueltcodegt si el nuacutemero es primo return ltcodegtfalseltcodegt en caso contrario

public static boolean esPrimo(int x)

for (int i = 2 i lt x i++)

if ((x i) == 0)

return false

return true

Devuelve el nuacutemero de diacutegitos que contiene un nuacutemero entero param x un nuacutemero entero return la cantidad de diacutegitos que contiene el nuacutemero

public static int digitos(int x)

if (x == 0)

return 1

else

int n = 0

while (x gt 0)

x = x 10

n++

Funciones 85

return n

Se incluye a continuacioacuten Geometriacuteajava Recuerda que tanto Variasjava como Geome-

triacuteajava se encuentran dentro del directorio matematicas

Funciones geomeacutetricas author Luis Joseacute Saacutenchez

package matematicas

public class Geometria

Calcula el volumen de un cilindro Tanto el radio como la altura se deben proporcionar en las mismas unidades para que el resultado sea congruente param r radio del cilindro param h altura del cilindro return volumen del cilindro

public static double volumenCilindro(double r double h)

return MathPI r r h

Calcula la longitud de una circunferencia a partir del radio param r radio de la circunferencia return longitud de la circunferencia

public static double longitudCircunferencia(double r)

return 2 MathPI r

Observa que en ambos ficheros se especifica que las clases declaradas (y por tantolas funciones que se definen dentro) pertenecen al paquete matematicas mediante la

Funciones 86

liacutenea package matematicas Ahora ya podemos probar las funciones desde un programaexterno El programa PruebaFuncionesjava estaacute fuera de la carpeta matematicas justo enun nivel superior en la estructura de directorios

Dice si un nuacutemero es o no es primo usando una funcioacuten author Luis Joseacute Saacutenchez

import matematicasVariasimport matematicasGeometria

public class PruebaFunciones

public static void main(String[] args)

int n

Prueba esPrimo()

Systemoutprint(Introduzca un nuacutemero entero positivo )

n = IntegerparseInt(Systemconsole()readLine())

if (matematicasVariasesPrimo(n))

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

Prueba digitos()

Systemoutprint(Introduzca un nuacutemero entero positivo )

n = IntegerparseInt(Systemconsole()readLine())

Systemoutprintln(n + tiene + matematicasVariasdigitos(n) + diacutegitos)

Prueba volumenCilindro()

double r h

Systemoutprintln(Caacutelculo del volumen de un cilindro)

Systemoutprint(Introduzca el radio en metros )

r = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura en metros )

Funciones 87

h = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El volumen del cilindro es + matematicasGeometriavolumenCilind

ro(r h) + m3)

Las liacuteneas

import matematicasVariasimport matematicasGeometria

cargan las clases contenidas en el paquete matematicas y por tanto todas las funcionescontenidas en ellas No vamos a utilizar el comodiacuten de la forma import matematicas yaque estaacute desaconsejado su uso en el estaacutendar de codificacioacuten en Java de GoogleEl uso de una funcioacuten es muy sencillo hay que indicar el nombre del paquete el nom-bre de la clase y finalmente el nombre de la funcioacuten con los paraacutemetros adecuados Porejemplo como vemos en el programa anterior matematicasVariasdigitos(n) devuelve elnuacutemero de diacutegitos de n siendo matematicas el paquete Varias la clase digitos la funcioacuteny n el paraacutemetro que se le pasa a la funcioacuten

84 Aacutembito de las variables

El aacutembito de una variable es el espacio donde ldquoexisterdquo esa variable o dicho de otromodo el contexto dentro del cual la variable es vaacutelidaSeguramente has utilizado muchas veces variables con nombres como x i max o aux Elaacutembito de cada una de esas variables era el programa en el que estaban declaradasFiacutejate que la x del primer programa que aparece en este libro no interfiere para nadacon la x del siguiente programa que usa una variable con ese mismo nombre Aunquese llamen igual son variables diferentesCuando se implementan funciones hay que tener muy claro que las variables utilizadascomo paraacutemetros (por valor) o las variables que se definen dentro de la funcioacuten sonlocales a esa funcioacuten es decir su aacutembito es la funcioacuten y fuera de ella esas variablesno existen Presta atencioacuten al programa Variosjava y observa que las dos funcionesque hay definidas dentro de la clase utilizan sendas variables con nombre x Puesbien cada una de esas variables son completamente independientes se trata de dosvariables distintas que tienen el mismo nombre pero que son vaacutelidas cada una en supropio aacutembito

85 Paso de paraacutemetros por valor y por referencia

En Java como en la mayoriacutea de lenguajes de programacioacuten existen dos maneras depasar paraacutemetros por valor y por referencia

Funciones 88

Cuando se pasa un paraacutemetro por valor en realidad se pasa una copia de la variableuacutenicamente importa el valor Cualquier modificacioacuten que se le haga a la variable que sepasa como paraacutemetro dentro de la funcioacuten no tendraacute ninguacuten efecto fuera de la mismaVeamos un ejemplo

Paso de paraacutemetros por valor author Luis Joseacute Saacutenchez

public class PruebaParametros1

public static void main(String[] args)

int n = 10

Systemoutprintln(n)

calcula(n)

Systemoutprintln(n)

public static void calcula(int x)

x += 24

Systemoutprintln(x)

La salida del programa anterior es la siguiente

10

34

10

A pesar de que la variable que se pasa como paraacutemetro se modifica dentro de lafuncioacuten los cambios no tienen ninguacuten efecto en el programa principalCuando se pasa un paraacutemetro por referencia por el contrario si se modifica su valordentro de la funcioacuten los cambios se mantienen una vez que la funcioacuten ha terminadode ejecutarseEn la mayoriacutea de los lenguajes de programacioacuten es el programador quien decidecuaacutendo un paraacutemetro se pasa por valor y cuaacutendo se pasa por referencia En Java nopodemos elegir Todos los paraacutemetros que son de tipo int double float char o String

se pasan siempre por valor mientras que los arrays se pasan siempre por referenciaEsto quiere decir que cualquier cambio que efectuemos en un array que se pasa comoparaacutemetro permanece cuando termina la ejecucioacuten de la funcioacuten por lo que hay quetener especial cuidado en estos casos

Funciones 89

Paso de un array como paraacutemetro author Luis Joseacute Saacutenchez

public class PruebaParametrosArray

public static void main(String[] args)

int n[] = 8 33 200 150 11

int m[] = new int[5]

muestraArray(n)

incrementa(n)

muestraArray(n)

public static void muestraArray(int x[])

for (int i = 0 i lt xlength i++)

Systemoutprint(x[i] + )

Systemoutprintln()

public static void incrementa(int x[])

for (int i = 0 i lt xlength i++)

x[i]++

La salida del programa anterior es la siguiente

8 33 200 150 11

9 34 201 151 12

Comprobamos por tanto que el array que se ha pasado como paraacutemetro se hamodificado en la funcioacuten y se han conservado los cambios en el programa principalPor uacuteltimo se muestra un programa que contiene funciones que operan con arrays dedos dimensiones

Funciones 90

Paso de un array bidimensional como paraacutemetro author Luis Joseacute Saacutenchez

import matematicasVarias

public class ArrayBiFunciones

public static void main(String[] args)

int[][] n = new int[6][9]

for(int i = 0 i lt 6 i++)

for(int j = 0 j lt 9 j++)

n[i][j] = (int)(Mathrandom()100000)

muestraArrayIntBi(n)

Funciones

Devuelve el nuacutemero de filas de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return nuacutemero de filas del array

public static int filasArrayIntBi(int x[][])

return xlength

Devuelve el nuacutemero de columnas de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return nuacutemero de columnas del array

public static int columnasArrayIntBi(int x[][])

Funciones 91

return x[0]length

Devuelve el maacuteximo de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return el valor maacuteximo encontrado en el array

public static int maximoArrayIntBi(int x[][])

int maximo = IntegerMIN_VALUE

for (int f = 0 f lt filasArrayIntBi(x) f++)

for (int c = 0 c lt columnasArrayIntBi(x) c++)

if (x[f][c] gt maximo)

maximo = x[f][c]

return maximo

Muestra por pantalla el contenido de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros

public static void muestraArrayIntBi(int x[][])

String formatoNumero = + matematicasVariasdigitos(maximoArrayIntBi(x)) + d

for (int f = 0 f lt filasArrayIntBi(x) f++)

for (int c = 0 c lt columnasArrayIntBi(x) c++)

Systemoutprintf(formatoNumero + x[f][c])

Systemoutprintln()

Funciones 92

86 Ejercicios

Ejercicios 1-14Crea una biblioteca de funciones matemaacuteticas que contenga las siguientesfunciones Recuerda que puedes usar unas dentro de otras si es necesario

1 esCapicua Devuelve verdadero si el nuacutemero que se pasa como paraacute-metro es capicuacutea y falso en caso contrario

2 esPrimo Devuelve verdadero si el nuacutemero que se pasa como paraacutemetroes primo y falso en caso contrario

3 siguientePrimo Devuelve el menor primo que es mayor al nuacutemero quese pasa como paraacutemetro

4 potencia Dada una base y un exponente devuelve la potencia5 digitos Cuenta el nuacutemero de diacutegitos de un nuacutemero entero6 voltea Le da la vuelta a un nuacutemero7 digitoN Devuelve el diacutegito que estaacute en la posicioacuten n de un nuacutemero

entero Se empieza contando por el 0 y de izquierda a derecha8 posicionDeDigito Da la posicioacuten de la primera ocurrencia de un diacutegito

dentro de un nuacutemero entero Si no se encuentra devuelve -19 quitaPorDetras Le quita a un nuacutemero n diacutegitos por detraacutes (por la

derecha)10 quitaPorDelante Le quita a un nuacutemero n diacutegitos por delante (por la

izquierda)11 pegaPorDetras Antildeade un diacutegito a un nuacutemero por detraacutes12 pegaPorDelante Antildeade un diacutegito a un nuacutemero por delante13 trozoDeNumero Toma como paraacutemetros las posiciones inicial y final

dentro de un nuacutemero y devuelve el trozo correspondiente14 juntaNumeros Pega dos nuacutemeros para formar uno

Ejercicio 15Muestra los nuacutemeros primos que hay entre 1 y 1000

Ejercicio 16Muestra los nuacutemeros capicuacutea que hay entre 1 y 99999

Ejercicio 17Escribe un programa que pase de binario a decimal

Ejercicio 18Escribe un programa que pase de decimal a binario

Funciones 93

Ejercicio 19Une y ampliacutea los dos programas anteriores de tal forma que se permitaconvertir un nuacutemero entre cualquiera de las siguientes bases decimal binariohexadecimal y octal

Ejercicios 20-28Crea una biblioteca de funciones para arrays (de una dimensioacuten) de nuacutemerosenteros que contenga las siguientes funciones

1 generaArrayInt Genera un array de tamantildeo n con nuacutemeros aleatorioscuyo intervalo (miacutenimo y maacuteximo) se indica como paraacutemetro

2 minimoArrayInt Devuelve el miacutenimo del array que se pasa comoparaacutemetro

3 maximoArrayInt Devuelve el maacuteximo del array que se pasa comoparaacutemetro

4 mediaArrayInt Devuelve la media del array que se pasa como paraacute-metro

5 estaEnArrayInt Dice si un nuacutemero estaacute o no dentro de un array6 posicionEnArray Busca un nuacutemero en un array y devuelve la posicioacuten

(el iacutendice) en la que se encuentra7 volteaArrayInt Le da la vuelta a un array8 rotaDerechaArrayInt Rota n posiciones a la derecha los nuacutemeros de

un array9 rotaIzquierdaArrayInt Rota n posiciones a la izquierda los nuacutemeros de

un array

Funciones 94

Ejercicio 29-34Crea una biblioteca de funciones para arrays bidimensionales (de dos dimen-siones) de nuacutemeros enteros que contenga las siguientes funciones

1 generaArrayBiInt Genera un array de tamantildeo n x m con nuacutemerosaleatorios cuyo intervalo (miacutenimo y maacuteximo) se indica como paraacutemetro

2 filaDeArrayBiInt Devuelve la fila i-eacutesima del array que se pasa comoparaacutemetro

3 columnaDeArrayBiInt Devuelve la columna j-eacutesima del array que sepasa como paraacutemetro

4 coordenadasEnArrayBiInt Devuelve la fila y la columna (en un arraycon dos elementos) de la primera ocurrencia de un nuacutemero dentro de unarray bidimensional Si el nuacutemero no se encuentra en el array la funcioacutendevuelve el array -1 -1

5 esPuntoDeSilla Dice si un nuacutemero es o no punto de silla es decirmiacutenimo en su fila y maacuteximo en su columna

6 diagonal Devuelve un array que contiene una de las diagonales delarray bidimensional que se pasa como paraacutemetro Se pasan comoparaacutemetros fila columna y direccioacuten La fila y la columna determinanel nuacutemero que marcaraacute las dos posibles diagonales dentro del array Ladireccioacuten es una cadena de caracteres que puede ser ldquonoserdquo o ldquonesordquo Lacadena ldquonoserdquo indica que se elige la diagonal que va del noroeste haciael sureste mientras que la cadena ldquonesordquo indica que se elige la diagonalque va del noreste hacia el suroeste

9 Programacioacuten orientada a objetos

91 Clases y objetos

La programacioacuten orientada a objetos es un paradigma de programacioacuten que se basacomo su nombre indica en la utilizacioacuten de objetos Estos objetos tambieacuten se suelenllamar instanciasUn objeto en teacuterminos de POO no se diferencia mucho de lo que conocemos comoun objeto en la vida real Pensemos por ejemplo en un coche Nuestro coche seriacuteaun objeto concreto de la vida real igual que el coche del vecino o el coche de uncompantildeero de trabajo o un deportivo que vimos por la calle el fin de semana pasadohellipTodos esos coches son objetos concretos que podemos ver y tocarTanto mi coche como el coche del vecino tienen algo en comuacuten ambos son cochesEn este caso mi coche y el coche del vecino seriacutean instancias (objetos) y coche (asecas) seriacutea una clase La palabra coche define algo geneacuterico es una abstraccioacutenno es un coche concreto sino que hace referencia a unos elementos que tienen unaserie de propiedades como matriacutecula marca modelo color etc este conjunto depropiedades se denominan atributos o variables de instancia

ClaseConcepto abstracto que denota una serie de cualidades por ejemplo cocheInstanciaObjeto palpable que se deriva de la concrecioacuten de una clase por ejemplo micocheAtributosConjunto de caracteriacutesticas que comparten los objetos de una clase porejemplo para la clase coche tendriacuteamos matriacutecula marca modelo color ynuacutemero de plazas

En Java los nombres de las clases se escriben con la primera letra en mayuacutesculamientras que los nombres de las instancias comienzan con una letra en minuacutesculaPor ejemplo la clase coche se escribe en Java como Coche y el objeto ldquomi cocherdquo sepodriacutea escribir como miCocheDefiniremos cada clase en un fichero con el mismo nombre maacutes la extensioacuten java portanto la definicioacuten de la clase Coche debe estar contenida en un fichero con nombreCochejava

Vamos a definir a continuacioacuten la clase Libro con los atributos isbn autor titulo ynumeroPaginas

95

Programacioacuten orientada a objetos 96

Librojava Definicioacuten de la clase Libro author Luis Joseacute Saacutenchez

public class Libro

atributosString isbn

String titulo

String autor

int numeroPaginas

A continuacioacuten creamos varios objetos de esta clase

PruebaLibrojava Programa que prueba la clase Libro author Luis Joseacute Saacutenchez

public class PruebaLibro

public static void main(String[] args)

Libro lib = new Libro()

Libro miLibrito = new Libro()

Libro quijote = new Libro()

Hemos creado tres instancias de la clase libro lib miLibrito y quijote Ya sabemos definiruna clase indicando sus atributos y crear instancias

Las variables de instancia (atributos) determinan las cualidades de losobjetos

92 Encapsulamiento y ocultacioacuten

Uno de los pilares en los que se basa la Programacioacuten Orientada a Objetos es elencapsulamiento Baacutesicamente el encapsulamiento consiste en definir todas las

Programacioacuten orientada a objetos 97

propiedades y el comportamiento de una clase dentro de esa clase es decir en laclase Coche estaraacute definido todo lo concerniente a la clase Coche y en la clase Libro

estaraacute definido todo lo que tenga que ver con la clase LibroEl encapsulamiento parece algo obvio casi de perogrullo pero hay que tenerlosiempre muy presente al programar utilizando clases y objetos En alguna ocasioacutenpuede que estemos tentados a mezclar parte de una clase con otra clase distintapara resolver un problema puntual No hay que caer en esa trampa Se deben escribirlos programas de forma que cada cosa esteacute en su sitio Sobre todo al principiocuando definimos nuestras primeras clases debemos estar pendientes de que todoestaacute definido donde correspondeLa ocultacioacuten es una teacutecnica que incorporan algunos lenguajes (entre ellos Java) quepermite esconder los elementos que definen una clase de tal forma que desde otraclase distinta no se pueden ldquover las tripasrdquo de la primera La ocultacioacuten facilita comoveremos maacutes adelante el encapsulamiento

93 Meacutetodos

Un coche arranca para se aparca hace sonar el claxon se puede llevar a repararhellipUn gato puede comer dormir maullar ronronearhellipLas acciones asociadas a una clase se llaman meacutetodos Estos meacutetodos se definendentro del cuerpo de la clase y se suelen colocar a continuacioacuten de los atributos

Los meacutetodos determinan el comportamiento de los objetos

931 Creiacute haber visto un lindo gatito

Vamos a crear la clase GatoSimple La llamamos asiacute porque maacutes adelante crearemos otraclase algo maacutes elaborada que se llamaraacute Gato Para saber queacute atributos debe tener estaclase hay que preguntarse queacute caracteriacutesticas tienen los gatos Todos los gatos son deun color determinado pertenecen a una raza tienen una edad tienen un determinadosexo - son machos o hembras - y tienen un peso que se puede expresar en kilogramosEacutestos seraacuten por tanto los atributos que tendraacute la clase GatoSimplePara saber queacute metodos debemos implementar hay que preguntarse queacute accionesestaacuten asociadas a los gatos Bien pues los gatos maullan ronronean comen y si sonmachos se pelean entre ellos para disputarse el favor de las hembras Esos seraacuten losmeacutetodos que definamos en la clase

Programacioacuten orientada a objetos 98

GatoSimplejava Definicioacuten de la clase GatoSimple author Luis Joseacute Saacutenchez

public class GatoSimple

atributos

String color raza sexo

int edad

double peso

meacutetodos

constructorGatoSimple (String s)

thissexo = s

getterString getSexo()

return thissexo

Hace que el gato maulle

void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute

Programacioacuten orientada a objetos 99

param comida la comida que se le ofrece al gato

void come(String comida)

if (comidaequals(pescado))

Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Pone a pelear dos gatos Solo se van a pelear dos machos entre siacute param contrincante es el gato contra el que pelear

void peleaCon(GatoSimple contrincante)

if (thissexoequals(hembra))

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo()equals(hembra))

Systemoutprintln(no peleo contra gatitas)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

ConstructorEl meacutetodo constructor tiene siempre el mismo nombre que la clase y se utilizanormalmente para inicializar los atributos

Los atributos de la clase GatoSimple - color raza sexo edad y peso - se declaran igual quelas variables que hemos venido usando hasta ahora pero hay una gran diferenciaentre estos atributos y las variables que aparecen en el main (programa principal) Unavariable definida en el cuerpo del programa principal es uacutenica sin embargo cada unode los objetos que se crean en el programa principal tienen sus propios atributos esdecir si en el programa principal se crean 20 objetos de la clase GatoSimple cada unotiene sus valores para los atributos color raza etcFiacutejate en la cabecera del meacutetodo peleaCon

Programacioacuten orientada a objetos 100

void peleaCon(GatoSimple contrincante)

Como puedes comprobar es posible pasar un objeto como paraacutemetro A continuacioacutense muestra un programa que prueba la clase GatoSimple Te recomiendo seguir elprograma liacutenea a liacutenea y observar atentamente la salida que produce

PruebaGatoSimplejava Programa que prueba la clase GatoSimple author Luis Joseacute Saacutenchez

public class PruebaGatoSimple

public static void main(String[] args)

GatoSimple garfield = new GatoSimple(macho)

Systemoutprintln(hola gatito)

garfieldmaulla()

Systemoutprintln(toma tarta)

garfieldcome(tarta selva negra)

Systemoutprintln(toma pescado a ver si esto te gusta)

garfieldcome(pescado)

GatoSimple tom = new GatoSimple(macho)

Systemoutprintln(Tom toma sopita de verduras)

tomcome(sopa de verduras)

GatoSimple lisa = new GatoSimple(hembra)

Systemoutprintln(gatitos a ver coacutemo maullaacuteis)

garfieldmaulla()

tommaulla()

lisamaulla()

garfieldpeleaCon(lisa)

lisapeleaCon(tom)

tompeleaCon(garfield)

Observa coacutemo al crear una instancia se llama al constructor que como deciacuteamos antestiene el mismo nombre de la clase y sirve para inicializar los atributos En este casose inicializa el atributo sexo Maacutes adelante veremos constructores que inicializan variosatributos e incluso definiremos distintos constructores en la misma clase

Programacioacuten orientada a objetos 101

GatoSimple garfield = new GatoSimple(macho)

Como puedes ver hay meacutetodos que no toman ninguacuten paraacutemetro

garfieldmaulla()

Y hay otros meacutetodos que deben tomar paraacutemetros obligatoriamente

garfieldcome(tarta selva negra)

932 Meacutetodos getter y setter

Vamos a crear la clase Cubo Para saber queacute atributos se deben definir nos preguntamosqueacute caracteriacutesticas tienen los cubos - igual que hicimos con la clase GatoSimple Todos loscubos tienen una determinada capacidad un color estaacuten hechos de un determinadomaterial - plaacutestico latoacuten etc - y puede que tengan asa o puede que no Un cubo sefabrica con el propoacutesito de contener liacutequido por tanto otra caracteriacutestica es la cantidadde litros de liacutequido que contiene en un momento determinado Por ahora solo nosinteresa saber la capacidad maacutexima y los litros que contiene el cubo en cada momentoasiacute que esos seraacuten los atributos que tendremos en cuenta

Cubojava Definicioacuten de la clase Cubo author Luis Joseacute Saacutenchez

public class Cubo

atributos

int capacidad capacidad maacutexima en litrosint contenido contenido actual en litros

meacutetodos

constructorCubo (int c)

thiscapacidad = c

meacutetodos getterint getCapacidad()

return thiscapacidad

Programacioacuten orientada a objetos 102

int getContenido()

return thiscontenido

meacutetodo settervoid setContenido(int litros)

thiscontenido = litros

otros meacutetodosvoid vacia()

thiscontenido = 0

Llena el cubo al maacuteximo de su capacidad

void llena()

thiscontenido = thiscapacidad

Pinta el cubo en la pantalla Se muestran los bordes del cubo con el caraacutecter y el agua que contiene con el caraacutecter ~

void pinta()

for (int nivel = thiscapacidad nivel gt 0 nivel--)

if (thiscontenido gt= nivel)

Systemoutprintln(~~~~)

else

Systemoutprintln( )

Systemoutprintln()

Vuelca el contenido de un cubo sobre otro Antes de echar el agua se comprueba cuaacutento le cabe al cubo destino

void vuelcaEn(Cubo destino)

Programacioacuten orientada a objetos 103

int libres = destinogetCapacidad() - destinogetContenido()

if (libres gt 0)

if (thiscontenido lt= libres)

destinosetContenido(destinogetContenido() + thiscontenido)thisvacia()

else

thiscontenido -= libres

destinollena()

Observa estos meacutetodos extraiacutedos de la clase Cubo

int getCapacidad()

return thiscapacidad

int getContenido()

return thiscontenido

Se trata de meacutetodos muy simples su cometido es devolver el valor de un atributoPodriacutean tener cualquier nombre pero en Java es costumbre llamarlos con la palabraget (obtener) seguida del nombre del atributoFijeacutemonos ahora este otro meacutetodo

void setContenido(int litros)

thiscontenido = litros

Ahora estamos ante un setter Este tipo de meacutetodos tiene el cometido de establecerun valor para un determinado atributo Como puedes ver setContenido estaacute formadapor set (asignar) maacutes el nombre del atributoPodriacuteas preguntarte iquestpor queacute se crea un meacutetodo getter para extraer el valor de unavariable y no se accede a la variable directamenteParece maacutes loacutegico hacer esto

Systemoutprint(miCubocapacidad)

que esto otro

Programacioacuten orientada a objetos 104

Systemoutprint(miCubogetCapacidad())

Sin embargo en Java se opta casi siempre por esta uacuteltima opcioacuten Tiene su explicacioacuteny lo entenderaacutes bien cuando estudies el apartado Aacutembitovisibilidad de los elementosde una clase - public protected y privateProbamos con el siguiente ejemplo la clase Cubo que acabamos de definir Crea tuspropios cubos pasa agua de unos a otros y observa lo que se muestra por pantalla

PruebaCubojava Programa que prueba la clase Cubo author Luis Joseacute Saacutenchez

public class PruebaCubo

public static void main(String[] args)

Cubo cubito = new Cubo(2)

Cubo cubote = new Cubo(7)

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

Systemoutprintln(nLleno el cubito n)

cubitollena()

cubitopinta()

Systemoutprintln(nEl cubote sigue vaciacuteo n)

cubotepinta()

Systemoutprintln(nAhora vuelco lo que tiene el cubito en el cuboten)

cubitovuelcaEn(cubote)

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

Systemoutprintln(nAhora vuelco lo que tiene el cubote en el cubiton)

cubotevuelcaEn(cubito)

Programacioacuten orientada a objetos 105

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

933 Meacutetodo toString

La definicioacuten de la clase Cubo del apartado anterior contiene el meacutetodo pinta que comosu nombre indica permite pintar en pantalla un objeto de esa clase Se podriacutea definirel meacutetodo ficha para mostrar informacioacuten sobre objetos de la clase Alumno por ejemploTambieacuten seriacutea posible implementar el meacutetodo imprime dentro de la clase Libro con elpropoacutesito de mostrar por pantalla los datos de un libro Todos estos meacutetodos - pintaficha e imprime - hacen baacutesicamente lo mismoEn Java existe una solucioacuten muy elegante para mostrar informacioacuten sobre un objetopor pantalla Si se quiere mostrar el contenido de la variable entera x se utilizaSystemoutprint(x) y si se quiere mostrar el valor de la variable de tipo cadena decaracteres nombre se escribe Systemoutprint(nombre) De la misma manera si se quieremostrar el objeto miPiramide que pertenece a la clase Piramide tambieacuten se podriacutea usarSystemoutprint(miPiramide) Java sabe perfectamente coacutemo mostrar nuacutemeros y cadenasde caracteres pero no sabe a priori coacutemo se pintan piraacutemides Para indicar a Java coacutemodebe pintar un objeto de la clase Piramide basta con implementar el meacutetodo toString

dentro de la claseVeamos un ejemplo muy sencillo de implementacioacuten de toString Definiremos la claseCuadrado con el atributo lado el constructor y el meacutetodo toString

Cuadradojava Definicioacuten de la clase Cuadrado author Luis Joseacute Saacutenchez

public class Cuadrado

int lado

public Cuadrado(int l)

thislado = l

public String toString()

Programacioacuten orientada a objetos 106

int i espacios

String resultado =

for (i = 0 i lt thislado i++)

resultado +=

resultado += n

for (i = 1 i lt thislado - 1 i++)

resultado +=

for (espacios = 1 espacios lt thislado - 1 espacios++)

resultado +=

resultado += n

for (i = 0 i lt thislado i++)

resultado +=

resultado += n

return resultado

Observa que el meacutetodo toString() devuelve una cadena de caracteres Esa cadena esprecisamente la que mostraraacute por pantalla Systemoutprint() En el programa que semuestra a continuacioacuten y que prueba la clase Cuadrado puedes comprobar que se pintaun cuadrado igual que si se tratara de cualquier otra variable

PruebaCuadradojava Programa que prueba la clase Cuadrado author Luis Joseacute Saacutenchez

public class PruebaCuadrado

public static void main(String[] args)

Cuadrado miCuadradito = new Cuadrado(5)

Systemoutprintln(miCuadradito)

Programacioacuten orientada a objetos 107

94 Aacutembitovisibilidad de los elementos de una clase - publicprotected y private

Al definir los elementos de una clase se pueden especificar sus aacutembitos (scope) devisibilidad o accesibilidad Un elemento public (puacuteblico) es visible desde cualquierclase un elemento protected (protegido) es visible desde la clase actual y desde todassus subclases y finalmente un elemento private (privado) uacutenicamente es visible dentrode la clase actualEn el siguiente apartado veremos queacute son las subclases De momento fiacutejate en elaacutembito del atributo y de los meacutetodos en la definicioacuten de la clase Animal

Animaljava Definicioacuten de la clase Animal author Luis Joseacute Saacutenchez

public abstract class Animal

private Sexo sexo

public Animal ()

sexo = SexoMACHO

public Animal (Sexo s)

sexo = s

public Sexo getSexo()

return sexo

public String toString()

return Sexo + thissexo + n

Hace que el animal se eche a dormir

public void duerme()

Systemoutprintln(Zzzzzzz)

Programacioacuten orientada a objetos 108

Fiacutejate que el atributo sexo se ha definido como private

private Sexo sexo

Eso quiere decir que a ese atributo uacutenicamente se tiene acceso dentro de la claseAnimal Sin embargo todos los meacutetodos se han definido public lo que significa quese podraacuten utilizar desde cualquier otro programa por ejemplo como veremos maacutesadelante desde el programa PurebaAnimaljava

Salvo casos puntuales se seguiraacute la regla de declarar private las variables deinstancia y public los meacutetodos

El sexo de un animal solo puede ser macho hembra o hermafrodita Una forma dedelimitar los valores que puede tomar un atributo es definir un tipo enumerado

Tipo enumeradoMediante enum se puede definir un tipo enumerado de esta forma un atributosolo podraacute tener uno de los posibles valores que se dan como opcioacuten Losvalores que se especifican en el tipo enumerado se suelen escribir con todaslas letras en mayuacutescula

Sexojava Definicioacuten del tipo enumerado Sexo author Luis Joseacute Saacutenchez

public enum Sexo

MACHO HEMBRA HERMAFRODITA

95 Herencia

La herencia es una de las caracteriacutesticas maacutes importantes de la POO Si definimosuna serie de atributos y meacutetodos para una clase al crear una subclase todos estosatributos y meacutetodos siguen siendo vaacutelidosEn el apartado anterior se define la clase Animal Uno de los meacutetodos de esta clase esduerme A continuacioacuten podemos crear las clases Gato y Perro como subclases de AnimalDe forma automaacutetica se puede utilizar el meacutetodo duerme con las instancias de las clasesGato y Perro iquestno es fantaacutestico

Programacioacuten orientada a objetos 109

La clase Ave es subclase de Animal y la clase Pinguino a su vez seriacutea subclase de Ave ypor tanto hereda todos sus atributos y meacutetodos

Clase abstracta (abstract)Una clase abstracta es aquella que no va a tener instancias de forma directaaunque siacute habraacute instancias de las subclases (siempre que esas subclasesno sean tambieacuten abstractas) Por ejemplo si se define la clase Animal comoabstracta no se podraacuten crear objetos de la clase Animal es decir no se podraacutehacer Animal mascota = new Animal() pero siacute se podraacuten crear instancias de la claseGato Ave o Pinguino que son subclases de Animal

Para crear en Java una subclase de otra clase existente se utiliza la palabra reservadaextends A continuacioacuten se muestra el coacutedigo de las clases Gato Ave y Pinguino asiacutecomo el programa que prueba estas clases creando instancias y aplicaacutendoles meacutetodosRecuerda que la definicioacuten de la clase Animal se muestra en el apartado anterior

Gatojava Definicioacuten de la clase Gato author Luis Joseacute Saacutenchez

public class Gato extends Animal

private String raza

public Gato (Sexo s String r)

super(s)raza = r

public Gato (Sexo s)

super(s)raza = siameacutes

public Gato (String r)

super(SexoHEMBRA)raza = r

public Gato ()

super(SexoHEMBRA)

Programacioacuten orientada a objetos 110

raza = siameacutes

public String toString()

return supertoString()+ Raza + thisraza+ nn

Hace que el gato maulle

public void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

public void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al gato

public void come(String comida)

if (comidaequals(pescado))

Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Pone a pelear dos gatos Solo se van a pelear dos machos entre siacute param contrincante es el gato contra el que pelear

public void peleaCon(Gato contrincante)

Programacioacuten orientada a objetos 111

if (thisgetSexo() == SexoHEMBRA)

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo() == SexoHEMBRA)

Systemoutprintln(no peleo contra gatitas)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

Observa que se definen nada menos que cuatro constructores en la clase Gato Desdeel programa principal se dilucida cuaacutel de ellos se utiliza en funcioacuten del nuacutemero y tipode paraacutemetros que se pasa al meacutetodo Por ejemplo si desde el programa principal secrea un gato de esta forma

Gato gati = new Gato()

entonces se llamariacutea al constructor definido como

public Gato ()

super(SexoHEMBRA)raza = siameacutes

Por tanto gati seriacutea una gata de raza siameacutes Si por el contrario creamos gati de estaotra manera desde el programa principal

Gato gati = new Gato(SexoMACHO siberiano)

se llamariacutea al siguiente constructor

public Gato (Sexo s String r)

super(s)raza = r

y gati seriacutea en este caso un gato macho de raza siberianoEl meacutetodo super() hace una llamada al meacutetodo equivalente de la superclase Fiacutejate quese utiliza tanto en el constructor como en el meacutetodo toString() Por ejemplo al llamara super() dentro del meacutetodo toString() se estaacute llamando al toString() que hay definidoen la clase Animal justo un nivel por encima de Gato en la jerarquiacutea de clasesA continuacioacuten tenemos la definicioacuten de la clase Ave que es una subclase de Animal

Programacioacuten orientada a objetos 112

Avejava Definicioacuten de la clase Ave author Luis Joseacute Saacutenchez

public class Ave extends Animal

public Ave(Sexo s)

super(s)

public Ave()

super()

Hace que el ave se limpie

public void aseate()

Systemoutprintln(Me estoy limpiando las plumas)

Hace que el ave levante el vuelo

public void vuela()

Systemoutprintln(Estoy volando)

951 Sobrecarga de meacutetodos

Un meacutetodo se puede redefinir (volver a definir con el mismo nombre) en una subclasePor ejemplo el meacutetodo vuela que estaacute definido en la clase Ave se vuelve a definir enla clase Pinguino En estos casos indicaremos nuestra intencioacuten de sobreescribir unmeacutetodo mediante la etiqueta OverrideSi no escribimos esta etiqueta la sobreescritura del meacutetodo se realizaraacute de todasformas ya que Override indica simplemente una intencioacuten Ahora imagina que quieressobreescribir el meacutetodo come de Animal declarando un come especiacutefico para los gatos enla clase Gato Si escribes Override y luego te equivocas en el nombre del meacutetodo yescribes comer entonces el compilador diriacutea algo como ldquoiexclCuidado algo no estaacute bienme has dicho que ibas a sobreescribir un meacutetodo de la superclase y sin embargo comer

no estaacute definidordquoA continuacioacuten tienes la definicioacuten de la clase Pinguino

Programacioacuten orientada a objetos 113

Pinguinojava Definicioacuten de la clase Pinguino author Luis Joseacute Saacutenchez

public class Pinguino extends Ave

public Pinguino()

super()

public Pinguino(Sexo s)

super(s)

El pinguumlino se siente triste porque no puede volar

Override

public void vuela()

Systemoutprintln(No puedo volar)

Con el siguiente programa se prueba la clase Animal y todas las subclases que derivande ella Observa cada liacutenea y comprueba queacute hace el programa

PruebaAnimaljava Programa que prueba la clase Animal y sus subclases author Luis Joseacute Saacutenchez

public class PruebaAnimal

public static void main(String[] args)

Gato garfield = new Gato(SexoMACHO romano)

Gato tom = new Gato(SexoMACHO)

Gato lisa = new Gato(SexoHEMBRA)

Gato silvestre = new Gato()

Systemoutprintln(garfield)

Systemoutprintln(tom)

Systemoutprintln(lisa)

Programacioacuten orientada a objetos 114

Systemoutprintln(silvestre)

Ave miLoro = new Ave()

miLoroaseate()

miLorovuela()

Pinguino pingu = new Pinguino(SexoHEMBRA)

pinguaseate()

pinguvuela()

En el ejemplo anterior los objetos miLoro y pingu actuacutean de manera polimoacuterfica porquea ambos se les aplican los meacutetodos aseate y vuela

PolimorfismoEn Programacioacuten Orientada a Objetos se llama polimorfismo a la capacidadque tienen los objetos de distinto tipo (de distintas clases) de responder almismo meacutetodo

96 Atributos y meacutetodos de clase (static)

Hasta el momento hemos definido atributos de instancia como raza sexo o color ymeacutetodos de instancia como maulla come o vuela De tal modo que si en el programa secrean 20 gatos cada uno de ellos tiene su propia raza y puede haber potencialmente20 razas diferentes Tambieacuten podriacutea aplicar el meacutetodo maulla a todos y cada uno deesos 20 gatosNo obstante en determinadas ocasiones nos puede interesar tener atributos de clase(variables de clase) y meacutetodos de clase Cuando se define una variable de clase soloexiste una copia del atributo para toda la clase y no una para cada objeto Esto es uacutetilcuando se quiere llevar la cuenta global de alguacuten paraacutemetro Los meacutetodos de clase seaplican a la clase y no a instancias concretasA continuacioacuten se muestra un ejemplo que contiene la variable de clase kilometra-

jeTotal Si bien cada coche tiene un atributo kilometraje donde se van acumulando loskiloacutemetros que va recorriendo en la variable de clase kilometrajeTotal se lleva la cuentade los kiloacutemetros que han recorrido todos los coches que se han creadoTambieacuten se crea un meacutetodo de clase llamado getKilometrajeTotal que simplemente esun getter para la variable de clase kilometrajeTotal

Programacioacuten orientada a objetos 115

Cochejava Definicioacuten de la clase Coche author Luis Joseacute Saacutenchez

public class Coche

atributo de claseprivate static int kilometrajeTotal = 0

meacutetodo de clasepublic static int getKilometrajeTotal()

return kilometrajeTotal

private String marca

private String modelo

private int kilometraje

public Coche(String ma String mo)

marca = ma

modelo = mo

kilometraje = 0

public int getKilometraje()

return kilometraje

Recorre una determinada distancia param km distancia a recorrer en kiloacutemetros

public void recorre(int km)

kilometraje += km

kilometrajeTotal += km

Como ya hemos comentado el atributo kilometrajeTotal almacena el nuacutemero total dekiloacutemetros que recorren todos los objetos de la clase Coche es un uacutenico valor por esose declara como static Por el contrario el atributo kilometraje almacena los kiloacutemetrosrecorridos por un objeto concreto y tendraacute un valor distinto para cada uno de ellos

Programacioacuten orientada a objetos 116

Si en el programa principal se crean 20 objetos de la clase Coche cada uno tendraacute supropio kilometrajeA continuacioacuten se muestra el programa que prueba la clase Coche

PruebaCochejava Programa que prueba la clase Coche author Luis Joseacute Saacutenchez

public class PruebaCoche

public static void main(String[] args)

Coche cocheDeLuis = new Coche(Saab 93)

Coche cocheDeJuan = new Coche(Toyota Avensis)

cocheDeLuisrecorre(30)

cocheDeLuisrecorre(40)

cocheDeLuisrecorre(220)

cocheDeJuanrecorre(60)

cocheDeJuanrecorre(150)

cocheDeJuanrecorre(90)

Systemoutprintln(El coche de Luis ha recorrido + cocheDeLuisgetKilometraje() +

Km)

Systemoutprintln(El coche de Juan ha recorrido + cocheDeJuangetKilometraje() +

Km)

Systemoutprintln(El kilometraje total ha sido de + CochegetKilometrajeTotal() +

Km)

El meacutetodo getKilometrajeTotal() se aplica a la clase Coche por tratarse de un meacutetodo declase (meacutetodo static) Este meacutetodo no se podriacutea aplicar a una instancia de la mismamanera que un meacutetodo que no sea static no se puede aplicar a la clase sino a losobjetos

97 Interfaces

Una interfaz contiene uacutenicamente la cabecera de una serie de meacutetodos (opcional-mente tambieacuten puede contener constantes) Por tanto se encarga de especificar uncomportamiento que luego tendraacute que ser implementado La interfaz no especificael ldquocoacutemordquo ya que no contiene el cuerpo de los meacutetodos solo el ldquoqueacuterdquoUna interfaz puede ser uacutetil en determinadas circunstancias En principio separala definicioacuten de la implementacioacuten o como deciacuteamos antes el ldquoqueacuterdquo del ldquocoacutemordquo

Programacioacuten orientada a objetos 117

Tendremos entonces la menos dos ficheros la interfaz y la clase que implementaesa interfaz Se puede dar el caso que un programador escriba la interfaz y luegose la pase a otro programador para que sea eacuteste uacuteltimo quien la implementeHay que destacar que cada interfaz puede tener varias implementaciones asociadasPara ilustrar el uso de interfaces utilizaremos algunas clases ya conocidas La super-clase que va a estar por encima de todas las demaacutes seraacute la clase Animal vista conanterioridad El coacutedigo de esta clase no variacutea por lo tanto no lo vamos a reproduciraquiacute de nuevoDefinimos la interfaz Mascota

Mascotajava Definicioacuten de la interfaz Mascota author Luis Joseacute Saacutenchez

public interface Mascota

String getCodigo()

void hazRuido()

void come(String comida)

void peleaCon(Animal contrincante)

Como puedes ver uacutenicamente se escriben las cabeceras de los meacutetodos que debetener las clases que implementen la interfaz MascotaUna de las implementaciones de Mascota seraacute Gato

Gatojava Definicioacuten de la clase Gato author Luis Joseacute Saacutenchez

public class Gato extends Animal implements Mascota

private String codigo

public Gato (Sexo s String c)

super(s)thiscodigo = c

Override

Programacioacuten orientada a objetos 118

public String getCodigo()

return thiscodigo

Hace que el gato emita sonidos

Override

public void hazRuido()

thismaulla()thisronronea()

Hace que el gato maulle

public void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

public void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al gato

Override

public void come(String comida)

if (comidaequals(pescado))

supercome()Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Programacioacuten orientada a objetos 119

Pone a pelear al gato contra otro animal Solo se van a pelear dos machos entre siacute param contrincante es el animal contra el que pelear

Override

public void peleaCon(Animal contrincante)

if (thisgetSexo() == SexoHEMBRA)

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo() == SexoHEMBRA)

Systemoutprintln(no peleo contra hembras)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

Mediante la siguiente liacutenea

public class Gato extends Animal implements Mascota

estamos diciendo que Gato es una subclase de Animal y que ademaacutes es una im-plementacioacuten de la interfaz Mascota Fiacutejate que no es lo mismo la herencia que laimplementacioacutenObserva que los meacutetodos que se indicaban en Mascota uacutenicamente con la cabeceraahora estaacuten implementados completamente en Gato Ademaacutes Gato contiene otrosmeacutetodos que no se indicaban en Mascota como maulla y ronroneaLos meacutetodos de Gato que implementan meacutetodos especificados en Mascota deben tenerla anotacioacuten OverrideComo dijimos anteriormente una interfaz puede tener varias implementaciones Acontinuacioacuten se muestra Perro otra implementacioacuten de Mascota

Programacioacuten orientada a objetos 120

Perrojava Definicioacuten de la clase Perro author Luis Joseacute Saacutenchez

public class Perro extends Animal implements Mascota

private String codigo

public Perro (Sexo s String c)

super(s)thiscodigo = c

Override

public String getCodigo()

return thiscodigo

Hace que el Perro emita sonidos

Override

public void hazRuido()

thisladra()

Hace que el Perro ladre

public void ladra()

Systemoutprintln(Guau guau)

Hace que el Perro coma A los Perros les gusta la carne si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al Perro

Override

public void come(String comida)

if (comidaequals(carne))

Programacioacuten orientada a objetos 121

supercome()Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como carne)

Pone a pelear el perro contra otro animal Solo se van a pelear si los dos son perros param contrincante es el animal contra el que pelear

Override

public void peleaCon(Animal contrincante)

if (contrincantegetClass()getSimpleName()equals(Perro))

Systemoutprintln(ven aquiacute que te vas a enterar)

else

Systemoutprintln(no me gusta pelear)

Por uacuteltimo mostramos el programa que prueba Mascota y sus implementaciones Gato yPerro

PruebaMascotajava Programa que prueba la interfaz Mascota author Luis Joseacute Saacutenchez

public class PruebaMascota

public static void main(String[] args)

Mascota garfield = new Gato(SexoMACHO 34569)

Mascota lisa = new Gato(SexoHEMBRA 96059)

Mascota kuki = new Perro(SexoHEMBRA 234678)

Mascota ayo = new Perro(SexoMACHO 778950)

Systemoutprintln(garfieldgetCodigo())

Systemoutprintln(lisagetCodigo())

Systemoutprintln(kukigetCodigo())

Systemoutprintln(ayogetCodigo())

garfieldcome(pescado)

Programacioacuten orientada a objetos 122

lisacome(hamburguesa)

kukicome(pescado)

lisapeleaCon((Gato)garfield)

ayopeleaCon((Perro)kuki)

Observa que para crear una mascota que es un gato escribimos lo siguiente

Mascota garfield = new Gato(SexoMACHO 34569)

Una interfaz no se puede instanciar por tanto la siguiente liacutenea seriacutea incorrecta

Mascota garfield = new Mascota(SexoMACHO 34569)

InterfacesLa interfaz indica ldquoqueacuterdquo hay que hacer y la implementacioacuten especifica ldquocoacutemordquose haceUna interfaz puede tener varias implementacionesUna interfaz no se puede instanciarLa implementacioacuten puede contener meacutetodos adicionales cuyas cabeceras noestaacuten en su interfaz

98 Arrays de objetos

Del mismo modo que se pueden crear arrays de nuacutemeros enteros decimales o cadenasde caracteres tambieacuten es posible crear arrays de objetosVamos a definir la clase Alumnopara luego crear un array de objetos de esta clase

Alumnojava Definicioacuten de la clase Alumno author Luis Joseacute Saacutenchez

public class Alumno

private String nombre

private double notaMedia = 00

public String getNombre()

Programacioacuten orientada a objetos 123

return nombre

public void setNombre(String nombre)

thisnombre = nombre

public double getNotaMedia()

return notaMedia

public void setNotaMedia(double notaMedia)

thisnotaMedia = notaMedia

A continuacioacuten se define un array de cinco alumnos que posteriormente se rellena Poruacuteltimo se muestran los datos de los alumnos por pantallaObserva que la siguiente liacutenea uacutenicamente define la estructura del array pero no crealos objetos

Alumno[] alum = new Alumno[5]

Cada objeto concreto se crea de forma individual mediante

alum[i] = new Alumno()

Aquiacute tienes el ejemplo completo

ArrayDeAlumnosPrincipaljava Programa que prueba un array de la clase Alumno author Luis Joseacute Saacutenchez

public class ArrayDeAlumnosPrincipal

public static void main(String[] args)

Define la estructura un array de 5 alumnos pero no crea los objetosAlumno[] alum = new Alumno[5]

Pide los datos de los alumnos

Programacioacuten orientada a objetos 124

Systemoutprintln(A continuacion debera introducir el nombre y la nota media de 5 al

umnos)

String nombreIntroducido

double notaIntroducida

for(int i = 0 i lt 5 i++)

alum[i] = new Alumno()

Systemoutprintln(Alumno + i)

Systemoutprint(Nombre )

nombreIntroducido = Systemconsole()readLine()

(alum[i])setNombre(nombreIntroducido)

Systemoutprint(Nota media )

notaIntroducida = DoubleparseDouble(Systemconsole()readLine())

alum[i]setNotaMedia(notaIntroducida)

for i

Muestra los datos de los alumnos

Systemoutprintln(Los datos introducidos son los siguientes)

double sumaDeMedias = 0

for(int i = 0 i lt 5 i++)

Systemoutprintln(Alumno + i)

Systemoutprintln(Nombre + alum[i]getNombre())

Systemoutprintln(Nota media + alum[i]getNotaMedia())

Systemoutprintln(----------------------------)

sumaDeMedias += alum[i]getNotaMedia()

for i

Systemoutprintln(La media global de la clase es + sumaDeMedias 5)

Veamos ahora un ejemplo algo maacutes complejo Se trata de una gestioacuten tiacutepica - altabaja listado y modificacioacuten - de una coleccioacuten de discos Este tipo de programas sesuele denominar CRUD (Create Read Update Delete)Primero se define la clase Disco

Programacioacuten orientada a objetos 125

Discojava Definicioacuten de la clase Disco author Luis Joseacute Saacutenchez

public class Disco

private String codigo = LIBRE

private String autor

private String titulo

private String genero

private int duracion duracioacuten total en minutos

public String getCodigo()

return codigo

public void setCodigo(String codigo)

thiscodigo = codigo

public String getAutor()

return autor

public void setAutor(String autor)

thisautor = autor

public String getGenero()

return genero

public void setGenero(String genero)

thisgenero = genero

public String getTitulo()

return titulo

public void setTitulo(String titulo)

thistitulo = titulo

Programacioacuten orientada a objetos 126

public int getDuracion()

return duracion

public void setDuracion(int duracion)

thisduracion = duracion

public String toString()

String cadena = n------------------------------------------

cadena += nCoacutedigo + thiscodigocadena += nAutor + thisautorcadena += nTiacutetulo + thistitulocadena += nGeacutenero + thisgenerocadena += nDuracioacuten + thisduracioncadena += n------------------------------------------

return cadena

A continuacioacuten se crea el programa principal Cada elemento de la coleccioacuten seraacuteun objeto de la clase Disco Se trata como veraacutes de una gestioacuten muy simple perototalmente funcionalNo se incluye en el manual porque ocupariacutea varias paacuteginas El coacutedigo del programa sepuede descargar desde el siguiente enlace httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos09_POOColeccionDeDiscosColeccionDeDiscosPrincipaljava

Programacioacuten orientada a objetos 127

99 Ejercicios

991 Conceptos de POO

Ejercicio 1iquestCuaacuteles seriacutean los atributos de la clase PilotoDeFormula1 iquestSe te ocurren algunasinstancias de esta clase

Ejercicio 2A continuacioacuten tienes una lista en la que estaacuten mezcladas varias clases coninstancias de esas clases Para ponerlo un poco maacutes difiacutecil todos los elementosestaacuten escritos en minuacutescula Di cuaacuteles son las clases cuaacuteles las instanciasa queacute clase pertenece cada una de estas instancias y cuaacutel es la jerarquiacuteaentre las clases paula goofy gardfiel perro mineral caballo tom silvestrepirita rocinante milu snoopy gato pluto animal javier bucefalo pegasoayudante_de_santa_claus cuarzo laika persona pato_lucas

Ejercicio 3iquestCuaacuteles seriacutean los atributos de la clase Vivienda iquestQueacute subclases se te ocurren

Ejercicio 4Piensa en la liga de baloncesto iquestqueacute 5 clases se te ocurren para representar5 elementos distintos que intervengan en la liga

Ejercicio 5Haz una lista con los atributos que podriacutea tener la clase caballo A continuacioacutenhaz una lista con los posibles meacutetodos (acciones asociadas a los caballos)

Ejercicio 6Lista los atributos de la clase Alumno iquestSeriacutea nombre uno de los atributos de laclase Razona tu respuesta

Ejercicio 7iquestCuaacuteles seriacutean los atributos de la clase Ventana (de ordenador) iquestcuaacuteles seriacuteanlos meacutetodos Piensa en las propiedades y en el comportamiento de unaventana de cualquier programa

Programacioacuten orientada a objetos 128

992 POO en Java

Ejercicio 1Implementa la clase Caballo vista en un ejercicio anterior Prueacutebala creandoinstancias y aplicaacutendole algunos meacutetodos

Ejercicio 2Crea la clase Vehiculo asiacute como las clases Bicicleta y Coche como subclases dela primera Para la clase Vehiculo crea los atributos de clase vehiculosCreadosykilometrosTotales asiacute como el atributo de instancia kilometrosRecorridos Creatambieacuten alguacuten meacutetodo especiacutefico para cada una de las subclases Prueba lasclases creadas mediante un programa con un menuacute como el que se muestraa continuacioacuten

VEHIacuteCULOS

=========

1 Anda con la bicicleta

2 Haz el caballito con la bicicleta

3 Anda con el coche

4 Quema rueda con el coche

5 Ver kilometraje de la bicicleta

6 Ver kilometraje del coche

7 Ver kilometraje total

8 Salir

Elige una opcioacuten (1-8)

Ejercicio 3Crea las clases Animal Mamifero Ave Gato Perro Canario Pinguino y Lagarto Creaal menos tres meacutetodos especiacuteficos de cada clase y redefne ellos meacutetodoscuando sea necesario Prueba las clases creadas en un programa en el que seinstancien objetos y se les apliquen meacutetodos

Ejercicio 4Crea la clase Fraccioacuten Los atributos seraacuten numerador y denominador Y algunos delos meacutetodos pueden ser invierte simplifica multiplica divide etc

Programacioacuten orientada a objetos 129

Ejercicio 5Crea la clase Pizza con los atributos y meacutetodos necesarios Sobre cada pizzase necesita saber el tamantildeo - mediana o familiar - el tipo - margarita cuatroquesos o funghi - y su estado - pedida o servida La clase debe almacenarinformacioacuten sobre el nuacutemero total de pizzas que se han pedido y que sehan servido Siempre que se crea una pizza nueva su estado es ldquopedidardquoEl siguiente coacutedigo del programa principal debe dar la salida que se muestra

public class PedidosPizza

public static void main(String[] args)

Pizza p1 = new Pizza(margarita mediana)

Pizza p2 = new Pizza(funghi familiar)

p2sirve()

Pizza p3 = new Pizza(cuatro quesos mediana)

Systemoutprintln(p1)

Systemoutprintln(p2)

Systemoutprintln(p3)

p2sirve()

Systemoutprintln(pedidas + PizzagetTotalPedidas())

Systemoutprintln(servidas + PizzagetTotalServidas())

pizza margarita mediana pedida

pizza funghi familiar servida

pizza cuatro quesos mediana pedida

esa pizza ya se ha servido

pedidas 3

servidas 1

Ejercicio 6Crea la clase Tiempo con los meacutetodos suma y resta Los objetos de la clase Tiempo

son intervalos de tiempo y se crean de la forma Tiempo t = new Tiempo(1 20

30) donde los paraacutemetros que se le pasan al constructor son las horas losminutos y los segundos respectivamente Crea el meacutetodo toString para ver losintervalos de tiempo de la forma 10h 35m 5s Si se suman por ejemplo 30m 40s y35m 20s el resultado deberiacutea ser 1h 6m 0s Realiza un programa de prueba paracomprobar que la clase funciona bien

Programacioacuten orientada a objetos 130

Ejercicio 7Queremos gestionar la venta de entradas (no numeradas) de ExpocochesCampanillas que tiene 3 zonas la sala principal con 1000 entradas dispo-nibles la zona de compra-venta con 200 entradas disponibles y la zona vipcon 25 entradas disponibles Hay que controlar que existen entradas antes devenderlasLa clase Zona con sus atributos y meacutetodos se muestra a continuacioacuten

Definicioacuten de la clase Zona author Luis Joseacute Saacutenchez

public class Zona

private int entradasPorVender

public Zona(int n)

entradasPorVender = n

public int getEntradasPorVender()

return entradasPorVender

Vende un nuacutemero de entradas ltpgt Comprueba si quedan entradas libres antes de realizar la venta param n nuacutemero de entradas a vender

public void vender(int n)

if (thisentradasPorVender == 0)

Systemoutprintln(Lo siento las entradas para esa zona estaacuten agotadas)

else if (thisentradasPorVender lt n)

Systemoutprintln(Soacutelo me quedan + thisentradasPorVender+ entradas para esa zona)

if (thisentradasPorVender gt= n)

entradasPorVender -= n

Systemoutprintln(Aquiacute tiene sus + n + entradas gracias)

El menuacute del programa debe ser el que se muestra a continuacioacuten Cuandoelegimos la opcioacuten 2 se nos debe preguntar para queacute zona queremos lasentradas y cuaacutentas queremos Loacutegicamente el programa debe controlar queno se puedan vender maacutes entradas de la cuenta

1 Mostrar nuacutemero de entradas libres

2 Vender entradas

3 Salir

Programacioacuten orientada a objetos 131

993 Arrays de objetos

Ejercicio 1Utiliza la clase Gato para crear un array de cuatro gatos e introduce los datosde cada uno de ellos mediante un bucle Muestra a continuacioacuten los datos detodos los gatos utilizando tambieacuten un bucle

Ejercicio 2Cambia el programa anterior de tal forma que los datos de los gatos se intro-duzcan directamente en el coacutedigo de la forma gatito[2]setColor(ldquomarroacutenrdquo) o bienmediante el constructor de la forma gatito[3] = new Gato(ldquoGarfieldrdquo ldquonaranjardquo

ldquomachordquo) Muestra a continuacioacuten los datos de todos los gatos utilizando unbucle

Ejercicio 3Realiza el programa ldquoColeccioacuten de discosrdquo por tu cuenta mirando lo menosposible el ejemplo que se proporciona Prueacutebalo primero para ver coacutemofunciona y luego intenta implementarlo tuacute mismo

Ejercicio 4Modifica el programa ldquoColeccioacuten de discosrdquo como se indica a continuacioacutena) Mejora la opcioacuten ldquoNuevo discordquo de tal forma que cuando se llenen todas lasposiciones del array el programa muestre un mensaje de error No se permitiraacuteintroducir los datos de ninguacuten disco hasta que no se borre alguno de la listab) Mejora la opcioacuten ldquoBorrarrdquo de tal forma que se verifique que el coacutedigointroducido por el usuario existec) Modifica el programa de tal forma que el coacutedigo del disco sea uacutenico es decirque no se pueda repetird) Crea un submenuacute dentro dentro de ldquoListadordquo de tal forma que exista unlistado completo un listado por autor (todos los discos que ha publicado undeterminado autor) un listado por geacutenero (todos los discos de un geacutenero de-terminado) y un listado de discos cuya duracioacuten esteacute en un rango determinadopor el usuario

Programacioacuten orientada a objetos 132

Ejercicio 5Crea el programa GESTISIMAL (GESTIoacuten SIMplificada de Almaceacuten) para llevarel control de los artiacuteculos de un almaceacuten De cada artiacuteculo se debe saberel coacutedigo la descripcioacuten el precio de compra el precio de venta y el stock(nuacutemero de unidades) El menuacute del programa debe tener al menos lassiguientes opciones

1 Listado

2 Alta

3 Baja

4 Modificacioacuten

5 Entrada de mercanciacutea

6 Salida de mercanciacutea

7 Salir

La entrada y salida de mercanciacutea supone respectivamente el incremento ydecremento de stock de un determinado artiacuteculo Hay que controlar que no sepueda sacar maacutes mercanciacutea de la que hay en el almaceacuten

10 Colecciones y diccionarios

101 Colecciones la clase ArrayList

Una coleccioacuten en Java es una estructura de datos que permite almacenar muchosvalores del mismo tipo por tanto conceptualmente es praacutecticamente igual que unarray Seguacuten el uso y seguacuten si se permiten o no repeticiones Java dispone de un ampliocataacutelogo de colecciones ArrayList (lista) ArrayBlockingQueue (cola) HashSet (conjunto)Stack (pila) etc En este manual estudiaremos la coleccioacuten ArrayListUn ArrayList es una estructura en forma de lista que permite almacenar elementos delmismo tipo (pueden ser incluso objetos) su tamantildeo va cambiando a medida que seantildeaden o se eliminan esos elementosNos podemos imaginar un ArrayList como un conjunto de celdas o cajoncitos donde seguardan los valores exactamente igual que un array convencional En la praacutectica seraacutemaacutes faacutecil trabajar con un ArrayListEn capiacutetulos anteriores hemos podido comprobar la utilidad del array es un recursoimprescindible que cualquier programador debe manejar con soltura No obstante elarray presenta algunos inconvenientes Uno de ellos es la necesidad de conocer eltamantildeo exacto en el momento de su creacioacuten Una coleccioacuten sin embargo se crea sinque se tenga que especificar el tamantildeo posteriormente se van antildeadiendo y quitandoelementos a medida que se necesitanTrabajando con arrays es frecuente cometer errores al utilizar los iacutendices por ejemploal intentar guardar un elemento en una posicioacuten que no existe (iacutendice fuera de rango)Aunque las colecciones permiten el uso de iacutendices no es necesario indicarlos siemprePor ejemplo en una coleccioacuten del tipo ArrayList cuando hay que antildeadir el elementoAmapola se puede hacer simplemente floresadd(Amapola) Al no especificar iacutendice elelemento Amapola se antildeadiriacutea justo al final de flores independientemente del tamantildeoy del nuacutemero de elementos que se hayan introducido yaLa clase ArrayList es muy similar a la clase Vector Eacutesta uacuteltima estaacute obsoleta y por tantono se recomienda su uso

1011 Principales meacutetodos de ArrayList

Las operaciones maacutes comunes que se pueden realizar con un objeto de la claseArrayList son las siguientes

add(elemento)Antildeade un elemento al final de la lista

133

Colecciones y diccionarios 134

add(indice elemento)Inserta un elemento en una posicioacuten determinada desplazando el resto deelementos hacia la derecha

clear()Elimina todos los elementos pero no borra la lista

contains(elemento)Devuelve true si la lista contiene el elemento que se especifica y false en casocontrario

get(indice)Devuelve el elemento de la posicioacuten que se indica entre pareacutentesis

indexOf(elemento)Devuelve la posicioacuten de la primera ocurrencia del elemento que se indica entrepareacutentesis

isEmpty()Devuelve true si la lista estaacute vaciacutea y false en caso de tener alguacuten elemento

remove(indice)Elimina el elemento que se encuentra en una posicioacuten determinada

remove(elemento)Elimina la primera ocurrencia de un elemento

set(indice elemento)Machaca el elemento que se encuentra en una determinada posicioacuten con elelemento que se pasa como paraacutemetro

size()Devuelve el tamantildeo (nuacutemero de elementos) de la lista

toArray()Devuelve un array con todos y cada uno de los elementos que contiene la lista

Puedes consultar todos los meacutetodos disponibles en la documentacioacuten oficial de la claseArrayList1

1httpdocsoraclecomjavase7docsapijavautilArrayListhtml

Colecciones y diccionarios 135

1012 Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de suselementos

A continuacioacuten se muestra un ejemplo en el que se puede ver coacutemo se declara unArrayList y coacutemo se insertan y se extraen elementos

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList01

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

Systemoutprintln(Nordm de elementos + asize())

aadd(rojo)

aadd(verde)

aadd(azul)

Systemoutprintln(Nordm de elementos + asize())

aadd(blanco)

Systemoutprintln(Nordm de elementos + asize())

Systemoutprintln(El elemento que hay en la posicioacuten 0 es + aget(0))

Systemoutprintln(El elemento que hay en la posicioacuten 3 es + aget(3))

Observa que al crear un objeto de la clase ArrayList hay que indicar el tipo de dato quese almacenaraacute en las celdas de esa lista Para ello se utilizan los caracteres lt y gt Nohay que olvidar los pareacutentesis del final

Es necesario importar la clase ArrayList para poder crear objetos de estaclase para ello debe aparecer al principio del programa la liacutenea import

javautilArrayList Algunos IDEs (por ej Netbeans) insertan esta liacutenea decoacutedigo de forma automaacutetica

En el siguiente ejemplo se muestra un ArrayList de nuacutemeros enteros

Colecciones y diccionarios 136

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList011

public static void main(String[] args)

ArrayListltIntegergt a = new ArrayListltIntegergt()

aadd(18)

aadd(22)

aadd(-30)

Systemoutprintln(Nordm de elementos + asize())

Systemoutprintln(El elemento que hay en la posicioacuten 1 es + aget(1))

Se define la estructura de la siguiente manera

ArrayListltIntegergt a = new ArrayListltIntegergt()

Fiacutejate que no se utiliza el tipo simple int sino el wrapper Integer Recuerda quelos wrapper son clases que engloban a los tipos simples y les antildeaden nuevasfuncionalidades (p ej permiten tratar a las variables numeacutericas como objetos) Elwrapper de int es Integer el de float es Float el de double es Double el de long es Longel de boolean es Boolean y el de char es CharacterEn el siguiente ejemplo podemos ver coacutemo extraer todos los elementos de una lista ala manera tradicional con un bulce for

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList02

Colecciones y diccionarios 137

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(int i=0 i lt asize() i++)

Systemoutprintln(aget(i))

Si estaacutes acostumbrado al for claacutesico habraacutes visto que es muy sencillo recorrer todoslos elementos del ArrayList No obstante al trabajar con colecciones es recomendableusar el for al estilo foreach como se muestra en el siguiente ejemplo Como puedes verla sintaxis es maacutes corta y no se necesita crear un iacutendice para recorrer la estructura

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList03

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(String color a)

Colecciones y diccionarios 138

Systemoutprintln(color)

Fiacutejate en estas liacuteneas

for(String color a)

Systemoutprintln(color)

El significado de este coacutedigo seriacutea el siguiente

for(String color a)

rarr Saca uno a uno todos los elementos de a y ve metieacutendolos en una variable de nombrecolor

Systemoutprintln(color)

rarr Muestra por pantalla el contenido de la variable colorVeamos ahora en otro ejemplo coacutemo eliminar elementos de un ArrayList Se utiliza elmeacutetodo remove() y se puede pasar como paraacutemetro el iacutendice del elemento que se quiereeliminar o bien el valor del elemento O sea aremove(2) elimina el elemento que seencuentra en la posicioacuten 2 de a mientras que aremove(blanco) elimina el valor blancoEs importante destacar que el ArrayList se reestructura de forma automaacutetica despueacutesdel borrado de cualquiera de sus elementos

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList04

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

Colecciones y diccionarios 139

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

aadd(blanco)

Systemoutprintln(Contenido de la lista )

for(String color a)

Systemoutprintln(color)

if (acontains(blanco))

Systemoutprintln(El blanco estaacute en la lista de colores)

aremove(blanco)

Systemoutprintln(Contenido de la lista despueacutes de quitar la +

primera ocurrencia del color blanco )

for(String color a)

Systemoutprintln(color)

aremove(2)

Systemoutprintln(Contenido de la lista despueacutes de quitar el +

elemento de la posicioacuten 2 )

for(String color a)

Systemoutprintln(color)

A continuacioacuten se muestra un ejemplo en el que se ldquomachacardquo una posicioacuten delArrayList Al hacer aset(2 turquesa) se borra lo que hubiera en la posicioacuten 2 y secoloca el valor turquesa Seriacutea equivalente a hacer a[2] = turquesa en caso de que a

fuese un array tradicional en lugar de un ArrayList

Colecciones y diccionarios 140

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList05

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido del vector )

for(String color a)

Systemoutprintln(color)

aset(2 turquesa)

Systemoutprintln(Contenido del vector despueacutes de machacar la posicioacuten 2 )

for(String color a)

Systemoutprintln(color)

El meacutetodo add permite antildeadir elementos a un ArrayList como ya hemos visto Porejemplo aadd(amarillo) antildeade el elemento amarillo al final de a Este meacutetodo sepuede utilizar tambieacuten con un iacutendice de la forma aadd(1 turquesa) En este caso loque se hace es insertar en la poscioacuten indicada Lo mejor de todo es que el ArrayList sereestructura de forma automaacutetica desplazando el resto de elementos

Colecciones y diccionarios 141

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList06

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(String color a)

Systemoutprintln(color)

aadd(1 turquesa)

Systemoutprintln(Contenido del vector despueacutes de insertar en la posicioacuten 1 )

for(String color a)

Systemoutprintln(color)

1013 ArrayList de objetos

Una coleccioacuten ArrayList puede contener objetos que son instancias de clases definidaspor el programador Esto es muy uacutetil sobre todo en aplicaciones de gestioacuten paraguardar datos de alumnos productos libros etcEn el siguiente ejemplo definimos una lista de gatos En cada celda de la lista sealmacenaraacute un objeto de la clase Gato

Colecciones y diccionarios 142

Uso de un ArrayList de objetos author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList07

public static void main(String[] args)

ArrayListltGatogt g = new ArrayListltGatogt()

gadd(new Gato(Garfield naranja mestizo))

gadd(new Gato(Pepe gris angora))

gadd(new Gato(Mauri blanco manx))

gadd(new Gato(Ulises marroacuten persa))

Systemoutprintln(nDatos de los gatosn)

for (Gato gatoAux g)

Systemoutprintln(gatoAux+n)

En el siguiente apartado se muestra la definicioacuten de la clase Gato

1014 Ordenacioacuten de un ArrayList

Los elementos de una lista se pueden ordenar con el meacutetodo sort El formato es elsiguiente

Collectionssort(lista)

Observa que sort es un meacutetodo de clase que estaacute definido en Collections Para poderutilizar este meacutetodo es necesario incluir la liacutenea

import javautilCollections

al principio del programa A continuacioacuten se muestra un ejemplo del uso de sort

Colecciones y diccionarios 143

Ordenacioacuten de un ArrayList author Luis Joseacute Saacutenchez

import javautilCollectionsimport javautilArrayList

public class EjemploArrayList071

public static void main(String[] args)

ArrayListltIntegergt a = new ArrayListltIntegergt()

aadd(67)

aadd(78)

aadd(10)

aadd(4)

Systemoutprintln(nNuacutemeros en el orden original)

for (int numero a)

Systemoutprintln(numero)

Collectionssort(a)

Systemoutprintln(nNuacutemeros ordenados)

for (int numero a)

Systemoutprintln(numero)

Tambieacuten es posible ordenar una lista de objetos En este caso es necesario indicar elcriterio de ordenacioacuten en la definicioacuten de la clase En el programa principal se utilizael meacutetodo sort igual que si se tratase de una lista de nuacutemeros o de palabras como semuestra a continuacioacuten

Colecciones y diccionarios 144

Ordenacioacuten de un ArrayList de objetos author Luis Joseacute Saacutenchez

import javautilCollectionsimport javautilArrayList

public class EjemploArrayList08

public static void main(String[] args)

ArrayListltGatogt g = new ArrayListltGatogt()

gadd(new Gato(Garfield naranja mestizo))

gadd(new Gato(Pepe gris angora))

gadd(new Gato(Mauri blanco manx))

gadd(new Gato(Ulises marroacuten persa))

gadd(new Gato(Adaacuten negro angora))

Collectionssort(g)

Systemoutprintln(nDatos de los gatos ordenados por nombre)

for (Gato gatoAux g)

Systemoutprintln(gatoAux+n)

Ahora bien en la definicioacuten de la clase Gato hay que indicar de alguna manera coacutemo sedebe realizar la ordenacioacuten ya que Java no sabe de antemano si los gatos se ordenanseguacuten el color el nombre el peso etcLo primero que hay que hacer es indicar que los objetos de la clase Gato se puedencomparar unos con otros Para ello cambiamos la siguiente liacutenea

public class Gato

por esta otra

public class Gato implements ComparableltGatogt

Lo siguiente y no menos importante es definir el meacutetodo compareTo Este meacutetodo debedevolver un 0 si los elementos que se comparan son iguales un nuacutemero negativo si

Colecciones y diccionarios 145

el primer elemento que se compara es menor que el segundo y un nuacutemero positivoen caso contrario Afortunadamente las clases String Integer Double etc ya tienenimplementado su propio meacutetodo compareTo asiacute que tenemos hecho lo maacutes difiacutecil Louacutenico que deberemos escribir en nuestro coacutedigo es un compareTo con los atributos quequeremos compararEn el caso que nos ocupa si queremos ordenar los gatos por nombre tendremos queimplementar el compareTo de la clase Gato de tal forma que nos devuelva el resultadodel compareTo de los nombres de los gatos que estamos comparando de la siguientemanera

public int compareTo(Gato g)

return (thisnombre)compareTo(ggetNombre())

Si en lugar de ordenar por nombre quisieacuteramos ordenar por raza el meacutetodo compareTo

de la clase Gato seriacutea el siguiente

public int compareTo(Gato g)

return (thisraza)compareTo(ggetRaza())

A continuacioacuten se muestra la definicioacuten completa de la clase Gato

Definicioacuten de la clase Gato author

public class Gato implements ComparableltGatogt

private String nombre

private String color

private String raza

public Gato(String nombre String color String raza)

thisnombre = nombre

thiscolor = color

thisraza = raza

public String getNombre()

return nombre

Colecciones y diccionarios 146

public String getRaza()

return raza

public String toString()

return Nombre + thisnombre + nColor + thiscolor + nRaza + thisraza

public int compareTo(Gato g)

return (thisnombre)compareTo(ggetNombre())

public boolean equals(Gato g)

return (thisnombre)equals(ggetNombre())

102 Diccionarios la clase HashMap

Imagina un diccionario ingleacutes-espantildeol Queremos saber queacute significa la palabra ldquostiffrdquoSabemos que en el diccionario hay muchas entradas y en cada entrada tenemos unapalabra en ingleacutes y su correspondiente traduccioacuten al espantildeol Buscando por la ldquosrdquoencontramos que ldquostiffrdquo significa ldquoagujetasrdquoUn diccionario en Java funciona exactamente igual Contiene una serie de elementosque son las entradas que a su vez estaacuten formadas por un par (clave valor) La clave(key) permite acceder al valor No puede haber claves duplicadas En el ejemploanterior la clave seriacutea ldquostiffrdquo y el valor ldquoagujetasrdquoJava dispone de varios tipos de diccionarios HashMap EnumMap Hashtable IdentityHashMapLinkedHashMap etc Nosotros estudiaremos el diccionario HashMap

1021 Principales meacutetodos de HashMap

Algunos de los meacutetodos maacutes importantes de la clase HasMap son

get(clave)Obtiene el valor correspondiente a una clave Devuelve null si no existe esa claveen el diccionario

put(clave valor)Antildeade un par (clave valor) al diccionario Si ya habiacutea un valor para esa clave semachaca

keySet()Devuelve un conjunto (set) con todas las claves

Colecciones y diccionarios 147

values()Devuelve una coleccioacuten con todos los valores (los valores pueden estar duplicadosa diferencia de las claves)

entrySet()Devuelve una coleccioacuten con todos los pares (clave valor)

containsKey(clave)Devuelve true si el diccionario contiene la clave indicada y false en caso contrario

getKey()Devuelve la clave de la entrada Se aplica a una sola entrada del diccionario (noal diccionario completo) es decir a una pareja (clave valor)

Por ejemplo

for (MapEntry pareja mentrySet())

Systemoutprintln(parejagetKey())

getValue()Devuelve el contenido de la entrada Se aplica a una entrada del diccionario (noal diccionario completo) es decir a una pareja (clave valor)

Por ejemplo

for (MapEntry pareja mentrySet())

Systemoutprintln(parejagetValue())

1022 Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas

Al declarar un diccionario hay que indicar los tipos tanto de la clave como del valorEn el siguiente ejemplo definimos el diccionario m que tendraacute como clave un nuacutemeroentero y una cadena de caracteres como valor Este diccionario se declara de estaforma

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

No hay que olvidar importar la clase al principio del programa

import javautilHashMap

Para insertar una entrada en el diccionario se utiliza el meacutetodo put indicando siemprela clave y el valor Veamos un ejemplo completo

Colecciones y diccionarios 148

Ejemplo de uso de la clase HasMap author Luis Joseacute Saacutenchez

import javautilHashMap

public class EjemploHashMap01

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(Los elementos de m son n + m)

Para extraer valores se utiliza el meacutetodo get Se proporciona una clave y el diccionarionos devuelve el valor igual que un diccionario de verdad Si no existe ninguna entradacon la clave que se indica se devuelve null

Ejemplo de uso de la clase HasMap author Luis Joseacute Saacutenchez

import javautilHashMap

public class EjemploHashMap011

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

Colecciones y diccionarios 149

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(mget(921))

Systemoutprintln(mget(605))

Systemoutprintln(mget(888))

iquestY si queremos extraer todas las entradas Tenemos varias opciones Podemos usar elmeacutetodo print directamente sobre el diccionario de la forma Systemoutprint(diccionario)

como vimos en un ejemplo anterior de esta manera se muestran por pantalla todaslas entradas encerradas entre llaves Tambieacuten podemos convertir el diccionario enun entrySet (conjunto de entradas) y mostrarlo con print de esta forma se obtieneuna salida por pantalla muy parecida a la primera (en lugar de llaves se muestrancorchetes) Otra opcioacuten es utilizar un for para recorrer una a una todas las entradasEn este uacuteltimo caso hay que convertir el diccionario en un entrySet ya que no se puedensacar las entradas directamente del diccionario Estas dos uacuteltimas opciones se ilustranen el siguiente ejemplo

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautilHashMapimport javautilMap

public class EjemploHashMap02

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(Todas las entradas del diccionario extraiacutedas con entrySet)

Systemoutprintln(mentrySet())

Systemoutprintln(nEntradas del diccionario extraiacutedas una a una)

Colecciones y diccionarios 150

for (MapEntry pareja mentrySet())

Systemoutprintln(pareja)

A continuacioacuten se muestra el uso de los meacutetodos getKey y getValue que extraen la clavey el valor de una entrada respectivamente

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautil

public class EjemploHashMap03

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(CoacutedigotNombren------t-------------)

for (MapEntry pareja mentrySet())

Systemoutprint(parejagetKey() + t)

Systemoutprintln(parejagetValue())

En el uacuteltimo programa de ejemplo hacemos uso del meacutetodo containsKey que nos serviraacutepara saber si existe o no una determinada clave en un diccionario y del meacutetodo get

que como ya hemos visto sirve para extraer un valor a partir de su clave

Colecciones y diccionarios 151

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautil

public class EjemploHashMap04

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprint(Por favor introduzca un coacutedigo )

int codigoIntroducido = IntegerparseInt(Systemconsole()readLine())

if (mcontainsKey(codigoIntroducido))

Systemoutprint(El coacutedigo + codigoIntroducido + corresponde a )

Systemoutprintln(mget(codigoIntroducido))

else

Systemoutprint(El coacutedigo introducido no existe)

Colecciones y diccionarios 152

103 Ejercicios

Ejercicio 1Crea un ArrayList con los nombres de 6 compantildeeros de clase A continuacioacutenmuestra esos nombres por pantalla Utiliza para ello un bucle for que recorratodo el ArrayList sin usar ninguacuten iacutendice

Ejercicio 2Realiza un programa que introduzca valores aleatorios (entre 0 y 100) en unArrayList y que luego calcule la suma la media el maacuteximo y el miacutenimo de esosnuacutemeros El tamantildeo de la lista tambieacuten seraacute aleatorio y podraacute oscilar entre 10y 20 elementos ambos inclusive

Ejercicio 3Escribe un programa que ordene 10 nuacutemeros enteros introducidos por tecladoy almacenados en un objeto de la clase ArrayList

Ejercicio 4Realiza un programa equivalente al anterior pero en esta ocasioacuten el programadebe ordenar palabras en lugar de nuacutemeros

Ejercicio 5Realiza de nuevo el ejercicio de la coleccioacuten de discos pero utilizando esta vezuna lista para almacenar la informacioacuten sobre los discos en lugar de un arrayconvencional Comprobaraacutes que el coacutedigo se simplifica notablemente iquestCuaacutentoocupa el programa original hecho con un array iquestCuaacutento ocupa este nuevoprograma hecho con una lista

Ejercicio 6Implementa el control de acceso al aacuterea restringida de un programa Se debepedir un nombre de usuario y una contrasentildea Si el usuario introduce losdatos correctamente el programa diraacute ldquoHa accedido al aacuterea restringidardquo Elusuario tendraacute un maacuteximo de 3 oportunidades Si se agotan las oportunidadesel programa diraacute ldquoLo siento no tiene acceso al aacuterea restringidardquo Los nombresde usuario con sus correspondientes contrasentildeas deben estar almacenadosen una estructura de la clase HashMap

Colecciones y diccionarios 153

Ejercicio 7La maacutequina Eurocoin genera una moneda de curso legal cada vez que se pulsaun botoacuten siguiendo la siguiente pauta o bien coincide el valor con la monedaanteriormente generada - 1 ceacutentimo 2 ceacutentimos 5 ceacutentimos 10 ceacutentimos 25ceacutentimos 50 ceacutentimos 1 euro o 2 euros - o bien coincide la posicioacuten ndash cara ocruz Simula mediante un programa la generacioacuten de 6 monedas aleatoriassiguiendo la pauta correcta Cada moneda generada debe ser una instanciade la clase Moneda y la secuencia se debe ir almacenando en una lista

Ejemplo

2 ceacutentimos ndash cara

2 ceacutentimos ndash cruz

50 ceacutentimos ndash cruz

1 euro ndash cruz

1 euro ndash cara

10 ceacutentimos ndash cara

Ejercicio 8Realiza un programa que escoja al azar 10 cartas de la baraja espantildeola(10 objetos de la clase Carta) Emplea un objeto de la clase ArrayList paraalmacenarlas y aseguacuterate de que no se repite ninguna

Ejercicio 9Modifica el programa anterior de tal forma que las cartas se muestren orde-nadas Primero se ordenaraacuten por palo bastos copas espadas oros Cuandocoincida el palo se ordenaraacute por nuacutemero as 2 3 4 5 6 7 sota caballo rey

Ejercicio 10Crea un mini-diccionario espantildeol-ingleacutes que contenga al menos 20 palabras(con su correspondiente traduccioacuten) Utiliza un objeto de la clase HashMap paraalmacenar las parejas de palabras El programa pediraacute una palabra en espantildeoly daraacute la correspondiente traduccioacuten en ingleacutes

Ejercicio 11Realiza un programa que escoja al azar 5 palabras en espantildeol del mini-diccionario del ejercicio anterior El programa iraacute pidiendo que el usuarioteclee la traduccioacuten al ingleacutes de cada una de las palabras y comprobaraacute sison correctas Al final el programa deberaacute mostrar cuaacutentas respuestas sonvaacutelidas y cuaacutentas erroacuteneas

Colecciones y diccionarios 154

Ejercicio 12Escribe un programa que genere una secuencia de 5 cartas de la barajaespantildeola y que sume los puntos seguacuten el juego de la brisca El valor de lascartas se debe guardar en una estructura HashMap que debe contener parejas(figura valor) por ejemplo (ldquocaballordquo 3) La secuencia de cartas debe ser unaestructura de la clase ArrayList que contiene objetos de la clase Carta El valorde las cartas es el siguiente as rarr 11 tres rarr 10 sota rarr 2 caballo rarr 3 rey rarr4 el resto de cartas no vale nada

Ejemplo

as de oros

cinco de bastos

caballo de espadas

sota de copas

tres de oros

Tienes 26 puntos

Ejercicio 13Modifica el programa Gestisimal realizado anteriormente antildeadiendo lassiguientes mejoras

bull Utiliza una lista en lugar de un array para el almacenamiento de los datosbull Comprueba la existencia del coacutedigo en el alta la baja y la modificacioacuten

de artiacuteculos para evitar erroresbull Cambia la opcioacuten ldquoSalida de stockrdquo por ldquoVentardquo Esta nueva opcioacuten

permitiraacute hacer una venta de varios artiacuteculos y emitir la factura corres-pondiente Se debe preguntar por los coacutedigos y las cantidades de cadaartiacuteculo que se quiere comprar Aplica un 21 de IVA

11 Ficheros de texto y paso de paraacutemetrospor liacutenea de comandos

Mediante un programa en Java se puede acceder al contenido de un fichero grabadoen un dispositivo de almacenamiento (por ejemplo en el disco duro) tanto para leercomo para escribir (grabar) datosLa informacioacuten contenida en las variables los arrays los objetos o cualquier otraestructura de datos es volaacutetil es decir se pierde cuando se cierra el programaLos ficheros permiten tener ciertos datos almacenados y disponibles en cualquiermomento para cuando nuestro programa los necesitePensemos por ejemplo en un juego Podriacuteamos utilizar un fichero para guardar elranking de jugadores con las mejores puntuaciones De esta manera estos datos nose perderiacutean al salir del juego De igual forma en un programa de gestioacuten puede seruacutetil tener un fichero de configuracioacuten con datos como el nuacutemero maacuteximo de elementosque se muestran en un listado o los distintos tipos de IVA aplicables a las facturas Almodificar esta informacioacuten quedaraacute almacenada en el fichero correspondiente y nose perderaacute cuando se cierre el programa

Cuando un programa se cierra se pierde la informacioacuten almacenada envariables arrays objetos o cualquier otra estructura Si queremos conservarciertos datos debemos guardarlos en ficheros

Hay programas que hacen un uso intensivo de datos Por ejemplo la aplicacioacutenSeacuteneca- que por cierto estaacute hecha en Java - lleva el control de la matriculacioacuten de cientosde miles de alumnos y la gestioacuten de decenas de miles de profesores En este caso yen otros similares se utiliza un sistema gestor de bases de datos El acceso a bases dedatos mediante Java lo estudiaremos en el capiacutetulo 13

La creacioacuten y uso de ficheros desde un programa en Java se lleva a cabocuando hay poca informacioacuten que almacenar o cuando esa informacioacuten esheterogeacutenea En los casos en que la informacioacuten es abundante y homogeacuteneaes preferible usar una base de datos relacional (por ejemplo MySQL) en lugarde ficheros

En este capiacutetulo estudiaremos ademaacutes del acceso a ficheros desde un programa enJava el paso de paraacutemetros desde la liacutenea de comandos Son cosas diferentes y nohay que utilizarlas juntas necesariamente pero como podraacutes comprobar se combinanmuy bien por eso hemos incluido estos dos recursos de Java en un mismo capiacutetulo

155

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 156

111 Lectura de un fichero de texto

Aunque Java puede manejar tambieacuten ficheros binarios vamos a centrarnos exclusi-vamente en la utilizacioacuten de ficheros de texto Los ficheros de texto tienen una granventaja se pueden crear y manipular mediante cualquier editor como por ejemploGEditSiempre que vayamos a usar ficheros deberemos incluir al principio del programa unao varias liacuteneas para cargar las clases necesarias Anque se pueden cargar varias clasesen una sola liacutenea usando el asterisco de la siguiente manera

import javaio

nosotros no lo haremos asiacute ya que nuestro coacutedigo sigue las normas del estaacutendar deGoogle y estas normas lo prohiben taxativamente Se importaraacuten las clases usandovarias liacuteneas una liacutenea por cada clase que se importa en el programa de esta forma

import javaioBufferedReaderimport javaioFileReader

No es necesario saber de memoria los nombres de las clases el entorno de desarrolloNetbeans detecta queacute clases hacen falta cargar y antildeade los import de forma automaacute-ticaTodas las operaciones que se realicen sobre ficheros deberaacuten estar incluidas en unbloque try-catch Esto nos permitiraacute mostrar mensajes de error y terminar el programade una forma ordenada en caso de que se produzca alguacuten fallo - el fichero no existeno tenemos permiso para acceder a eacutel etcEl bloque try-catch tiene el siguiente formato

try

Operaciones_con_fichero

catch (tipo_de_error nombre_de_variable)

Mensaje_de_error

Tanto para leer como para escribir utilizamos lo que en programacioacuten se llama unldquomanejador de ficherordquo Es algo asiacute como una variable que hace referencia al ficherocon el que queremos trabajarEn nuestro ejemplo el manejador de fichero se llama bf y se crea de la siguientemanera

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 157

BufferedReader bf = new BufferedReader(new FileReader(malaga1txt))

El fichero con el que vamos a trabajar tiene por nombre malaga1txt y contieneinformacioacuten extraiacuteda de la Wikipedia sobre la bonita ciudad de Maacutelaga1 A partir deaquiacute siempre que queramos realizar una operacioacuten sobre ese archivo utilizaremos sumanejador de fichero asociado es decir bfEn el ejemplo que se muestra a continuacioacuten el programa lee el contenido del ficheromalaga1txt y lo muestra tal cual en pantalla igual que si hicieacuteramos en una ventanade terminal cat malaga1txtObserva que se va leyendo el fichero liacutenea a liacutenea mediante bfreadLine() hasta que seacaban las liacuteneas Cuando no quedan maacutes liacuteneas por leer se devuelve el valor null

Ejemplo de uso de la clase File Lectura de un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileNotFoundExceptionimport javaioFileReaderimport javaioIOException

class EjemploFichero01

public static void main(String[] args)

try

BufferedReader bf = new BufferedReader(new FileReader(malaga1txt))

String linea =

while (linea = null)

Systemoutprintln(linea)

linea = bfreadLine()

bfclose()

catch (FileNotFoundException e) queacute hacer si no se encuentra el ficheroSystemoutprintln(No se encuentra el fichero malagatxt)

catch (IOException e) queacute hacer si hay un error en la lectura del fichero

1httpeswikipediaorgwikiMC3A1laga

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 158

Systemoutprintln(No se puede leer el fichero malagatxt)

Es importante ldquocerrar el ficherordquo cuando se han realizado todas las operacionesnecesarias sobre eacutel En este ejemplo esta accioacuten se ha llevado a cabo con la sentenciabfclose()A continuacioacuten se muestra un programa un poco maacutes complejo Se trata de unaaplicacioacuten que pide por teclado un nombre de fichero Previamente en ese fichero(por ejemplo numerostxt) habremos introducido una serie de nuacutemeros a razoacuten de unopor liacutenea Se podriacutean leer tambieacuten los nuacutemeros si estuvieran separados por comaso espacios aunque seriacutea un poco maacutes complicado (no mucho maacutes) Los nuacutemerospueden contener decimales ya que se van a leer como Double Cada nuacutemero que selee del fichero se va sumando de tal forma que la suma total estaraacute contenida en lavariable suma a la par se va llevando la cuenta de los elementos que se van leyendoen la variable i Finalmente dividiendo la suma total entre el nuacutemero de elementosobtenemos la media aritmeacutetica de los nuacutemeros contenidos en el fichero

Ejemplo de uso de la clase File Calcula la media de los nuacutemeros que se encuentran en un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileReaderimport javaioIOException

class EjemploFichero08

public static void main(String[] args)

Systemoutprint(Introduzca el nombre del archivo donde se encuentran los nuacutemeros )

String nombreFichero = Systemconsole()readLine()

try

BufferedReader bf = new BufferedReader(new FileReader(nombreFichero))

String linea = 0

int i = 0

double suma = 0

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 159

while (linea = null)

i++

suma += DoubleparseDouble(linea)

linea = bfreadLine()

i--

bfclose()

Systemoutprintln(La media es + suma (double)i)

catch (IOException e)

Systemoutprintln(egetMessage())

112 Escritura sobre un fichero de texto

La escritura en un fichero de texto es si cabe maacutes faacutecil que la lectura Solo hay quecambiar Systemoutprint(texto) por manejadorwrite(texto) Se pueden incluir saltosde liacutenea tabuladores y espacios igual que al mostrar un mensaje por pantallaEs importante ejecutar close() despueacutes de realizar la escritura de esta manera nosaseguramos que se graba toda la informacioacuten en el discoAl realizar escrituras en ficheros con Java hay que tener ciertas precauciones Cuandotoca dar este tema en clase es frecuente que a maacutes de un alumno le empiece a irlento el ordenador luego se le queda inutilizado y por uacuteltimo ni siquiera le arrancaiquestqueacute ha pasado Pues que ha estado escribiendo datos en ficheros y por alguna razoacutensu programa se ha metido en un bucle infinito lo que da como resultado cuelgues yficheros de varios gigabytes de basura Por eso es muy importante asegurarse biende que la informacioacuten que se va a enviar a un fichero es la correcta iquestcoacutemo muy faacutecilenviaacutendola primero a la pantalla

Primero a pantalla y luego a ficheroEnviacutea primero a la pantalla todo lo que quieras escribir en el fichero Cuandocompruebes que lo que se ve por pantalla es realmente lo que quieres grabaren el fichero entonces y solo entonces cambia Systemoutprint(texto) pormanejadorwrite(texto)

A continuacioacuten se muestra un programa de ejemplo que crea un fichero de texto yluego esribe en eacutel tres palabras una por cada liacutenea

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 160

Ejemplo de uso de la clase File Escritura en un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedWriterimport javaioFileWriterimport javaioIOException

class EjemploFichero02

public static void main(String[] args)

try

BufferedWriter bw = new BufferedWriter(new FileWriter(frutatxt))

bwwrite(naranjan)

bwwrite(mangon)

bwwrite(chirimoyan)

bwclose()

catch (IOException ioe)

Systemoutprintln(No se ha podido escribir en el fichero)

113 Lectura y escritura combinadas

Las operaciones de lectura y escritura sobre ficheros se pueden combinar de tal formaque haya un flujo de lectura y otro de escritura uno de lectura y dos de escritura tresde lectura etcEn el ejemplo que presentamos a continuacioacuten hay dos flujos de lectura y uno deescritura Observa que se declaran en total tres manejadores de fichero (dos paralectura y uno para escritura) El programa va leyendo de forma alterna una liacutenea decada fichero - una liacutenea de fichero1txt y otra liacutenea de fichero2txt - mientras quedenliacuteneas por leer en alguno de los ficheros y al mismo tiempo va guardando esas liacuteneasen otro fichero con nombre mezclatxt

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 161

Ejemplo de uso de la clase File Mezcla de dos ficheros author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioBufferedWriterimport javaioFileReaderimport javaioFileWriterimport javaioIOException

class EjemploFichero03

public static void main(String[] args)

try

BufferedReader bf1 = new BufferedReader(new FileReader(fichero1txt))

BufferedReader bf2 = new BufferedReader(new FileReader(fichero2txt))

BufferedWriter bw = new BufferedWriter(new FileWriter(mezclatxt))

String linea1 =

String linea2 =

while ( (linea1 = null) || (linea2 = null) )

linea1 = bf1readLine()

linea2 = bf2readLine()

if (linea1 = null) bwwrite(linea1 + n)

if (linea2 = null) bwwrite(linea2 + n)

bf1close()

bf2close()

bwclose()

catch (IOException ioe)

Systemoutprintln(Se ha producido un error de lecturaescritura)

Systemerrprintln(ioegetMessage())

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 162

114 Otras operaciones sobre ficheros

Ademaacutes de leer desde o escribir en un fichero hay otras operaciones relacionadas conlos archivos que se pueden realizar desde un programa escrito en JavaVeremos tan solo un par de ejemplos Si quieres profundizar maacutes eacutechale un vistazo ala documentacioacuten oficial de la clase File2El siguiente ejemplo muestra por pantalla un listado con todos los archivos quecontiene un directorio

Ejemplo de uso de la clase File Listado de los archivos del directorio actual author Luis Joseacute Saacutenchez

import javaioFile

class EjemploFichero04

public static void main(String[] args)

File fichero = new File() se indica la ruta entre comillas el punto () es el directorio actual

String[] listaArchivos = ficherolist()

for(int i = 0 i lt listaArchivoslength i++)

Systemoutprintln(listaArchivos[i])

El siguiente programa de ejemplo comprueba si un determinado archivo existe ono mediante exists() y en caso de que exista lo elimina mediante delete() Siintentaacuteramos borrar un archivo que no existe obtendriacuteamos un error

2httpdocsoraclecomjavase7docsapijavaioFilehtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 163

Ejemplo de uso de la clase File Comprobacioacuten de existencia y borrado de un fichero author Luis Joseacute Saacutenchez

import javaioFile

class EjemploFichero05

public static void main(String[] args)

Systemoutprint(Introduzca el nombre del archivo que desea borrar )

String nombreFichero = Systemconsole()readLine()

File fichero = new File(nombreFichero)

if (ficheroexists())

ficherodelete()

Systemoutprintln(El fichero se ha borrado correctamente)

else

Systemoutprintln(El fichero + nombreFichero + no existe)

115 Paso de argumentos por liacutenea de comandos

Como dijimos al comienzo de este capiacutetulo el paso de argumentos por liacutenea decomandos no estaacute directamente relacionado con los ficheros aunque es muy frecuentecombinar estos dos recursosSeguro que has usado muchas veces el paso de argumentos por liacutenea de comandossin saberlo Por ejemplo si tecleas el siguiente comando en una ventana de terminal

$ head -5 etcbashbashrc

se muestran por pantalla las 5 primeras liacuteneas del fichero bashbashrc que se encuentraen el directorio etc En este caso head es el nombre del programa que estamosejecutando y los valores -5 y etcbashbashrc son los argumentosVolvamos al comienzo al primer capiacutetulo iquestRecuerdas coacutemo ejecutaste tu primerprograma en Java iexclQueacute tiempos aqueacutellos El programa HolaMundo se ejecutaba asiacute

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 164

$ java HolaMundo

Para probar los ejemplos que te presentamos maacutes adelante deberaacutes hacer lo mismo yademaacutes antildeadir a continuacioacuten y separados por espacios los argumentos que quieresque lea el programa Vamos a verlo en detalleEl siguiente programa de ejemplo simplemente muestra por pantalla los argumentosintroducidos Compila el programa y prueba a ejecutar lo siguiente

$ java EjemploArgumentos06 hola que tal 24 12 fin

con lo que obtendraacutes el siguiente resultado

Los argumentos introducidos son

hola

que

tal

24

12

fin

Los argumentos han pasado al programa en virtud del paraacutemetro que incluimos en laliacutenea del main

public static void main(String[] args)

Fiacutejate en lo que hay entre pareacutentesis String[] args Se trata de un array de cadenasde caracteres (String) donde cada uno de los elementos seraacute un argumento que se hapasado como paraacutemetro Si has ejecutado el ejemplo tal y como se ha indicado args[0]vale ldquoholardquo args[1] vale ldquoquerdquo args[2] vale ldquotalrdquo args[3] vale ldquo24rdquo args[4] vale ldquo12rdquo yargs[5] vale ldquofinrdquo

Paso de argumentos en la liacutenea de comandos author Luis Joseacute Saacutenchez

class EjemploArgumentos06

public static void main(String[] args)

Systemoutprintln(Los argumentos introducidos son )

for (int i = 0 i lt argslength i++)

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 165

Systemoutprintln(args[i])

Hagamos algo un poco maacutes uacutetil con los argumentos En el siguiente ejemplo se sumantodos los argumentos que se pasan como paraacutemetros y se muestra por pantalla elresultado de la sumaDespueacutes de compilar deberaacutes ejecutar desde una ventana de terminal lo siguiente(puedes cambiar los nuacutemeros si quieres)

$ java EjemploArgumentos07 10 36 44

con lo que obtendraacutes este resultado

90

es decir la suma de los nuacutemeros que has pasado como paraacutemetros

Paso de argumentos en la liacutenea de comandos author Luis Joseacute Saacutenchez

class EjemploArgumentos07

public static void main(String[] args)

int suma = 0

for (int i = 0 i lt argslength i++)

suma += IntegerparseInt(args[i])

Systemoutprintln(suma)

Observa que el programa convierte en nuacutemeros enteros todos y cada uno de losargumentos mediante el meacutetodo IntegerparseInt() para poder sumarlos

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 166

Los argumentos recogidos por liacutenea de comandos se guardan siempre enun array de String Cuando sea necesario realizar operaciones matemaacuteticascon esos argumentos habriacutea que convertirlos al tipo adecuado medianteIntegerparseInt() o DoubleparseDouble()

116 Combinacioacuten de ficheros y paso de argumentos

Llegoacute el momento de combinar las operaciones con ficheros con el paso de paraacutemetrospor liacutenea de comandos El ejemplo que mostramos a continuacioacuten es parecido al quehemos visto en el apartado anterior calcula la media de una serie de nuacutemeros peroesta vez esos nuacutemeros se leen desde un fichero y lo que se pasa como paraacutemetro por laliacutenea de comandos es precisamente el nombre del fichero donde estaacuten esos nuacutemerosCrea un fichero y noacutembralo numerostxt e introduce los siguientes nuacutemeros (es impor-tante que esteacuten separados por un salto de liacutena para que el programa funcione bien)

25

100

44

17

6

8

A continuacioacuten compila el programa de ejemplo EjemploFichero09java y teclea losiguiente en la ventana de terminal

$ java EjemploFichero09 numerostxt

Apareceraacute el siguiente resultado

La media es 33333333333333336

Ejemplo de uso de la clase File Calcula la media de los nuacutemeros que se encuentran en un fichero de texto El nombre del fichero se pasa como argumento en la liacutenea de comandos author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileReader

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 167

import javaioIOException

class EjemploFichero09

public static void main(String[] args)

if (argslength = 1)

Systemoutprintln(Este programa calcula la media de los nuacutemeros contenidos en un f

ichero)

Systemoutprintln(Uso del programa java EjemploFichero09 FICHERO)

Systemexit(-1) sale del programa

try

BufferedReader bf = new BufferedReader(new FileReader(args[0]))

String linea = 0

int i = 0

double suma = 0

while (linea = null)

i++

suma += DoubleparseDouble(linea)

linea = bfreadLine()

i--

bfclose()

Systemoutprintln(La media es + suma(double)i)

catch (IOException e)

Systemoutprintln(egetMessage())

Observa que el programa comprueba el nuacutemero de argumentos que se pasan por laliacutenea de comandos mediante if (argslength = 1) y si este nuacutemero es distinto de 1muestra este mensaje

Este programa calcula la media de los nuacutemeros contenidos en un fichero

Uso del programa java EjemploFichero09 FICHERO

y sale del programa De esta manera el usuario sabe exactamente coacutemo hay queutilizar el programa y coacutemo hay que pasarle la informacioacuten

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 168

117 Procesamiento de archivos de texto

La posibilidad de realizar desde Java operaciones con ficheros abre muchas posibili-dades a la hora de procesar archivos cambiar una palabra por otra eliminar ciertoscaracteres mover de sitio una liacutenea o una palabra borrar espacios o tabulaciones alfinal de las liacuteneas o cualquier otra cosa que se nos pueda ocurrirCuando se procesa un archivo de texto los pasos a seguir son los siguientes

1 Leer una liacutenea del fichero origen mientras quedan liacuteneas por leer2 Modificar la liacutenea (normalmente utilizando los meacutetodos que ofrece la clase String)3 Grabar la liacutenea modificada en el fichero destino4 Volver al paso 1

A continuacioacuten tienes algunos meacutetodos de la clase String que pueden resultar muyuacutetiles para procesar archivos de texto

bull charAt(int n) Devuelve el caraacutecter que estaacute en la posicioacuten n-eacutesima de la cadenaRecuerda que la primera posicioacuten es la nuacutemero 0

bull indexOf(String palabra) Devuelve un nuacutemero que indica la posicioacuten en la quecomienza una palabra determinada

bull length() Devuelve la longitud de la cadenabull replace(char c1 char c2) Devuelve una cadena en la que se han cambiado

todas las ocurrencias del caraacutecter c1 por el caraacutecter c2bull substring(int inicioint fin) Devuelve una subcadenabull toLowerCase() Convierte todas las letras en minuacutesculasbull toUpperCase() Convierte todas las letras en mayuacutesculas

Puedes consultar todos los meacutetodos de la clase String en la documentacioacuten oficial3A continuacioacuten tienes un ejemplo en el que se usan los meacutetodos descritos anterior-mente

Ejemplos de uso de String author Luis Joseacute Saacutenchez

public class EjemplosString

public static void main(String[] args)

Systemoutprintln(nEjemplo 1)

Systemoutprintln(En la posicioacuten 2 de berengena estaacute la letra

3httpdocsoraclecomjavase7docsapijavalangStringhtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 169

+ berengenacharAt(2))

Systemoutprintln(nEjemplo 2)

String frase = Hola caracola

char[] trozo = new char[10]trozo[0] = z trozo[1] = z trozo[2] = z

frasegetChars(2 7 trozo 1)

Systemoutprint(El array de caracteres vale )

Systemoutprintln(trozo)

Systemoutprintln(nEjemplo 3)

Systemoutprintln(La secuencia co aparece en la frase en la posicioacuten

+ fraseindexOf(co))

Systemoutprintln(nEjemplo 4)

Systemoutprintln(La palabra murcieacutelago tiene

+ murcieacutelagolength() + letras)

Systemoutprintln(nEjemplo 5)

String frase2 = frasereplace(o u)

Systemoutprintln(frase2)

Systemoutprintln(nEjemplo 6)

frase2 = frasesubstring(3 10)

Systemoutprintln(frase2)

Systemoutprintln(nEjemplo 7)

Systemoutprintln(frasetoLowerCase())

Systemoutprintln(nEjemplo 8)

Systemoutprintln(frasetoUpperCase())

A continuacioacuten se muestra un programa que procesa archivos de texto Lo que hacees cambiar cada tabulador por dos espacios en blanco Lo hice a propoacutesito cuandoestaba escribiendo este manual ya que el estaacutendar de Google para la codificacioacuten enJava4 especifica que la sangriacutea debe ser precisamente de dos espacios Teniacutea muchosprogramas escritos en Java (ejemplos y soluciones a ejercicios) que no cumpliacutean esterequisito porque la sangriacutea estaba aplicada con el caraacutecter de tabulacioacuten teniacutea dosposibilidades abrir todos y cada uno de los ficheros y cambiarlo a mano o escribir unprograma que lo hiciera Opteacute por la segunda opcioacuten y aquiacute tienes el programa iquestverdadque es muy sencillo

4httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 170

import javaioBufferedReaderimport javaioBufferedWriterimport javaioFileimport javaioFileReaderimport javaioFileWriterimport javaioIOException

Cambia los tabuladores por 2 espacios author Luis Joseacute Saacutenchez

public class EjemploProcesamiento10

public static void main(String[] args)

for (int i = 0 i lt argslength i++)

Systemoutprint(Procesando el archivo + args[i] + )

try

renombra el fichero antildeadiendo tmpFile ficheroOriginal = new File(args[i])

File ficheroTemporal = new File(args[i] + tmp)

ficheroOriginalrenameTo(ficheroTemporal)

lee los datos del archivo temporalBufferedReader bf = new BufferedReader(new FileReader(args[i] + tmp))

crea un fichero nuevo con el nombre originalBufferedWriter bw = new BufferedWriter(new FileWriter(args[i]))

String linea =

while ( linea = null )

linea = bfreadLine()

if (linea = null)

cambia el tabulador por 2 espacioslinea = lineareplace(t )

bwwrite(linea + n)

bfclose()

bwclose()

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 171

borra el fichero temporalficheroTemporaldelete()

catch (IOException ioe)

Systemoutprintln(Se ha producido un error de lecturaescritura)

Systemerrprintln(ioegetMessage())

Systemoutprintln(hecho)

118 Ejercicios

Ejercicio 1Escribe un programa que guarde en un fichero con nombre primosdat losnuacutemeros primos que hay entre 1 y 500

Ejercicio 2Realiza un programa que lea el fichero creado en el ejercicio anterior y quemuestre los nuacutemeros por pantalla

Ejercicio 3Escribe un programa que guarde en un fichero el contenido de otros dosficheros de tal forma que en el fichero resultante aparezcan las liacuteneas de losprimeros dos ficheros mezcladas es decir la primera liacutenea seraacute del primerfichero la segunda seraacute del segundo fichero la tercera seraacute la siguiente delprimer fichero etcLos nombres de los dos ficheros origen y el nombre del fichero destino se debenpasar como argumentos en la liacutenea de comandosHay que tener en cuenta que los ficheros de donde se van cogiendo las liacuteneaspueden tener tamantildeos diferentes

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 172

Ejercicio 4Realiza un programa que sea capaz de ordenar alfabeacuteticamente las palabrascontenidas en un fichero de texto El nombre del fichero que contiene laspalabras se debe pasar como argumento en la liacutenea de comandos El nombredel fichero resultado debe ser el mismo que el original antildeadiendo la coletillasort por ejemplo palabras_sorttxt Suponemos que cada palabra ocupa unaliacutenea

Ejercicio 5Escribe un programa capaz de quitar los comentarios de un programa de JavaSe utilizariacutea de la siguiente maneraquita_commentarios PROGRAMA_ORIGINAL PROGRAMA_LIMPIO

Por ejemploquita_comentarios holajava holav2java

crea un fichero con nombre holav2java que contiene el coacutedigo de holajava perosin los comentarios

Ejercicio 6Realiza un programa que diga cuaacutentas ocurrencias de una palabra hay en unfichero Tanto el nombre del fichero como la palabra se deben pasar comoargumentos en la liacutenea de comandos

12 Aplicaciones web en Java (JSP)Hasta el momento los programas realizados funcionan en una austera ventana determinal No se trata de algo casual hemos elegido esta manera de trabajar de formadeliberada para que el estudiante se centre en resolver el problema y no se distraigadaacutendole sombra a un botoacuten o escogiendo la mejor imagen de fondo para un listadoLlegamos no obstante a un punto en que algunos programas piden a gritos unaapariencia maacutes vistosaEn este capiacutetulo vamos a aprender coacutemo utilizar paacuteginas web como interfaz paraprogramas en Java Usaremos JSP (JavaServer Pages) que nos permitiraacute mezclar coacutedigoen Java con coacutedigo HTML El coacutedigo en Java que utilizaremos seraacute muy parecido alque hemos venido utilizando hasta ahora Cambiaraacute uacutenicamente lo relativo a mostrarinformacioacuten por pantalla (ahora se volcaraacute todo a HTML) y la manera en que seintroducen los datos que se realizaraacute mediante formularios

El lector deberaacute tener unos conocimientos baacutesicos de HTML para entender bieny sacar provecho de este capiacutetulo Una web excelente para aprender HTML esW3Schools1

El estaacutendar de programacioacuten de Google para el coacutedigo fuente escrito en Java2 noespecifica ninguna regla en cuanto a la manera de nombrar los ficheros correspon-dientes a las aplicaciones JSP Por tanto vamos a adoptar las convenciones de Oracle3

en esta materia Seguacuten estas convenciones los nombres de los ficheros JSP debenestar escritos en lowerCamelCase es decir la primera letra siempre es minuacutesculay en caso de utilizar varias palabras dentro del nombre eacutestas van seguidas unade otra empezando cada una por mayuacutescula Finalmente se antildeade la extensioacuten jspPor ejemplo listadoSociosjsp es un nombre correcto mientras que ListadoSociosjsplistado_sociosjsp o Listadosociosjsp son incorrectos

121 Hola Mundo en JSP

Para desarrollar aplicaciones en JSP utilizaremos el entorno de desarrollo NetbeansEste IDE se puede descargar de forma gratuita en httpsnetbeansorgdownloadsnota12_-14

Sigue estos pasos para crear una aplicacioacuten en JSP con Netbeans1httpw3schoolscom2httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml3httpwwworaclecomtechnetworkarticlesjavasecode-convention-138726html4ParamaacutesdetallessobrelainstalacioacutenyconfiguracioacutendeNetbeansverel[ApeacutendiceB](apendiceb)

173

Aplicaciones web en Java (JSP) 174

bull En el menuacute principal selecciona Archivo y a continuacioacuten Nuevo Proyecto Sepuede hacer maacutes raacutepido con la combinacioacuten Control + Mayuacutescula + N

bull Apareceraacute una ventana emergente para elegir el tipo de proyecto SeleccionaJava Web en el apartado ldquoCategoriacuteasrdquo y Aplicacioacuten Web en el apartadoldquoProyectosrdquo Haz clic en Siguiente

bull Ahora hay que darle el nombre al proyecto lo puedes llamar por ejemploSaludo1 Recuerda no utilizar caracteres especiales ni signos de puntuacioacuten Secrearaacute una carpeta con el mismo nombre que el proyecto que contendraacute todoslos ficheros necesarios Haz clic en Siguiente

bull En la siguiente ventana tendraacutes que elegir el servidor la versioacuten de Java y laruta Elige Glass Fish Server En caso de no haber ninguacuten servidor disponibleNetbeans permite antildeadir uno sobre la marcha (se lo descarga y lo instala) Hazclic en Finalizar

A la izquierda en la ventana de proyectos debe aparecer el que acabas de crearSaludo1 Navegando por la estructura del proyecto veraacutes que hay una carpeta connombre Web Pages en esta carpeta se deberaacuten guardar los archivos correspondien-tes a la aplicacioacuten archivos jsp html css imaacutegenes archivos de audio etc Para quelos archivos esteacuten ordenados se pueden organizar a su vez en subcarpetas dentrode Web PagesPor defecto cuando se crea un proyecto JSP se crea el archivo indexhtml Elimina estearchivo de tu proyecto y luego crea indexjsp haciendo clic con el botoacuten derecho enWeb Pages rarr Nuevo rarr JSP Al indicar el nombre no hay que poner la extensioacutenYa tienes un ldquoHola Mundordquo en ingleacutes Si lo quieres en espantildeol solo tienes que cambiarldquoHello Worldrdquo por ldquoHola Mundordquo con lo que la aplicacioacuten quedariacutea como sigue

lt-- saludo1jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Mundolth1gt

En esta paacutegina se usa uacutenicamente HTML

ltbodygt

lthtmlgt

Para ejecutar la aplicacioacuten hay que hacer clic en el botoacuten verde Ejecutar Proyecto opulsar F6 En ese momento Netbeans buscaraacute un fichero con el nombre indexjsp ylo lanzaraacute en el navegador

Aplicaciones web en Java (JSP) 175

Observa que el programa del ejemplo se llama saludo1jsp y no indexjsp En estecaso para ejecutar la aplicacioacuten hay que hacer clic con el botoacuten derecho encima desaludo1jsp y seleccionar EjecutarDe momento solo hemos visto coacutedigo HTML iquestdoacutende estaacute Java Bien vamos a verlopero antes hay entender bien coacutemo funciona JSPUna aplicacioacuten JSP consistiraacute en una o varias paacuteginas web que normalmente contendraacutecoacutedigo HTML y que llevaraacuten ldquoinsertadordquo coacutedigo en Java Este coacutedigo en Java puedecolocarse en cualquier parte del archivo y se delimita mediante las etiquetas lt y gtCuando se pulsa F6 para ejecutar la aplicacioacuten sucede lo siguiente

1 Todo el coacutedigo (tanto HTML como JAVA) se enviacutea al servidor (Glass Fish o ApacheTomcat por ejemplo)

2 El servidor deja intacto el coacutedigo HTML y compila y ejecuta el coacutedigo en JavaGeneralmente el coacutedigo Java genera coacutedigo HTML mediante las instruccionesoutprint y outprintln

3 Por uacuteltimo todo el coacutedigo (ya solo queda HTML) se enviacutea al navegador que es elque muestra la paacutegina Recuerda que el navegador no entiende Java (entiendeJavascript que es otro lenguaje diferente) y es imprescindible que todo el coacutedigoJava haya sido traducido previamente

122 Mezclando Java con HTML

A continuacioacuten se muestra un ejemplo que siacute tiene Java Como ves el coacutedigo Java estaacutedelimitado por los caracteres lt y gt

lt-- saludo2jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt outprintln(lth1gtiexclHola Mundolth1gt) gt

ltbodygt

lthtmlgt

Mediante Java se puede generar cualquier contenido HTML por ejemplo para modi-ficar estilos crear tablas mostrar imaacutegenes etc Trabajando en consola lo que seincluye en un print es exactamente lo que se muestra por pantalla Ahora con JSP loque se incluye dentro del print es ldquorenderizadordquo a posteriori por el navegador En elsiguiente ejemplo se puede ver claramente este comportamiento

Aplicaciones web en Java (JSP) 176

lt-- saludo3jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Caracolalth1gt

lt outprint(ltbgtltigt) gt

Esta liacutenea se ha puesto en negrita y cursiva mediante Java

lt outprint(ltigtltbgt) gt

ltbodygt

lthtmlgt

Es muy uacutetil ver el coacutedigo fuente que se ha generado una vez que se puede visualizarla aplicacioacuten en el navegador Para ver el coacutedigo fuente tanto en Firefox como enChrome hay que hacer clic con el botoacuten derecho en la paacutegina y seleccionar la opcioacutenldquoVer coacutedigo fuente de la paacuteginardquoCuando el contenido que se quiere volcar en HTML es el resultado de una expresioacutense pueden utilizar de forma opcional las etiquetas lt= y gt

lt-- saludo4jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Caracolalth1gt

lt= ltbgtltigt gt

Esta liacutenea se ha puesto en negrita y cursiva mediante Java

lt= ltigtltbgt gt

ltbodygt

lthtmlgt

En el coacutedigo Java que se inserta en las aplicaciones JSP se pueden utilizar todos loselemento del lenguaje vistos anteriormente bucles sentencias de control arraysdiccionarios etcEn el siguiente ejemplo se utiliza un bucle for para mostrar texto en diferentestamantildeos utilizando las etiquetas desde la lth6gt (cabecera pequentildea) hasta la lth1gt

(cabecera maacutes grande)

Aplicaciones web en Java (JSP) 177

lt-- pruebaVariable1 --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

for (int i = 1 i lt 7 i++)

outprintln(lth + (7-i) + gt+ i + lth + (7-i) + gt)

gt

ltbodygt

lthtmlgt

El coacutedigo en Java se puede insertar en cualquier parte dentro del coacutedigo HTML eincluso se pueden insertar varios trozos como se puede ver en el siguiente ejemploAunque una variable se haya definido en una determinada zona su aacutembito deactuacioacuten no se ve reducido a ese fragmento de coacutedigo sino que se puede utilizarposteriormente en otro lugar de la aplicacioacutenObserva que en el siguiente ejemplo la definicioacuten e inicializacioacuten de la variable x serealiza en un bloque de coacutedigo en Java y que luego esta variable se utiliza en otros dosbloques diferentes

lt-- pruebaVariable2 --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt int x = 3 gt

lthlt outprint(x) gtgtholalthlt outprint(x) gtgt

ltbodygt

lthtmlgt

En ocasiones puede ser uacutetil recabar informacioacuten del sistema versioacuten de Java en usosistema operativo nombre de usuario etc Estos datos se pueden obtener medianteSystemgetProperty(propiedad)

Aplicaciones web en Java (JSP) 178

lt-- muestraInfojsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtInformacioacuten del entorno de trabajolth1gt

lt

outprint(Fabricante de Java + SystemgetProperty(javavendor))

outprint(ltbrgtUrl del fabricante + SystemgetProperty(javavendorurl))

outprint(ltbrgtVersioacuten + SystemgetProperty(javaversion))

outprint(ltbrgtSistema operativo + SystemgetProperty(osname))

outprint(ltbrgtUsuario + SystemgetProperty(username))

gt

ltbodygt

lthtmlgt

Para mostrar informacioacuten en una paacutegina de forma ordenada es muy frecuente utilizartablas Las tablas son especialmente uacutetiles para mostrar listados obtenidos de unabase de datos como veremos en el siguiente capiacutetuloEn el siguiente ejemplo se muestra una tabla con dos columnas en la primera columnase muestran los nuacutemeros del 0 al 9 y en la segunda sus correspondientes cuadrados

lt-- tablajsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltbodygt

lth1gtEjemplo de tablalth1gt

lttable border=2gt

lttrgt

lttdgtNuacutemerolttdgtlttdgtCuadradolttdgt

lttrgt

lt

for(int i = 0 i lt 10 i++)

outprintln(lttrgt)

outprintln(lttdgt + i + lttdgt)

outprintln(lttdgt)

outprintln(i i)

outprintln(lttdgtlttrgt)

Aplicaciones web en Java (JSP) 179

gt

lttablegt

ltbodygt

lthtmlgt

123 Recogida de datos en JSP

En cualquier aplicacioacuten web la introduccioacuten de datos se realiza mediante formulariosAunque se puede hacer todo en la misma paacutegina de momento vamos a tener dos Laprimera paacutegina contendraacute un formulario y seraacute la encargada de recoger la informacioacuteny enviarla a una segunda paacutegina Esta uacuteltima paacutegina recibiraacute los datos realizaraacute unaserie de caacutelculos u operaciones si procede y por uacuteltimo mostraraacute un resultadoEn el primer ejemplo - un proyecto que llamaremos PasoDeCadena - tenemos una paacuteginacon nombre indexjsp que contiene un formulario HTML Este formulario contiene unaentrada de texto donde el usuario introduciraacute una cadena de caracteres Es muyimportante darle un valor a la etiqueta name En el caso que nos ocupa tenemosname=cadenaIntro por tanto el dato que recoge el formulario se llama de esa maneraseriacutea el equivalente al nombre de la variable en Java No menos importante es indicarla paacutegina que recibiraacute los datos que recoge el formulario Esta informacioacuten se indicacon la etiqueta action en nuestro ejemplo action=frasejsp indica que seraacute el ficherofrasejsp el que recibiraacute cadenaIntroEl fichero indexjsp uacutenicamente contiene coacutedigo HTML por tanto se podriacutea llamarindexhtml y la aplicacioacuten funcionariacutea exactamente igual

lt-- indexjsp (proyecto PasoDeCadena) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtPaso de cadenalttitlegt

ltheadgt

ltbodygt

lth1gtPasando una cadena de caractereslth1gt

ltform method=post action=frasejspgt

Introduzca el nombre de una fruta

ltinput type=text name=cadenaIntrogt

ltinput type=submit value=OKgt

ltformgt

ltbodygt

lthtmlgt

Para recoger los datos enviados por un formulario se utiliza requestgetParameter(nombreDeVariable)

donde nombreDeVariable es el dato que se enviacutea desde el formulario En caso de que el

Aplicaciones web en Java (JSP) 180

dato enviado sea un texto que pueda contener tildes o entildees hay que especificar lacodificacioacuten mediante requestsetCharacterEncoding(UTF-8) antes de recoger el dato

lt-- frasejsp (proyecto PasoDeCadena) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtPaso de cadenalttitlegt

ltheadgt

ltbodygt

lt requestsetCharacterEncoding(UTF-8) gt

Me gusta mucho comer

lt outprint(requestgetParameter(cadenaIntro))gt

ltbodygt

lthtmlgt

En el siguiente ejemplo llamado Incrementa5 se muestra coacutemo manipular en JSP un datonumeacuterico La aplicacioacuten recoge un nuacutemero y luego muestra ese nuacutemero incrementadoen 5 unidades

lt-- indexjsp (proyecto Incrementa5) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

ltform method=get action=incrementa5jspgt

Introduzca un nuacutemero (puede tener decimales)

ltinput type=text name=numeroIntrogt

ltinput type=submit value=OKgt

ltformgt

ltbodygt

lthtmlgt

Observa en el fichero incrementa5jsp coacutemo se transforma la cadena de caracteresque se recibe en numeroIntro en un dato numeacuterico con el meacutetodo DoubleparseDoubleexactamente igual que si estuvieacuteramos leyendo un nuacutemero desde teclado en laventana de terminal

Aplicaciones web en Java (JSP) 181

lt-- incrementa5jsp (proyecto Incrementa5) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

El nuacutemero introducido maacutes cinco es

lt

double resultado

resultado = DoubleparseDouble(requestgetParameter(numeroIntro)) + 5

outprint(resultado)

gt

ltbodygt

lthtmlgt

El siguiente ejemplo ilustra la recogida y enviacuteo de dos variables x e y Observa queahora el formulario contiene dos entradas de texto una para cada variable

lt-- indexjsp (proyecto Suma) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtSumalttitlegt

ltheadgt

ltbodygt

lth1gtSupercalculadoralth1gt

ltform method=get action=resultadojspgt

x ltinput type=text name=xgtltbrgt

y ltinput type=text name=ygtltbrgt

ltinput type=submitgt

ltformgt

ltbodygt

lthtmlgt

En el fichero resultadojsp se reciben las variables recogidas en indexjsp y se sumanRecuerda que por defecto la informacioacuten enviada por un formulario es una cadenade caracteres Si queremos sumar los valores introducidos debemos transformar lascadenas de caracteres a nuacutemeros enteros con el meacutetodo IntegervalueOf()

Aplicaciones web en Java (JSP) 182

lt-- resultadojsp (proyecto Suma) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtSumalttitlegt

ltheadgt

ltbodygt

La suma es

lt

int primerNumero = IntegervalueOf(requestgetParameter(x))

int segundoNumero = IntegervalueOf(requestgetParameter(y))

outprintln(primerNumero + segundoNumero)

gt

ltbodygt

lthtmlgt

El siguiente proyecto de ejemplo es Animales En la paacutegina principal (indexjsp) se puedeseleccionar un animal - gato o caracol - y un nuacutemero Una vez introducidos los datoseacutestos se enviacutean a animalesjsp

lt-- indexjsp (proyecto Animales) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtAnimaleslttitlegt

ltheadgt

ltbodygt

ltform method=post action=animalesjspgt

Seleccione animal a visualizar

ltselect name=animalgt

ltoptiongtGatoltoptiongt

ltoptiongtCaracolltoptiongt

ltselectgt

ltbrgt

Nuacutemero de animales ltinput type=text name=numero size=3gt

ltbrgt

ltinput type=submitgt

ltformgt

ltbodygt

lthtmlgt

Aplicaciones web en Java (JSP) 183

La paacutegina animalesjsp nos mostraraacute una imagen del animal elegido repetida el nuacutemerode veces que hemos indicado

lt-- animalesjsp (proyecto Animales) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtAnimaleslttitlegt

ltheadgt

ltbodygt

lt

String nombreAnimal = requestgetParameter(animal)

String nombreImagen

if (nombreAnimalequals(Gato))

nombreImagen = gatojpg

else

nombreImagen = caracoljpg

int veces = IntegerparseInt(requestgetParameter(numero))

for (int i = 0 i lt veces i++)

outprint(ltimg src= + nombreImagen + width=20gt)

gt

ltbodygt

lthtmlgt

124 POO en JSP

En las aplicaciones realizadas en JSP se puenden incluir clases definidas por el usuariopara posteriormente crear objetos de esas clases Lo habitual es que el fichero quecontiene la definicioacuten de la clase se encuentre separado del programa principalEn un nuevo proyecto con nombre GatosConClase vamos a crear la clase Gato paraello haz clic derecho sobre el icono del proyecto selecciona Nuevo y luego seleccionaClase de Java El nombre de la clase seraacute Gato y el nombre del paquete seraacute porejemplo daw1El fichero Gatojava quedariacutea como el que se muestra a continuacioacuten

Aplicaciones web en Java (JSP) 184

Gatojava (proyecto GatosConClase)

package daw1

public class Gato

private String nombre

private String imagen

public Gato(String nombre String imagen)

thisnombre = nombre

thisimagen = imagen

public String getNombre()

return nombre

public String getImagen()

return imagen

Override

public String toString()

return ltimg src= + imagen + width=80gtHola soy + nombre + ltbrgt

public String maulla()

return ltimg src= + imagen + width=80gtMiauuuuuuuultbrgt

public String come(String comida)

return ltimg src= + imagen + width=80gtEstoy comiendo + comida + ltbrgt

Hemos creado una clase Gato muy sencilla que uacutenicamente contiene dos atributosel nombre del gato y el nombre del fichero de su foto Como meacutetodos se hanimplementado toString() maulla() y come()

Aplicaciones web en Java (JSP) 185

lt-- indexjsp (proyecto GatosConClase) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltpage import=daw1Gatogt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtGatos con claselttitlegt

ltheadgt

ltbodygt

lth1gtGatos con claselth1gt

lthrgt

lt

Gato g1 = new Gato(Pepe gatojpg)

Gato g2 = new Gato(Garfield garfieldjpg)

Gato g3 = new Gato(Tom tompng)

outprintln(g1)

outprintln(g2)

outprintln(g3)

outprintln(g1maulla())

outprintln(g2come(sardinas))

gt

ltbodygt

lthtmlgt

El coacutedigo Java del programa principal es casi ideacutentico al que tendriacuteamos en unprograma para consolaEl siguiente ejemplo - GatosConClaseYBocadillos - es una mejora del anterior Seantildeaden estilos5 para mostrar lo que dicen los gatos igual que en un coacutemic

Gatojava (proyecto GatosConClaseYBocadillos)

package daw1

public class Gato

private String nombre

private String imagen

public Gato(String nombre String imagen)

thisnombre = nombre

thisimagen = imagen

5httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos12_JSPGatosConClaseYBocadillosestiloscss

Aplicaciones web en Java (JSP) 186

public String getNombre()

return nombre

public String getImagen()

return imagen

Override

public String toString()

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspHola soy + nombre + ampnbspltdivgtltdivgt

public String maulla()

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspMiauuuuuuuuampnbspltdivgtltdivgt

public String come(String comida)

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspEstoy comiendo + comida + ampnbspltdivgtltdivgt

El uacutenico antildeadido al programa principal es una liacutenea situada en la cabecera de la paacuteginaque carga la hoja de estilos estiloscss

lt-- indexjsp (proyecto GatosConClaseYBocadillos) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltpage import=daw1Gatogt

ltDOCTYPE htmlgtlthtmlgt

ltheadgtltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gtlttitlegtGatos con clase y bocadilloslttitlegt

ltlink rel=stylesheet type=textcss href=estiloscss gtltheadgtltbodygtlth1gtGatos con claselth1gtlthrgtlt

Gato g1 = new Gato(Pepe gatojpg)

Aplicaciones web en Java (JSP) 187

Gato g2 = new Gato(Garfield garfieldjpg)

Gato g3 = new Gato(Tom tompng)

outprintln(g1)

outprintln(g2)

outprintln(g3)

outprintln(g1maulla())

outprintln(g2come(sardinas))

gt

ltbodygtlthtmlgt

Aplicaciones web en Java (JSP) 188

125 Ejercicios

Ejercicio 1Crea una aplicacioacuten web en Java que muestre tu nombre y tus datos personalespor pantalla La paacutegina principal debe ser un archivo con la extensioacuten jspComprueba que se lanzan bien el servidor y el navegador web Observa losmensajes que da el servidor Fiacutejate en la direccioacuten que aparece en la barra dedirecciones del navegador

Ejercicio 2Mejora el programa anterior de tal forma que la apariencia de la paacuteginaweb que muestra el navegador luzca maacutes bonita mediante la utilizacioacuten deCSS (utiliza siempre ficheros independientes para CSS para no mezclarlo conHTML)

Ejercicio 3Escribe una aplicacioacuten que pida tu nombre A continuacioacuten mostraraacute ldquoHolardquoseguido del nombre introducido El nombre se deberaacute recoger mediante unformulario

Ejercicio 4Realiza una aplicacioacuten que calcule la media de tres notas

Ejercicio 5Realiza un conversor de euros a pesetas

Ejercicio 6Realiza un conversor de pesetas a euros

Ejercicio 7Combina las dos aplicaciones anteriores en una sola de tal forma que en lapaacutegina principal se pueda elegir pasar de euros a pesetas o de pesetas a eurosAdorna la paacutegina con alguna foto o dibujo

Aplicaciones web en Java (JSP) 189

Ejercicio 8Realiza una aplicacioacuten que pida un nuacutemero y que luego muestre la tabla demultiplicar de ese nuacutemero El resultado se debe mostrar en una tabla (lttablegten HTML)

Ejercicio 9Realiza una aplicacioacuten que pinte una piraacutemide La altura se pediraacute en unformulario La piraacutemide estaraacute hecha de bolitas ladrillos o cualquier otraimagen

Ejercicio 10Realiza un cuestionario con 10 preguntas tipo test sobre las asignaturasque se imparten en el curso Cada pregunta acertada sumaraacute un punto Elprograma mostraraacute al final la calificacioacuten obtenida Paacutesale el cuestionario a tuscompantildeeros y piacutedeles que lo hagan para ver queacute tal andan de conocimientosen las diferentes asignaturas del curso Utiliza radio buttons en las preguntasdel cuestionario

Ejercicio 11Escribe una aplicacioacuten que genere el calendario de un mes Se pediraacute elnombre del mes el antildeo el texto que queremos que aparezca sobre elcalendario el diacutea de la semana en que cae el diacutea 1 y el nuacutemero de diacuteas quetiene el mes

Ejercicio 12Mejora la aplicacioacuten anterior de tal forma que no haga falta introducir el diacuteade la semana en que cae el diacutea 1 y el nuacutemero de diacuteas que tiene el mes Elprograma debe deducir estos datos del mes y el antildeo Pista puedes usar laclase Calendar (javautilCalendar)

Ejercicio 13Transforma el test de infidelidad realizado anteriormente para consola en unaaplicacioacuten web

Aplicaciones web en Java (JSP) 190

Ejercicio 14Escribe un programa que muestre los n primeros teacuterminos de la serie deFibonacci El primer teacutermino de la serie de Fibonacci es 0 el segundo es 1y el resto se calcula sumando los dos anteriores por lo que tendriacuteamos quelos teacuterminos son 0 1 1 2 3 5 8 13 21 34 55 89 144hellip El nuacutemero n sedebe introducir por teclado

Ejercicio 15Realiza una aplicacioacuten que genere 100 nuacutemeros aleatorios del 1 al 200 Losprimos deberaacuten aparecer en un color diferente al resto

Ejercicio 16Realiza una aplicacioacuten que muestre la tirada aleatoria de tres dados de poacutekerUtiliza imaacutegenes de dados reales

Ejercicio 17Realiza un configurador del interior de un vehiacuteculo El usuario puede elegirmediante un formulario el color de la tapiceriacutea ndash blanco negro o berengena -y el material de las molduras ndash madera o carbono Se debe mostrar el interiordel coche tal y como lo quiere el usuario

Ejercicio 18Crea la aplicacioacuten ldquoEl Trilerdquo Deben aparecer tres cubiletes por pantalla y elusuario deberaacute seleccionar uno de ellos Para dicha seleccioacuten se puede usar unformulario con radio-button una lista desplegable hacer clic en el cubilete o loque resulte maacutes faacutecil Se levantaraacuten los tres cubiletes y se veraacute si estaba o nola bolita dentro del que el usuario indicoacute asiacute mismo se mostraraacute un mensajediciendo ldquoLo siento no has acertadordquo o ldquoiexclEnhorabuena has encontrado labolitardquo La probabilidad de encontrar la bolita es de 13

Ejercicio 19Crea el juego ldquoApuesta y ganardquo El usuario debe introducir inicialmente unacantidad de dinero A continuacioacuten apareceraacute por pantalla una imagen deforma aleatoria Si sale una calavera el usuario pierde todo su dinero y terminael juego Si sale medio limoacuten el usuario pierde la mitad del dinero y puedeseguir jugando con esa cantidad o puede dejar de jugar Si sale el gato chinode la suerte el usuario multiplica por dos su dinero y puede seguir jugandocon esa cantidad o puede dejar de jugar

Aplicaciones web en Java (JSP) 191

Ejercicio 20Crea una aplicacioacuten que dibuje un tablero de ajedrez mediante una tabla HTMLgenerada con bucles usando JSP y que situacutee dentro del tablero un alfil y uncaballo en posiciones aleatorias Las dos figuras no pueden estar colocadas enla misma casilla Las filas y las columnas del tablero deben estar etiquetadascorrectamente

13 Acceso a bases de datosEn el capiacutetulo 11 vimos coacutemo almacenar informacion en ficheros de texto de tal formaque esta informacioacuten no se pierde cuando el programa se cierra Normalmente losficheros de texto se usan en casos concretos como archivos de configuracioacuten o archivosde registro (log)Las bases de datos relacionales entran en juego cuando se necesita almacenar muchainformacioacuten y ademaacutes esta informacioacuten es homogeacutenea y se puede representarmediante tablas Por ejemplo una aplicacioacuten que permita gestionar la matriculacioacutende los alumnos de un centro educativo deberaacute ser capaz de almacenar los datos degran cantidad de alumnos (puede que miles) En este caso concreto cada alumno serepresenta mediante un registro que contiene determinados datos como el nuacutemerode expediente el nombre los apellidos la nota media etc A estos datos se les llamacamposEn este capiacutetulo vamos a ver coacutemo se puede acceder mediante Java a una basede datos relacional MySQL para hacer listados insertar nuevos elementos y borrarelementos existentesLos programas de ejemplo que se muestran en este capiacutetulo son aplicaciones JSPaprovechando lo visto en el capiacutetulo anterior aunque tambieacuten se puede acceder auna base de datos desde un programa en Java escrito para la consola

131 Socios de un club de baloncesto

Para ilustrar el acceso a una base de datos mediante Java vamos a utilizar comoejemplo un club de baloncesto Nuestro club necesita tener almacenada la informacioacutende todos los socios Sobre cada socio se necesita saber su nombre completo suestatura su edad y su localidad de residencia Cada socio tendraacute ademaacutes un nuacutemerode identificacioacuten uacutenico que seraacute el nuacutemero de socioNuestra aplicacioacuten consistiraacute en varias paacuteginas JSP que van a permitir ver un listadocon los datos de todos los socios dar de alta un nuevo miembro en el club y tambieacutenborrar o modificar los datos de un determinado socioSi todaviacutea no tienes instalado en tu equipo el gestor de bases de datosMySQL deberaacutesinstalarlo Tambieacuten es recomendable instalar PHPMyAdmin que es una aplicacioacuten quepermite crear y manejar bases de datos MySQL de una forma muy sencilla medianteuna interfaz web

192

Acceso a bases de datos 193

Instalacioacuten de MySQL

sudo apt-get install mysql-server

sudo apt-get install mysql-client

Para el usuario root de MySQL deberaacutes establecer la contrasentildea root para quete funcionen correctamente los ejemplos

Instalacioacuten de PHPMyAdmin

sudo apt-get install phpmyadmin

Para acceder a PHPMyAdmin debes escribir httplocalhostphpmyadmin en labarra de direcciones del navegador

Deberaacutes crear la base de datos MySQL a la que llamaraacutes baloncesto que contendraacuteuna tabla de nombre socio con los campos socioID nombre estatura edad y localidad yluego deberaacutes antildeadir los datos de los socios Todo esto lo tienes ya preparado en unfichero con nombre baloncestosql que estaacute en GitHub en la direccioacuten httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDbaloncestosql Descaacutergate este fichero lo utilizaremos en seguidaA continuacioacuten mostramos un fragmento del fichero baloncestosql para que veas coacutemose crea la base de datos la tabla socio y coacutemo se introducen los datos de muestra

---- Base de datos `baloncesto`--CREATE DATABASE IF NOT EXISTS `baloncesto` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

USE `baloncesto`

-- --------------------------------------------------------

---- Estructura de tabla para la tabla `socio`--

CREATE TABLE IF NOT EXISTS `socio` (

`socioID` int(11) NOT NULL`nombre` varchar(40) COLLATE utf8_spanish2_ci DEFAULT NULL`estatura` int(11) DEFAULT NULL`edad` int(11) DEFAULT NULL`localidad` varchar(30) COLLATE utf8_spanish2_ci DEFAULT NULLPRIMARY KEY (`socioID`)

Acceso a bases de datos 194

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci

---- Volcado de datos para la tabla `socio`--

INSERT INTO `socio` (`socioID` `nombre` `estatura` `edad` `localidad`) VALUES(1235 Bermuacutedez Espada Ana Mariacutea 186 46 Maacutelaga)

(1236 Cano Cuenca Margarita 161 48 Maacutelaga)

En dos sencillos pasos tendraacutes preparada y lista para usar la base de datos de ejemploPara acceder a PHPMyAdmin debes escribir httplocalhostphpmyadmin en la barrade direcciones de tu navegador A continuacioacuten teclea el nombre de usuario y lacontrasentildea Si has instalado MySQL como te hemos indicado tanto el nombre deusuario como la contrasentildea deberiacutean ser root

A continuacioacuten haz clic en la pestantildea Importar y seguidamente en el botoacuten Exami-nar Selecciona el fichero baloncestosql que descargaste antes

Acceso a bases de datos 195

Si has seguido correctamente los pasos ya tienes la base de datos lista para usardesde un programa escrito en Java

132 Preparacioacuten del proyecto de ejemplo

1321 Activar la conexioacuten a MySQL

Abre el entorno Netbeans y crea un nuevo proyecto del tipo Java Web - como vimosen el capiacutetulo 12 - y noacutembralo BaloncestoAhora es necesario activar el servicio de bases de datos Haz clic en la pestantildeaServicios (estaacute junto a la pestantildea Proyectos) Haz clic con el botoacuten derecho enBasesde datos y luego selecciona Nueva conexioacuten A continuacioacuten aparece una ventanapara seleccionar el driver debes seleccionar MySQL (ConnectorJdriver)

Acceso a bases de datos 196

Una vez se haya establecido el servicio veraacutes las bases de datos disponibles en unaestructura de aacuterbol Puedes ir desplegando hasta encontrar la base de datos baloncesto

y la tabla socio que contiene los campos socioID nombre estatura edad y localidad

Una vez activada la conexioacuten a MySQL no es necesario realizarla de nuevo para cada

Acceso a bases de datos 197

proyecto

1322 Incluir la libreriacutea MySQL JDBC

Cada proyecto de aplicacioacuten en Java que haga uso de una base de datos MySQLdeberaacute incluir la libreriacutea MySQL JDBC Para incluir esta libreriacutea despliega el proyectoBaloncesto haz clic con el botoacuten derecho en Libreriacuteas selecciona Antildeadir libreriacuteay por uacuteltimo selecciona MySQL JDBC Driver

133 Listado de socios

El primer ejemplo de acceso a una base de datos mediante Java que veremos seraacute unlistado Si echas un vistazo desde PHPMyAdmin a la tabla socio de la base de datosbaloncesto veraacutes que ya contiene informacioacuten sobre maacutes de 20 socios Nuestro primerejemplo seraacute una aplicacioacuten en Java que mueste todos esos datos en una paacuteginaweb Copia el archivo listadoSociosjsp1 a la carpeta principal del proyecto (donde estaacuteindexhtml) Para ejecutarlo haz clic con el botoacuten derecho y selecciona EjecutarA continuacioacuten tienes el coacutedigo JSP del listado de socios

1httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDBaloncestolistadoSociosjsp

Acceso a bases de datos 198

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtListado Socioslttitlegt

ltheadgt

ltbodygt

lth1gtListado de Socioslth1gt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balonce

storoot root)

Statement s = conexioncreateStatement()

ResultSet listado = sexecuteQuery (SELECT FROM socio)

while (listadonext())

outprintln(listadogetString(socioID) + + listadogetString(nombre) + ltbrgt

)

conexionclose()

gt

ltbodygt

lthtmlgt

Si todo ha salido bien al ejecutar el archivo - haciendo clic con el botoacuten derecho sobreel archivo y seleccionando Ejecutar - veraacutes por pantalla un listado como el siguientecon el nuacutemero y el nombre de cada socio

Acceso a bases de datos 199

Vamos a ldquodiseccionarrdquo el coacutedigo Las siguientes tres liacuteneas son obligatorias y deberaacutescopiarlas en todas las paacuteginas JSP que accedan a una base de datos Lo uacutenico quetendraacutes que cambiar es el nombre de la base de datos - la de nuestro ejemplo sellama baloncesto - seguacuten el caso

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306baloncesto

root root)

Statement s = conexioncreateStatement()

La siguiente liacutenea ejecuta la consulta

SELECT FROM socio

sobre la base de datos y guarda el resultado en el objeto listado Esta consulta extraetodos los datos () de la tabla socio Si quisieacuteramos obtener esos datos ordenados pornombre la consulta seriacutea

SELECT FROM socio ORDER BY nombre

Aquiacute estaacute la liacutenea en cuestioacuten

Acceso a bases de datos 200

ResultSet listado = sexecuteQuery (SELECT FROM socio)

Una vez extraiacutedos los datos en bruto hace falta ir sacando cada uno de los registroses decir cada una de las liacuteneas En cada liacutenea se van a mostrar los datos de un socioPara ello usamos un while que va extrayendo liacuteneas mientras quede alguna en el objetolistado

while (listadonext())

outprintln(listadogetString(socioID) + + listadogetString(nombre) + ltbrgt)

Observa que el meacutetodo getString toma como paraacutemetro el nombre de un campoEn este ejemplo estamos mostrando uacutenicamente los nuacutemeros de socio con suscorrespondientes nombres Si quisieacuteramos mostrar tambieacuten la altura de cada sociola podemos extraer mediante listadogetString(altura)

134 Alta

Para dar de alta un nuevo socio necesitamos recoger los datos mediante un formularioque puede ser un programa JSP o simplemente una paacutegina HTML Estos datos recogidospor el formulario seraacuten enviados a otra paacutegina encargada de grabarlos en la tabla socio

de la base de datos baloncesto mediante el comando INSERT de SQLA continuacioacuten se muestra el coacutedigo de formularioSociojsp que recoge los datos delnuevo socio Como puedes comprobar es un simple formulario HTML y no contienecoacutedigo en Java

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgtlthtmlgtltheadgtltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgtltbodygtlth2gtIntroduzca los datos del nuevo sociolth2gtltform method=get action=grabaSociojspgtNordm socio ltinput type=text name=numerogtltbrgtNombre ltinput type=text name=nombregtltbrgtEstatura ltinput type=text name=estaturagtltbrgtEdad ltinput type=text name=edadgtltbrgtLocalidad ltinput type=text name=localidadgtltbrgtltinput type=submit value=Aceptargt

ltformgtltbodygt

lthtmlgt

Acceso a bases de datos 201

El siguiente programa - grabaSociojsp - se encarga de tomar los datos que enviacuteaformularioSociojsp y grabarlos en la base de datosIgual que en los programas del capiacutetulo 12 incluimos esta liacutenea para poder recogercorrectamente cadenas de caracteres que contienen tildes la letra ntilde etc

requestsetCharacterEncoding(UTF-8)

La variable insercion es una cadena de caracteres en la que se va componiendo a basede ir juntando trozos la sentencia SQL correspondiente a la insercioacuten

String insercion = INSERT INTO socio VALUES (

+ IntegervalueOf(requestgetParameter(numero))

+ + requestgetParameter(nombre)

+ + IntegervalueOf(requestgetParameter(estatura))

+ + IntegervalueOf(requestgetParameter(edad))

+ + requestgetParameter(localidad) + )

Una vez que se han recogido los datos del formulario y se ha creado la cadena en lavariable insercion deberiacutea quedar algo como esto

INSERT INTO socio VALUES (6789 Brito Fino Alan 180 40 Benalmaacutedena)

Por uacuteltimo se ejecuta la sentencia de insercioacuten mediante sexecute(insercion)A continuacioacuten tienes el coacutedigo completo de grabaSociojsp

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

requestsetCharacterEncoding(UTF-8)

Acceso a bases de datos 202

String insercion = INSERT INTO socio VALUES (

+ IntegervalueOf(requestgetParameter(numero))

+ + requestgetParameter(nombre)

+ + IntegervalueOf(requestgetParameter(estatura))

+ + IntegervalueOf(requestgetParameter(edad))

+ + requestgetParameter(localidad) + )

sexecute(insercion)

conexionclose()

gt

Socio dado de alta

ltbodygt

lthtmlgt

Al componer una sentencia SQL concatenando trozos es frecuente que seproduzcan errores porque faltan o sobran comillas pareacutentesis comas etc Sise produce un error al ejecutar la sentencia la manera maacutes faacutecil de detectarloes mostrar por pantalla la sentencia Por ejemplo si la sentencia es unainsercioacuten de datos y la cadena de caracteres que la contiene se llama insercioncomo en el ejemplo que acabamos de ver simplemente tendriacuteamos queescribir outprintln(insercion)

135 Borrado

El borrado al igual que el alta se realiza en dos pasos En el primer paso se carga lapaacutegina pideNumeroSociojsp que muestra en una tabla todos los socios cada uno en unafila Junto a cada socio se coloca un botoacuten borrar que al ser pulsado enviacutea el nuacutemerode socio a la paacutegina borraSociojsp que se encarga de ejecutar la sentencia SQL deborradoLa tabla con los socios y los botones de borrado quedariacutea como se muestra acontinuacioacuten

Acceso a bases de datos 203

A continucacioacuten se muestra el coacutedigo de pideNumeroSociojsp El fichero estiloscss2 seencuentra disponible en GitHub igual que el resto de archivos

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltlink rel=stylesheet type=textcss href=estiloscss gt

ltheadgt

ltbodygt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

2httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDBaloncestoestiloscss

Acceso a bases de datos 204

ResultSet listado = sexecuteQuery (SELECT FROM socio)

gt

lttablegt

lttrgtltthgtCoacutedigoltthgtltthgtNombreltthgtltthgtEstaturaltthgtltthgtEdadltthgtltthgtLocalidadltthgtlt

trgt

lt

while (listadonext())

outprintln(lttrgtlttdgt)

outprintln(listadogetString(socioID) + lttdgt)

outprintln(lttdgt + listadogetString(nombre) + lttdgt)

outprintln(lttdgt + listadogetString(estatura) + lttdgt)

outprintln(lttdgt + listadogetString(edad) + lttdgt)

outprintln(lttdgt + listadogetString(localidad) + lttdgt)

gt

lttdgt

ltform method=get action=borraSociojspgt

ltinput type=hidden name=codigo value=lt=listadogetString(socioID) gtgt

ltinput type=submit value=borrargt

ltformgt

lttdgtlttrgt

lt

whileconexionclose()

gt

lttablegt

ltbodygt

lthtmlgt

A continuacioacuten se muestra el coacutedigo de borraSociojsp Como puedes comprobar lasentencia SQL que borra el registro deseado es un DELETE que toma como referencia elnuacutemero de socio para realizar el borrado

ltpage import=javasqlResultSetgt

ltpage import=javasqlStatementgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

Acceso a bases de datos 205

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

sexecute (DELETE FROM socio WHERE socioID= + requestgetParameter(codigo))

gt

ltscriptgtdocumentlocation = pideNumeroSociojspltscriptgt

ltbodygt

lthtmlgt

136 CRUD completo con Bootstrap

Los programas que ofrecen la posibilidad de hacer listados y de realizar modificacionesy borrado sobre los registros de una tabla se denominan CRUD que son las siglas eningleacutes de Create Read Update y Delete en espantildeol se diriacutea que es un programa dealta listado modificacioacuten y borrado El coacutedigo fuente completo estaacute disponible en lacarpeta BaloncestoMejorado de nuestro repositorio en GitHub3

Para dar de alta un nuevo socio simplemente habriacutea que rellenar los campos delformulario que aparecen en la primera liacutenea y hacer clic en el botoacuten Antildeadir Laaplicacioacuten comprueba si el nuacutemero de socio introducido ya existe en la base de datosy en tal caso muestra un mensaje de error recuerda que el nuacutemero de socio es uacutenico

3httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciostreemasterejemplos13_JSP_y_BBDDBaloncestoMejorado

Acceso a bases de datos 206

El borrado se lleva a cabo de la misma manera que en el ejemplo del apartado anteriorEl botoacuten Modificar nos lleva a otra paacutegina que contiene un formulario con todos losdatos del socio donde podemos modificar la informacioacuten necesaria A continuacioacuten semuestra una captura

Para los estilos - colores botones iconos etc - hemos utilizado Boostrap4 Boostrapes un framework que incluye unos estilos predefinidos para que con solo incluirloen nuestro proyecto la aplicacioacuten tenga una apariencia bonita y homogeacutenea Puedesencontrar maacutes informacioacuten de coacutemo utilizar este framework en la paacutegina oficial deBoostrap5

4httpgetbootstrapcom5httpgetbootstrapcom

Acceso a bases de datos 207

137 Ejercicios

Ejercicio 1Establece un control de acceso mediante nombre de usuario y contrasentildeapara alguno de los programas de la relacioacuten anterior (por ejemplo el quepinta una piraacutemide) Lo primero que apareceraacute por pantalla seraacute un formulariopidiendo el nombre de usuario y la contrasentildea Si el usuario y la contrasentildea soncorrectos se podraacute acceder al ejercicio en caso contrario volveraacute a aparecerel formulario pidiendo los datos de acceso y no se nos dejaraacute ejecutar laaplicacioacuten hasta que iniciemos sesioacuten con un nombre de usuario y contrasentildeacorrectos Los nombres de usuario y contrasentildeas deben estar almacenados enla tabla de una base de datos

Acceso a bases de datos 208

Ejercicio 2Mejora el programa anterior de tal forma que se puedan dar de alta nuevosusuarios para acceder a la aplicacioacuten Si se introduce un nombre de usuarioque no sea el administrador (admin) y una contrasentildea correcta la aplicacioacutenfuncionaraacute exactamente igual que el ejercicio anterior Si se introduce elusuario admin y la contrasentildea correcta la aplicacioacuten entra en la gestioacuten deusuarios donde se podraacuten dar de alta nuevos usuarios indicando nombre deusuario y contrasentildea No puede haber dos nombres de usuario iguales aunquesiacute puede haber claves repetidas

Acceso a bases de datos 209

Ejercicio 3Ampliacutea el programa anterior para que se pueda asignar o quitar permiso paraejecutar las aplicaciones de la relacioacuten anterior a los distintos usuarios Porejemplo que se pueda especificar que el usuario ldquojaimitordquo pueda ejecutar losejercicios 2 3 y 5 Para ello en la base de datos deberaacute existir una tabla con lasparejas (usuario nordm ejercicio) Por ejemplo si el usuario ldquojaimitordquo tiene accesoa los ejercicios 2 3 y 5 en la tabla correspondiente estaraacuten las parejas (jaimito2) (jaimito 3) y (jaimito 5) Lo ideal es que la asignacioacuten de permisos se hagamediante el marcado de muacuteltiples ldquocheckboxrdquo

Acceso a bases de datos 210

Ejercicio 4Crea una aplicacioacuten web que permita hacer listado alta baja y modificacioacutensobre la tabla cliente de la base de datos banco Un cliente tiene su identifica-dor nombre completo direccioacuten teleacutefono y fecha de nacimiento

Acceso a bases de datos 211

Ejercicio 5Ampliacutea el programa anterior para que se pueda hacer una buacutesqueda por nom-bre El programa buscaraacute la cadena introducida dentro del campo ldquonombrerdquoy si hay varias coincidencias se mostraraacute una lista de clientes para poderseleccionar uno de ellos y ver todos los datos Si solo hay una coincidencia semostraraacuten directamente los datos del cliente en cuestioacuten

Acceso a bases de datos 212

Ejercicio 6Crea una versioacuten web del programa GESTISIMAL (GESTIoacuten SIMplifcada deAlmaceacuten) para llevar el control de los artiacuteculos de un almaceacuten De cada artiacuteculose debe saber el coacutedigo la descripcioacuten el precio de compra el precio de ventay el stock (nuacutemero de unidades) La entrada y salida de mercanciacutea suponerespectivamente el incremento y decremento de stock de un determinadoartiacuteculo Hay que controlar que no se pueda sacar maacutes mercanciacutea de la que hayen el almaceacuten Aprovecha las opciones que puede ofrecer una interfaz webpor ejemplo para eliminar un artiacuteculo ya no seraacute necesario pedir el coacutedigo sinoque se puede mostrar un listado de todos los artiacuteculos de tal forma que sepuedan borrar un artiacuteculo directamente pulsando un botoacuten

213

Apeacutendice A Ejercicios de ampliacioacuten 214

Apeacutendice A Ejercicios de ampliacioacuten

Ejercicio 1 Transcomunicacioacuten instrumental mediante ficherosde texto digitalesSe conoce la transcomunicacioacuten instrumental (TCI) como la teacutecnica decomunicacioacuten que utiliza aparatos electroacutenicos para establecer comunicacioacutencon los espiacuteritus El caso de TCI maacutes conocido es el de la psicofoniacuteaPara realizar una psicofoniacutea se pone a grabar al aire un dispositivo en unlugar donde previamente hayan ocurrido fenoacutemenos extrantildeos o simplementese invoca la entidad que queremos que se comunique mediante el ritualadecuado Posteriormente se escucha la grabacioacuten para comprobar si se hagrabado algo un mensaje una palabra un grito un lamentohellipLos sonidos extrantildeos se graban gracias a lo que se llama en teacuterminosparapsicoloacutegicos una sentildeal portadora puede ser el chasquido de una ramauna racha de viento un golpe La entidad comunicante aprovecha ese sonidopara supuestamente moldearlo y convertirlo en un mensaje inteligible Muchasde las psicofoniacuteas se realizan utilizando como portadora el ruido que produceuna radio que no estaacute sintonizadaEl ejercicio que se propone es la realizacioacuten de un programa que permitarealizar la TCI mediante la creacioacuten y el posterior anaacutelisis de ficherosde textoEn primer lugar el programa deberaacute generar la portadora que seraacute un ficherode texto creado con caracteres producidos de forma aleatoria Se podraacutenespecificar varios paraacutemetros como el nuacutemero de liacuteneas o paacuteginas que sequieren generar si se incluyen letras uacutenicamente o bien letras y nuacutemerosfrecuencia aproximada de espacios saltos de liacutenea y signos de puntuacioacutenetc Se obtienen portadoras de calidad - con maacutes probabilidad de contenermensajes - cuando la proporcioacuten de las letras que contienen eacutestas coincidecon las del idioma espantildeolFrecuencia de aparicioacuten de letrashttpeswikipediaorgwikiFrecuencia_de_apariciC3B3n_de_letras

Una vez creado el fichero de texto el programa deberaacute ser capaz de analizarloal menos de una forma superficial de modo que nos resulte faacutecil encontrar losposibles mensajes Para realizar este anaacutelisis el programa iraacute comparandouna a una todas las palabras que aparecen en el texto con las que hay enel diccionario de espantildeol En caso de coincidencia la palabra o palabrasencontradas deben aparecer resaltadas con un color diferente al resto deltexto o bien en viacutedeo inverso Opcionalmente se pueden mostrar estadiacutesticascon el nuacutemero total de palabras encontradas distancia media entre esaspalabras palabras reales por cada mil palabras generadas etcEl alumno puede encontrar ficheros con las palabras que tiene el idiomaespantildeol en formato digital en la siguiente direccioacuten Se trata de una muestrahay otros muchos diccionarios disponibles en internethttplasrcsuclaedugeoffispell-dictionarieshtmlSpanish-dicts

Apeacutendice A Ejercicios de ampliacioacuten 215

Ejercicio 2 Coleccioacuten de discos ampliado (con canciones)Este ejercicio consiste en realizar una mejora del ejercicio del capiacutetulo 10que permite gestionar una coleccioacuten de discos Ahora cada disco contienecanciones Deberaacutes crear la clase Cancion con los atributos y meacutetodos queestimes oportunos Antildeade el atributo canciones a la clase Disco Este atributocanciones debe ser un array de objetos de la clase CancionFiacutejate bien que Cancion NO ES una subclase de Disco sino que ahora cadadisco puede tener muchas canciones que estaacuten almacenadas en el atributocancionesModifica convenientemente el meacutetodo toString para que al mostrarse los datosde un disco se muestre tambieacuten la informacioacuten sobre las canciones quecontieneLa aplicacioacuten debe permitir antildeadir borrar y modificar las canciones de losdiscos

Apeacutendice B Entorno de Desarrollo IntegradoNetbeansNetbeans es un IDE (Integrated Development Environment) es decir un Entornode Desarrollo Integrado Consta de un potente editor y de todas las herramientasnecesarias para codificar compilar depurar y ejecutar una aplicacioacutenEste IDE tiene algunas caracteriacutesticas que lo hacen muy atractivo para los programa-dores

bull Es el IDE oficial para desarrollar en Java6bull Chequea errores de sintaxis y da advertencias al mismo tiempo que se escribe el

coacutedigobull Tiene autocompletado inteligente de palabras clave clases meacutetodos paraacuteme-

troshellipbull Permite depurar una aplicacioacuten ejecutaacutendola paso a paso y ver el contendido de

todas las variables en tiempo realbull Soporta muchos lenguajes de programacioacuten ademaacutes de Java PHP Groovy HTML

XML Javascript JSPhellipbull Existe una gran variedad de plugins que ampliacutean las funcionalidades del entorno

Descarga e instalacioacuten

Netbeans se puede descargar de forma gratuita y para cualquier plataforma desdehttpsnetbeansorgdownloads

6Esto no es casualidad ya que es la misma empresa - Oracle - la que estaacute detraacutes del desarrollo de Java y tambieacuten la quesoporta Netbeans

216

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 217

Figura B1 Descarga de Netbeans

El programa de instalacioacuten de Netbeans estaacute disponible en varios paquetes seguacutenel lenguaje de programacioacuten y las tecnologiacuteas que se incluyen En el momento deescribir este libro los paquetes disponibles son Java SE Java EE HTML5JavaScriptPHP CC++ All Este uacuteltimo paquete (All) instala todos los lenguajes y tecnologiacuteasdisponibles para el IDE (sin contar los plugins) Para seguir este libro es suficientecon la versioacuten Java EE sin embargo animo al lector a descargar la versioacuten completa yexperimentar con otros lenguajes diferentes a Java por ejemplo con PHP7

Configuracioacuten

En los ejemplos y soluciones a los ejercicios de este libro nos centildeimos al los estaacuten-dares de programacioacuten de Google para el coacutedigo fuente escrito en el lenguaje deprogramacioacuten Java8 Por tanto despueacutes de la instalacioacuten de Netbeans es necesariorealizar algunso ajustes en la configuracioacuten del editor para cumplir con las siguientescondiciones

7httpsleanpubcomaprendephpconejercicios8httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 218

bull La tecla TAB debe insertar espacios no debe insertar el caraacutecter de tabulacioacutenbull La indentacioacuten debe ser de 2 caracteres (por defecto suele estar a 4)bull La condificacioacuten de caracteres debe ser UTF-8

Para ello selecciona Herramientas rarr Opciones rarr Editor A continuacioacuten seleccionala pestantildea Formato y en el menuacute desplegable correspondiente al lenguaje deprogramacioacuten selecciona Java La configuracioacuten deberiacutea quedar como se indica enla imagen

Figura B2 Configuracioacuten de Netbeans

Creacioacuten de un proyecto

Sigue los pasos que damos a continuacioacuten para crear un nuevo proyecto de Java enNetbeansEn primer lugar desde el menuacute principal selecciona Archivo y a continuacioacuten NuevoProyecto Se puede hacer maacutes raacutepido con la combinacioacuten Control + Mayuacutescula + NVeraacutes que aparece una ventana emergente para elegir el tipo de proyecto SeleccionaJava en el apartado ldquoCategoriacuteasrdquo y Aplicacioacuten Java en el apartado ldquoProyectosrdquo Hazclic en Siguiente

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 219

Figura B3 Nuevo proyecto en Java

Ahora es necesario darle el nombre al proyecto lo puedes llamar por ejemplo SaludoRecuerda no utilizar caracteres especiales ni signos de puntuacioacuten Se crearaacute unacarpeta con el mismo nombre que el proyecto que contendraacute todos los ficherosnecesarios Aseguacuterate de que la casilla Crear la clase principal estaacute marcada Hazclic en Terminar

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 220

Figura B4 Proyecto ldquoSaludordquo

Veraacutes que se ha creado el ldquoesqueletordquo de la aplicacioacuten La clase principal se llamaSaludo y contiene el main que seraacute el cuerpo principal del programa Observa que en laparte de la izquierda donde estaacuten todos los proyectos que se van realizando puedesver la estructura de carpetas y ficheros El coacutedigo fuente de nuestra aplicacioacuten estaacuteen el fichero Saludojava Escribe dentro del main la siguiente liacutenea

Systemoutprintln(iexclHola mundo)

Para guardar compilar y ejecutar basta con hacer clic en el botoacuten verde con el iconode Play o bien pulsar la tecla F6

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 221

Figura B5 Ejecucioacuten del proyecto

Si todo ha salido bien veraacutes el mensaje iexclHola mundo en la ventana de terminal integradade Netbeans que hay justo debajo del editor

Depuracioacuten

El entornoNetbeans permite la depuracioacuten paso a paso de un programa En ocasioneses complicado encontrar y corregir los fallos de una aplicacioacuten y ayuda mucho tenerla posibilidad de ir ejecutando un programa liacutenea a liacutenea y ver coacutemo van cambiandolas variablesPara ilustrar la depuracioacuten paso a paso vamos a utilizar un programa de ejemplo delCapiacutetulo 7 Arrays en concreto usaremos el coacutedigo de Array03javaCrea un nuevo proyecto de Java como se ha indicado en el apartado anterior y llaacutemaloArray03 A continuacioacuten copia el contenido del main del fichero Array03java en tuproyecto Ten cuidado de no borrar la liacutenea package array03Comenzaremos la ejecucioacuten paso a paso del programa pulsando de manera sucesivala tecla F7

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 222

Figura B6 Ejecucioacuten paso a paso

Observa coacutemo Netbeans resalta una liacutenea la ejecuta se detiene y espera quesigamos pulsando F7 En la parte de abajo ha aparecido una nueva ventana que resultatremendamente uacutetil Se trata de una zona donde puedes ver en tiempo real el valorque tiene cada variable (por supuesto se incluyen los arrays)Ve pulsando F7 hasta colocarte en la liacutenea siguiente

num[2] = 200

En la ventana inferior donde aparecen todos los datos despliega el array num veraacutesque los elementos 0 y 1 ya tienen los valores 8 y 33 respectivamente Si vuelves apulsar F7 veraacutes que ahora en la posicioacuten 2 se ha almacenado el 200Para salir del modo ldquopaso a pasordquo y terminar de ejecutar el programa pulsa F5Ademaacutes de la ejecucioacuten ldquopaso a pasordquo tambieacuten resultan muy uacutetiles los puntos deruptura o breakpoints Se trata de marcas a modo de sentildeales de STOP dondeindicamos pausas en la ejecucioacuten del programa La depuracioacuten de un programa devarios cientos o miles de liacuteneas puede ser muy tediosa si se ejecuta cada liacutenea paso a

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 223

paso con F7 Los breakpoints permiten parar la ejecucioacuten en liacuteneas concretas dondequeremos ver con maacutes detalle queacute estaacute sucediendo en nuestro programaVamos a colocar varios breakpoints en nuestro coacutedigo Haz clic sobre las liacuteneas 15 20y 24 (justo encima del nuacutemero de liacutenea) Observa que estas liacuteneas quedan marcadascon un pequentildeo cuadradito

Figura B7 Breakpoints

Pulsa la combinacioacuten de teclas Control + F5 Observa coacutemo el programa empiezaa ejecutarse con normalidad y se para justo en la liacutenea 15 donde estaacute el primerbreakpoint Pulsando ahora F5 el programa continuacutea ejecutaacutendose hasta que se paraen la liacutenea 20 donde estaacute el segundo breakpoint Otra pulsacioacuten de F5 hace quecontinuacutee la ejecucioacuten hasta la liacutenea 24 Una uacuteltima pulsacioacuten de esta tecla hace que elprograma continuacutee la ejecucioacuten hasta el final

Apeacutendice C Caracteres especialesLiacuteneas para tablas

Bloques

⊞ ⊟ ⊠ ⊡

Figuras de ajedrez

Ciacuterculos

oplus ⊖ otimes ⊘ ⊙ ⊛ ⊜ ⊝ ⴱ ⴲ ⵀ ⵁ ⵔ ⵕ ⵙ ⵚ

Flechas

larr uarr rarr darr harr ↚ ↛ ↠ ↣ ↦ ↮ crarr ⇎ ⇏ lArr uArr rArr dArr hArr ⇴ ⇵ ⇶ ⇷ ⇸ ⇹ ⇺ ⇻ ⇼ ⇽ ⇾ ⇿

Nuacutemeros en ciacuterculos

❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓

Dados

Fichas de dominoacute

127024 127025 127026 127027 127028 127029 127030 127031 127032 127033 127034 127035 127036 127037 127038 127039 127040 127041 127042 127043 127044 127045 127046 127047 127048 127049127050 127051 127052 127053 127054 127055 127056 127057 127058 127059 127060 127061 127062 127063 127064 127065 127066 127067 127068 127069 127070 127071 127072 127073 127074 127075127076 127077 127078 127079 127080 127081 127082 127083 127084 127085 127086 127087 127088 127089 127090 127091 127092 127093 127094 127095 127096 127097 127098 127099 127100 127101 127102 127103 127104 127105 127106 127107 127108 127109 127110 127111 127112 127113127114 127115 127116 127117 127118 127119 127120 127121 127122 127123

224

Apeacutendice C Caracteres especiales 225

Cartas

127136 127137 127138 127139 127140 127141 127142 127143 127144 127145 127146 127147 127148 127149 127150 127153 127154 127155 127156 127157 127158 127159 127160 127161 127162 127163 127164 127165 127166 127169 127170 127171127172 127173 127174 127175 127176 127177 127178 127179 127180 127181 127182 127183 127185 127186 127187 127188 127189 127190 127191 127192 127193 127194 127195 127196 127197 127198 127199

Caras

128045 128046 128049 128053 128512 128513 128514 128515 128516 128517 128518 128519 128520 128521 128522 128523 128524 128525 128526 128527 128528 128529 128530 128531 128532 128533 128534 128535 128536128537 128538 128539 128540 128541 128542 128543 128544 128545 128546 128547 128549 128550 128551 128552 128553 128554 128555 128557 128558 128559 128560 128561 128562 128563 128564 128565 128566 128567 128568 128569128570 128571 128572 128573 128574 128575 128576

Horoacutescopo

Miscelaacutenea

Ω ꙮ

  • Tabla de contenidos
  • Sobre este libro
  • Sobre el autor
  • Centros en los que se usa este libro
  • Introduccioacuten
  • Instalacioacuten y configuracioacuten del entorno de programacioacuten Java
  • iexclHola mundo - Salida de datos por pantalla
    • iexclHola mundo - Mi primer programa
    • Coloreado de texto
    • Ejercicios
      • Variables
        • Definicioacuten y tipos de variables
          • Enteros (int y long)
          • Nuacutemeros decimales (double y float)
          • Cadenas de caracteres (String)
            • Operadores artimeacuteticos
            • Asignacioacuten de valores a variables
            • Conversioacuten de tipos (casting)
            • Ejercicios
              • Lectura de datos desde teclado
                • Lectura de texto
                • Lectura de nuacutemeros
                • La clase Scanner
                • Ejercicios
                  • Sentencia condicional (if y switch)
                    • Sentencia if
                    • Operadores de comparacioacuten
                    • Operadores loacutegicos
                    • Sentencia switch (seleccioacuten muacuteltiple)
                    • Ejercicios
                      • Bucles
                        • Bucle for
                        • Bucle while
                        • Bucle do-while
                        • Ejercicios
                          • Nuacutemeros aleatorios
                            • Generacioacuten de nuacutemeros aleatorios con y sin decimales
                            • Generacioacuten de palabras de forma aleatoria de un conjunto dado
                            • Ejercicios
                              • Arrays
                                • Arrays de una dimensioacuten
                                • Arrays bidimensionales
                                • Recorrer arrays con for al estilo foreach
                                • Ejercicios
                                  • Arrays de una dimensioacuten
                                  • Arrays bidimensionales
                                      • Funciones
                                        • Implementando funciones para reutilizar coacutedigo
                                        • Comentarios de funciones
                                        • Creacioacuten de bibliotecas de rutinas mediante paquetes
                                        • Aacutembito de las variables
                                        • Paso de paraacutemetros por valor y por referencia
                                        • Ejercicios
                                          • Programacioacuten orientada a objetos
                                            • Clases y objetos
                                            • Encapsulamiento y ocultacioacuten
                                            • Meacutetodos
                                              • Creiacute haber visto un lindo gatito
                                              • Meacutetodos getter y setter
                                              • Meacutetodo toString
                                                • Aacutembitovisibilidad de los elementos de una clase - public protected y private
                                                • Herencia
                                                  • Sobrecarga de meacutetodos
                                                    • Atributos y meacutetodos de clase (static)
                                                    • Interfaces
                                                    • Arrays de objetos
                                                    • Ejercicios
                                                      • Conceptos de POO
                                                      • POO en Java
                                                      • Arrays de objetos
                                                          • Colecciones y diccionarios
                                                            • Colecciones la clase ArrayList
                                                              • Principales meacutetodos de ArrayList
                                                              • Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de sus elementos
                                                              • ArrayList de objetos
                                                              • Ordenacioacuten de un ArrayList
                                                                • Diccionarios la clase HashMap
                                                                  • Principales meacutetodos de HashMap
                                                                  • Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas
                                                                    • Ejercicios
                                                                      • Ficheros de texto y paso de paraacutemetros por liacutenea de comandos
                                                                        • Lectura de un fichero de texto
                                                                        • Escritura sobre un fichero de texto
                                                                        • Lectura y escritura combinadas
                                                                        • Otras operaciones sobre ficheros
                                                                        • Paso de argumentos por liacutenea de comandos
                                                                        • Combinacioacuten de ficheros y paso de argumentos
                                                                        • Procesamiento de archivos de texto
                                                                        • Ejercicios
                                                                          • Aplicaciones web en Java (JSP)
                                                                            • Hola Mundo en JSP
                                                                            • Mezclando Java con HTML
                                                                            • Recogida de datos en JSP
                                                                            • POO en JSP
                                                                            • Ejercicios
                                                                              • Acceso a bases de datos
                                                                                • Socios de un club de baloncesto
                                                                                • Preparacioacuten del proyecto de ejemplo
                                                                                  • Activar la conexioacuten a MySQL
                                                                                  • Incluir la libreriacutea MySQL JDBC
                                                                                    • Listado de socios
                                                                                    • Alta
                                                                                    • Borrado
                                                                                    • CRUD completo con Bootstrap
                                                                                    • Ejercicios
                                                                                      • Apeacutendice A Ejercicios de ampliacioacuten
                                                                                      • Apeacutendice B Entorno de Desarrollo Integrado Netbeans
                                                                                        • Descarga e instalacioacuten
                                                                                        • Configuracioacuten
                                                                                        • Creacioacuten de un proyecto
                                                                                        • Depuracioacuten
                                                                                          • Apeacutendice C Caracteres especiales
                                                                                            • Liacuteneas para tablas
                                                                                            • Bloques
                                                                                            • Figuras de ajedrez
                                                                                            • Ciacuterculos
                                                                                            • Flechas
                                                                                            • Nuacutemeros en ciacuterculos
                                                                                            • Dados
                                                                                            • Fichas de dominoacute
                                                                                            • Cartas
                                                                                            • Caras
                                                                                            • Horoacutescopo
                                                                                            • Miscelaacutenea
Page 3: Aprende Java con Ejercicios - DAM

IacuteNDICE GENERAL

5 Bucles 3951 Bucle for 3952 Bucle while 4053 Bucle do-while 4154 Ejercicios 44

6 Nuacutemeros aleatorios 5161 Generacioacuten de nuacutemeros aleatorios con y sin decimales 5162 Generacioacuten de palabras de forma aleatoria de un conjunto dado 5563 Ejercicios 58

7 Arrays 6271 Arrays de una dimensioacuten 6272 Arrays bidimensionales 6673 Recorrer arrays con for al estilo foreach 7074 Ejercicios 72

741 Arrays de una dimensioacuten 72742 Arrays bidimensionales 77

8 Funciones 8081 Implementando funciones para reutilizar coacutedigo 8082 Comentarios de funciones 8283 Creacioacuten de bibliotecas de rutinas mediante paquetes 8384 Aacutembito de las variables 8785 Paso de paraacutemetros por valor y por referencia 8786 Ejercicios 92

9 Programacioacuten orientada a objetos 9591 Clases y objetos 9592 Encapsulamiento y ocultacioacuten 9693 Meacutetodos 97

931 Creiacute haber visto un lindo gatito 97932 Meacutetodos getter y setter 101933 Meacutetodo toString 105

94 Aacutembitovisibilidad de los elementos de una clase - public protected y private 10795 Herencia 108

951 Sobrecarga de meacutetodos 11296 Atributos y meacutetodos de clase (static) 11497 Interfaces 11698 Arrays de objetos 12299 Ejercicios 127

991 Conceptos de POO 127992 POO en Java 128993 Arrays de objetos 131

10Colecciones y diccionarios 133

IacuteNDICE GENERAL

101 Colecciones la clase ArrayList 1331011Principales meacutetodos de ArrayList 1331012Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de sus

elementos 1351013ArrayList de objetos 1411014Ordenacioacuten de un ArrayList 142

102 Diccionarios la clase HashMap 1461021Principales meacutetodos de HashMap 1461022Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas 147

103 Ejercicios 152

11Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 155111 Lectura de un fichero de texto 156112 Escritura sobre un fichero de texto 159113 Lectura y escritura combinadas 160114 Otras operaciones sobre ficheros 162115 Paso de argumentos por liacutenea de comandos 163116 Combinacioacuten de ficheros y paso de argumentos 166117 Procesamiento de archivos de texto 168118 Ejercicios 171

12Aplicaciones web en Java (JSP) 173121 Hola Mundo en JSP 173122 Mezclando Java con HTML 175123 Recogida de datos en JSP 179124 POO en JSP 183125 Ejercicios 188

13Acceso a bases de datos 192131 Socios de un club de baloncesto 192132 Preparacioacuten del proyecto de ejemplo 195

1321Activar la conexioacuten a MySQL 1951322Incluir la libreriacutea MySQL JDBC 197

133 Listado de socios 197134 Alta 200135 Borrado 202136 CRUD completo con Bootstrap 205137 Ejercicios 207

Apeacutendice A Ejercicios de ampliacioacuten 213

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 216Descarga e instalacioacuten 216Configuracioacuten 217Creacioacuten de un proyecto 218Depuracioacuten 221

IacuteNDICE GENERAL

Apeacutendice C Caracteres especiales 224Liacuteneas para tablas 224Bloques 224Figuras de ajedrez 224Ciacuterculos 224Flechas 224Nuacutemeros en ciacuterculos 224Dados 224Fichas de dominoacute 224Cartas 225Caras 225Horoacutescopo 225Miscelaacutenea 225

Sobre este libroldquoAprende Java con Ejerciciosrdquo es un manual praacutectico para aprender a programar enJava desde ceroNo es necesario tener conocimientos previos de programacioacuten La dificultad del libroes gradual empieza con conceptos muy baacutesicos y ejercicios muy sencillos y vaaumentando en complejidad y dificultad a medida que avanzan los capiacutetulosLa praacutectica hace al maestro Como de verdad se aprende a programar es programandodesde el principio y esa es la filosofiacutea que sigue este libro En cada capiacutetulo se explicanuna serie de conceptos de programacioacuten y se ilustran con ejemplos Al final de cadauno de los capiacutetulos se plantean ejercicios de diferente dificultadEste libro contiene maacutes de 200 ejercicios Tanto las soluciones a los ejercicios como losejemplos estaacuten disponibles en GitHub httpsgithubcomLuisJoseSanchezaprende-java-con-ejercicios y tanto los unos como los otros siguen los estaacutendares de programacioacutende Google para el coacutedigo fuente escrito en el lenguaje de programacioacuten Java1ldquoAprende Java con Ejerciciosrdquo es un libro hecho casi a medida de la asignatura ldquoProgra-macioacutenrdquo que forma parte del curriacuteculo del primer curso de los ciclos formativos DAW(Desarrollo de Aplicaciones Web) y DAM (Desarrollo de Aplicaciones Multiplataforma)pero igualmente puede ser utilizado por estudiantes de Ingenieriacutea Informaacutetica Ingenie-riacutea de Telecomunicaciones o Ciencias Matemaacuteticas en la asignatura de ldquoProgramacioacutenrdquode los primeros cursosSi tienes alguna duda o quieres hacer alguacuten comentario en relacioacuten a este libro tienesa tu disposicioacuten el grupo de Google httpsgroupsgooglecomdforumaprende-java-con-ejercicios Cualquier sugerencia para mejorar este manual seraacute bienvenida

1httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

i

Sobre el autorLuis Joseacute Saacutenchez Gonzaacutelez es Ingeniero Teacutecnico en Informaacutetica de Gestioacuten por laUniversidad de Maacutelaga (Espantildea) y funcionario de carrera de la Junta de Andaluciacuteadesde 1998 En su trabajo de profesor de Informaacutetica combina sus dos pasiones laensentildeanza y la programacioacutenEn el momento de publicar este libro es profesor del IES Campanillas (Maacutelaga) eimparte clases en el Ciclo Superior de Desarrollo de Aplicaciones WebPuedes ponerte en contacto con el autor mediante la direccioacuten de correo electroacute-nico luisjoseprofegmailcom o mediante LinkedIn (httpseslinkedincompubluis-joseacute-saacutenchez86b0834)

ii

Centros en los que se usa este librobull IES Campanillas Maacutelaga (Espantildea)bull IES Poliacutegono Sur Sevilla (Espantildea)bull IES Murgi El Ejido - Almeriacutea (Espantildea)bull IES Punta del Verde Sevilla (Espantildea)

Si eres profesor y utilizas este libro para ensentildear Java piacutedele al autor que antildeada enesta seccioacuten el nombre de tu centro educativo o empresa escribiendo un correo a ladireccioacuten luisjoseprofegmailcom indicando la localidad y el paiacutes del centro

iii

IntroduccioacutenJava es un lenguaje de programacioacuten es de hecho desde hace maacutes de 10 antildeos ellenguaje de programacioacuten maacutes utilizado en el mundo seguacuten el iacutendice PYPL2(PopularitYof Programming Language index)Los ordenadores no entienden - por ahora - el espantildeol ni el ingleacutes ni ninguacuten otroidioma natural De una forma muy simplificada podriacuteamos decir que un lenguaje deprogramacioacuten es un idioma que entiende el ordenador3 Cualquier aplicacioacuten - proce-sador de textos navegador programa de retoque fotograacutefico etc - estaacute compuesta deuna serie de instrucciones convenientemente empaquetadas en ficheros que le dicenal ordenador de una manera muy precisa queacute tiene que hacer en cada momentoJava es un lenguaje de programacioacuten estructurado y como tal hace uso de variablessentencias condicionales bucles funcioneshellip Java es tambieacuten un lenguaje de progra-macioacuten orientado a objetos y por consiguiente permite definir clases con sus meacutetodoscorrespondientes y crear instancias de esas clases Java no es un lenguaje de marcascomo HTML o XML aunque puede interactuar muy bien con ellos4Las aplicaciones Java se suelen compilar a bytecode que es independiente del sistemaoperativo no a binario que siacute depende del sistema operativo De esta forma elbytecode generado al compilar un programa escrito en Java deberiacutea funcionar encualquier sistema operativo que tenga instalada una maacutequina virtual de java (JVM)Cualquier editor simple como Nano o GEdit es suficiente para escribir coacutedigo enJava aunque se recomiendan IDEs5 como NetBeans o Eclipse ya que tienen algunascaracteriacutesticas que facilitan mucho la programacioacuten como el chequeo de erroresmientras se escribe el autocompletado de nombres de variables y funciones y muchomaacutes

2httppyplgithubioPYPLhtml3En realidad un ordenador no entiende directamente los lenguajes de programacioacuten como Java C Ruby etc Mediante una

herramienta que se llama compilador o traductor seguacuten el caso lo que hay escrito en cualquiera de estos lenguajes se convierteen coacutedigo maacutequina - secuencias de unos y ceros - que es el uacutenico lenguaje que de verdad entiende el ordenador

4El lector deberaacute tener unos conocimientos baacutesicos de HTML para entender bien y sacar provecho del capiacutetulo relativo a JSPde este mismo libro Una web excelente para aprender HTML es httpw3schoolscom

5IDE Integrated Development Enviroment (Entorno de Desarrollo Integrado)

iv

Instalacioacuten y configuracioacuten del entorno deprogramacioacuten JavaTodos los ejemplos que contiene este libro asiacute como las soluciones a los ejerciciosse han escrito sobre Linux en concreto sobre Ubuntu (httpwwwubuntucom) Noobstante todo el coacutedigo deberiacutea compilar y funcionar sin ninguacuten problema en cualquierotra plataformaEl software necesario para seguir este manual es el siguiente6

OpenJDKEl Open Java Development Kit (OpenJDK) contiene una serie de componentesque permiten desarrollar y ejecutar aplicaciones escritas en Java Incluye la maacute-quina virtual de Java (JVM) que permite ejecutar bytecode Como mencionamosen el apartado Introduccioacuten el bytecode es el ejecutable en Java El OpenJDKtambieacuten incluye el compilador javac que permite compilar el coacutedigo fuente paragenerar el bytecode En Ubuntu basta ejecutar una liacutenea en la ventana determinal para instalar el OpenJDK

$ sudo apt-get install openjdk-8-jdk

Para los sitemas operativos Mac OS X y Windows se encuentran disponiblespara su descarga los archivos de instalacioacuten del OpenJDK en la paacutegina UnofficialOpenJDK installers for Windows Linux and Mac OS X7 Otra opcioacuten consiste enutilizar el JDK oficial de Oracle que se puede descargar en el apartado Java SEDevelopment Kit 8 - Downloads8 de la web de esta misma empresa No vamos aexplicar las diferencias entre el OpenJDK y el JDK ya que se escapa al aacutembitode este libro A efectos praacutecticos todos los ejemplos contenidos en este manualfuncionan tanto con en el OpenJDK como con el JDK y los ejercicios se puedenrealizar sin problema sea cual sea el kit de desarrollo instalado

Editor de textos simplePara seguir este manual recomendamos utilizar al principio un editor de textossencillo para probar los primeros programas y realizar los primeros ejercicioscompilando en liacutenea de comandos De esta manera el lector se va familiarizandocon el proceso de edicioacuten de coacutedigo compilacioacuten y ejecucioacuten y va entendiendo loque sucede en cada paso En Ubuntu viene instalado por defecto el editor GEditel sistema operativo Mac OS X viene con TextEdit y en Windows podemos usarel programa Bloc de notas

6En la paacutegina httphelloworldcollectionde se muestra el programa Hola mundo escrito en maacutes de 400 lenguajes deprogramacioacuten

7httpsgithubcomalexkaskoopenjdk-unofficial-builds8httpwwworaclecomtechnetworkjavajavasedownloadsjdk8-downloads-2133151html

v

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java vi

GeanyUna vez que el lector ha superado la barrera de escribir sus primeros programasrecomendamos utilizar el entorno de programacioacuten Geany (por ejemplo a partirdel capiacutetulo 2) Se trata de un IDE muy ligero que permite realizar aplicacionessencillas con rapidez Mediante Geany se puede escribir el coacutedigo chequearsi contiene errores compilar y ejecutar el bytecode generado Para programaspequentildeos - por ej calcular la media de varios nuacutemeros - es recomendable utilizarGeany en lugar de un IDE maacutes complejo como Netbeans Mientras con Geanyda tiempo a escribir el coacutedigo compilar y ejecutar Netbeans todaviacutea estariacuteaarrancandoInstalacioacuten de Geany (y los plugins adicionales) en Ubuntu

$ sudo apt-get install geany

$ sudo apt-get install geany-plugins

En la seccioacuten de descargas de la paacutegina oficial de Geany9 se encuentran losficheros de instalacioacuten de este programa tanto para Mac OS X como paraWindowsUna vez instalado Geany es conveniente realizar algunos ajustes en la configu-racioacuten Presiona Control + Alt + P para abrir la ventana de preferencias Hazclic en la pestantildea Editor y luego en la pestantildea Sangriacutea Establece las opcionestal y como se indican a continuacioacuten

9httpwwwgeanyorgDownloadReleases

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java vii

Figura 01 Configuracioacuten de Geany (sangriacutea)

Tambieacuten es recomendable marcar las casillas Mostrar guiacuteas de sangriacutea y Mostrarnuacutemeros de liacutenea Estas opciones se activan en la pestantildea Mostrar

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java viii

Figura 02 Configuracioacuten de Geany (guiacuteas de sangriacutea y nuacutemeros de liacutenea)

NetbeansCuando las aplicaciones a desarrollar son maacutes complejas y sobre todo cuandoeacutestas constan de varios ficheros se recomienda utilizar Netbeans de la empresaOracle En el capiacutetulo 9 el lector ya podriacutea sacarle mucho partido al uso de esteIDE Se trata de un entorno integrado muy potente y muy usado a nivel profesionalque incluye el autocompletado de sintaxis y permite una depuracioacuten avanzadapaso a paso Netbeans se puede descargar de forma gratuita y para cualquierplataforma desde httpsnetbeansorgdownloadsDespueacutes de la instalacioacuten de Netbeans procedemos a configurar el editorPara ello seleccionamos Herramientas rarr Opciones rarr Editor A continuacioacutenseleccionamos la pestantildea Formato y en el menuacute desplegable correspondiente allenguaje de programacioacuten seleccionamos Java La configuracioacuten deberiacutea quedarcomo se indica en la imagen

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java ix

Figura 03 Configuracioacuten de Netbeans

Es muy importante que los editoresIDEs que se utilicen para esribir coacutedigoen Java se configuren adecuadamente Hemos visto coacutemo configurar Geanyy Netbeans pero si el lector decide utilizar otras herramientas deberaacuteconfigurarlas igualmente En definitiva la configuracioacutenpreferencias de lasherramientas que se utilicen deben establecerse de tal forma que se cumplanestos requisitos

bull La tecla TAB debe insertar espacios no debe insertar el caraacutecter detabulacioacuten

bull La indentacioacuten debe ser de 2 caracteres (por defecto suele estar a 4)bull La condificacioacuten de caracteres debe ser UTF-8

1 iexclHola mundo - Salida de datos por pantalla

11 iexclHola mundo - Mi primer programa

El primer programa que aprende a hacer cualquier aspirante a programador es unHolamundo 1 Es seguramente el programa maacutes sencillo que se puede escribir Se trata deun programa muestra el mensaje ldquoHola mundordquo por pantalla Abre el programa GEditque como hemos comentado en la seccioacuten Instalacioacuten y configuracioacuten del entorno deprogramacioacuten Java viene instalado por defecto en Ubuntu y teclea el siguiente coacutedigo

Muestra por pantalla la frase iexclHola mundo author Luis J Saacutenchez

public class HolaMundo Clase principalpublic static void main(String[] args)

Systemoutprintln(iexclHola mundo)

Veraacutes que en principio el texto del coacutedigo no aparece en colores El coloreado desintaxis es muy uacutetil como comprobaraacutes maacutes adelante sobre todo para detectar erroresGraba el programa como HolaMundojava Al grabar con la extensioacuten java ahora elprograma GEdit siacute sabe que se trata de un programa escrito en Java y reconoce lasintaxis de este lenguaje de forma que puede colorear los distintos elementos queaparecen en el coacutedigo

1En la paacutegina httphelloworldcollectionde se muestra el programa Hola mundo escrito en maacutes de 400 lenguajes deprogramacioacuten

1

iexclHola mundo - Salida de datos por pantalla 2

Figura 11 Programa Hola mundo escrito en el editor GEdit

Fiacutejate que el nombre que le damos al fichero es exactamente igual que la clase principalseguido de la extensioacuten java Abre una ventana de terminal entra en el directoriodonde se encuentra el fichero y teclea lo siguiente

$ javac HolaMundojava

Este comando crea HolaMundoclass que es el bytecode Para ejecutar el programateclea

$ java HolaMundo

iexclEnhorabuena Acabas de realizar tu primer programa en JavaEn la siguiente captura de pantalla puedes ver la ventana de terminal y los comandosque acabamos de describir

iexclHola mundo - Salida de datos por pantalla 3

Figura 12 HolaMundoclass es el bytecode generado (1) El resultado del programa es una liacutenea de textoescrita en pantalla (2)

La instruccioacuten que hemos utilizado para mostrar una frase por pantalla es Sys-

temoutprintln() colocando la frase entre pareacutentesis Tambieacuten se puede volcar textopor pantalla mediante Systemoutprint() La uacutenica diferencia radica en que esta uacuteltimano antildeade un salto de liacutenea al final prueacutebalo en HolaMundojava y comprueacutebalo por timismo Si lo que quieres mostrar es una palabra o una frase como en este ejemploes importante que el texto esteacute entrecomillado

bull El programa propiamente dicho estaacute dentro de lo que llamamos ldquoclaseprincipalrdquo

bull El fichero debe tener el mismo nombre que la clase principal seguido porla extensioacuten java

bull Los comentarios de varias liacuteneas se colocan entre y

bull Los comentarios de liacutenea se indican mediante

bull Para mostrar informacioacuten por pantalla se utilizan Systemoutprintln() ySystemoutprint()

iexclHola mundo - Salida de datos por pantalla 4

12 Coloreado de texto

Mostrar siempre texto blanco sobre fondo negro puede resultar muy aburrido El textoque se muestra por pantalla se puede colorear para ello es necesario insertar unassecuencias de caracteres - que indican el color con el que se quiere escribir - justoantes del propio textoPrueba el siguiente programa y no te preocupes si todaviacutea no lo entiendes del todoen el proacuteximo capiacutetulo se explican los diferentes tipos de datos que se pueden utilizaren Java entre estos tipos estaacute la cadena de caracteres o String

Coloreado de texto Muestra varias palabras en el color que corresponde author Luis Joseacute Saacutenchez

public class Colores

public static void main(String[] args)

String rojo = 033[31m

String verde = 033[32m

String naranja = 033[33m

String azul = 033[34m

String morado = 033[35m

String blanco = 033[37m

Systemoutprint(naranja + mandarina + verde + hierba)

Systemoutprint(naranja + saltamontes + rojo + tomate)

Systemoutprint(blanco + saacutebanas + azul + cielo)

Systemoutprint(morado + nazareno + azul + mar)

Como puedes ver en los dos ejemplos que hemos mostrado algunas liacuteneas estaacutenligeramente desplazadas hacia la derecha es lo que se llama sangriacutea o indentacioacutenEn programacioacuten es muy importante sangrar (indentar) bien porque da una idea de queacutepartes del coacutedigo son las que contienen a otras En este uacuteltimo ejemplo tenemos unprograma que tiene unos comentarios al principio y luego la clase principal marcadapor la liacutenea public class Colores Dentro de la clase Colores estaacute el main o bloque delprograma principal que tiene sangriacutea por estar dentro de la definicioacuten de la claseColores A su vez dentro del main hay una serie de liacuteneas de coacutedigo que igualmentetienen sangriacutea

iexclHola mundo - Salida de datos por pantalla 5

En este libro tanto el coacutedigo de los ejemplos como el de las soluciones a losejercicios siguen el estaacutendar de Google para el coacutedigo fuente escrito en el lenguaje deprogramacioacuten Java2 por tanto cada vez que se aplique la sangriacutea seraacute exactamentede dos espacios

2httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

iexclHola mundo - Salida de datos por pantalla 6

13 Ejercicios

Ejercicio 1Escribe una programa que muestre tu nombre por pantalla

Ejercicio 2Modifica el programa anterior para que ademaacutes se muestre tu direccioacuten ytu nuacutemero de teleacutefono Aseguacuterate de que los datos se muestran en liacuteneasseparadas

Ejercicio 3Escribe un programa que muestre por pantalla 10 palabras en ingleacutes juntoa su correspondiente traduccioacuten al castellano Las palabras deben estardistribuidas en dos columnas y alineadas a la izquierda Pista Se puedeinsertar un tabulador mediante t

Ejercicio 4Escribe un programa que muestre tu horario de clase Puedes usar espacios otabuladores para alinear el texto

Ejercicio 5Modifica el programa anterior antildeadiendo colores Puedes mostrar cada asig-natura de un color diferente

Ejercicio 6Escribe un programa que pinte por pantalla una piraacutemide rellena a base deasteriscos La base de la piraacutemide debe estar formada por 9 asteriscos

Ejercicio 7Igual que el programa anterior pero esta vez la piraacutemide estaraacute hueca (sedebe ver uacutenicamente el contorno hecho con asteriscos)

iexclHola mundo - Salida de datos por pantalla 7

Ejercicio 8Igual que el programa anterior pero esta vez la piraacutemide debe aparecerinvertida con el veacutertice hacia abajo

Ejercicio 9Escribe un programa que pinte por pantalla alguna escena - el campo lahabitacioacuten de una casa un aula etc - o alguacuten objeto animado o inanimado- un coche un gato una taza de cafeacute etc Ten en cuenta que puedes utilizarcaracteres como + lt etc iexclEacutechale imaginacioacuten

2 Variables

21 Definicioacuten y tipos de variables

Una variable es un contenedor de informacioacuten Imagina una variable como una cajitacon una etiqueta que indica su nombre una cajita en la que se puede introducir un va-lor Las variables pueden almacenar valores enteros nuacutemeros decimales caracterescadenas de caracteres (palabras o frases) etc El contenido de las variables puedecambiar durante la ejecucioacuten del programa de ahiacute viene el nombre de ldquovariablerdquoJava es un lenguaje fuertemente tipado es decir es necesario declarar todas lasvariables que utilizaraacute el programa indicando siempre el nombre y el tipo de cadaunaEl nombre que se le da a una variable es muy importante intenta usar siemprenombres significativos que de alguna forma identifiquen el contenido Por ejemplosi usas una variable para almacenar el volumen de una figura una buena opcioacuten seriacuteallamarla volumen si tienes una variable que almacena la edad de una persona lo mejores llamarla edad y asiacute sucesivamenteUn programa se lee y se depura mucho mejor si los nombres de las variables se hanelegido de forma inteligenteiquestPodriacuteas averiguar queacute hace la siguiente liacutenea de coacutedigo

x = vIp3 Weerty - zxc

Ahora observa el mismo coacutedigo pero con otros nombres de variables

precioTotal = cantidad precio - descuento

Se entiende mucho mejor iquestverdadEscribiremos los nombres de variables en formato lowerCamelCase La primera letrase escribe en minuacutescula y a continuacioacuten si se utiliza maacutes de una palabra cada unade ellas empezariacutea con mayuacutescula Por ejemplo edadMin es un buen nombre para unavariable que almacena la edad miacutenima a la que se puede acceder a un sitio webObserva que hemos usado una mayuacutescula para diferenciar dos partes (edad y Min)Puede que en alguacuten libro tambieacuten encuentres nombres de variables con el caraacutecterde subrayado ( _ ) de tal forma que el nombre de la variable seriacutea edad_min pero comohemos comentado anteriormente en este libro nos centildeimos al estaacutendar de Google1que exige el formato lowerCamelCase

1httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

8

Variables 9

No se permiten siacutembolos como $ + - etc Puedes usar nuacutemeros en los nombresde variables pero nunca justo al principio 5x no es un nombre vaacutelido pero x5 siacute lo esNo se debe poner una letra mayuacutescula al comienzo del nombre de una variable parano confundirla con una clase (los nombres de las clases comienzan por mayuacutescula)

211 Enteros (int y long)

Las variables que van a contener nuacutemeros enteros se declaran con int Veamos unejemplo

Uso de variables enteras author Luis J Saacutenchez

public class VariablesEnteras

public static void main(String[] args)

int x Se declara la variable x como entera

x = 5 Se asigna el valor 5 a la variable xSystemoutprintln(El valor actual de mi variable es + x)

x = 7 Se asigna el valor 7 a la variable xSystemoutprintln(y ahora es + x)

Si pretendemos almacenar valores muy grandes en una variable usaremos el tipo long

en lugar de int

212 Nuacutemeros decimales (double y float)

Usamos los tipos double o float cuando queremos (o esperamos) almacenar nuacutemeroscon decimales en las variablesCintildeeacutendonos al estaacutendar de Google no daremos por vaacutelidas definiciones de variablescomo la siguiente (aunque funcionariacutea sin ninguacuten problema)

double x y

Cada variable se debe definir en una liacutenea diferente Lo siguiente siacute seriacutea correcto

Variables 10

double x

double y

A continuacioacuten tienes un ejemplo completo

Uso de variables que contienen nuacutemeros decimales author Luis J Saacutenchez

public class VariablesConDecimales

public static void main(String[] args)

double x Se declaran las variables x e ydouble y de tal forma que puedan almacenar decimales

x = 7

y = 2501

Systemoutprintln( x vale + x)

Systemoutprintln( y vale + y)

Como puedes ver tambieacuten se pueden almacenar nuacutemeros enteros en variables de tipodouble

213 Cadenas de caracteres (String)

Las cadenas de caracteres se utilizan para almacenar palabras y frases Todas lascadenas de caracteres deben ir entrecomilladas

Uso del tipo String author Luis J Saacutenchez

public class UsoDeStrings

public static void main(String[] args)

String miPalabra = cerveza

String miFrase = iquestdoacutende estaacute mi cerveza

Systemoutprintln(Una palabra que uso con frecuencia + miPalabra)

Variables 11

Systemoutprintln(Una frase que uso a veces + miFrase)

Como puedes ver en una cadena de caracteres se pueden almacenar signos depuntuacioacuten espacios y letras con tildes

Variables 12

22 Operadores artimeacuteticos

En Java se puede operar con las variables de una forma muy parecida a como se haceen matemaacuteticas Los operadores aritmeacuteticos de Java son los siguientes

OPERADOR NOMBRE EJEMPLO DESCRIPCIOacuteN+ suma 20 + x suma dos nuacutemeros- resta a - b resta dos nuacutemeros multiplicacioacuten 10 7 multiplica dos nuacutemeros divisioacuten altura 2 divide dos nuacutemeros resto (moacutedulo) 5 2 resto de la divisioacuten entera

++ incremento a++ incrementa en 1 elvalor de la variable

- - decremento a- - decrementa en 1 elvalor de la variable

A continuacioacuten tienes un programa que ilustra el uso de los operadores aritmeacuteticos

Uso de los operadores aritmeacuteticos author Luis J Saacutenchez

public class UsoDeOperadoresAritmeticos

public static void main(String[] args)

int x

x = 100

Systemoutprintln(x + + (x + 5) + + (x - 5))

Systemoutprintln((x 5) + + (x 5) + + (x 5))

23 Asignacioacuten de valores a variables

La sentencia de asignacioacuten se utiliza para dar un valor a una variable En Java (y enla mayoriacutea de lenguajes de programacioacuten) se utiliza el siacutembolo igual ( = ) para estecometido Es importante recalcar que una asignacioacuten no es una ecuacioacuten Por ejemplox = 7 + 1 es una asignacioacuten en la cual se evaluacutea la parte derecha 7 + 1 y el resultadode esa evaluacioacuten se almacena en la variable que se coloque a la izquierda del iguales decir en la x o lo que es lo mismo el nuacutemero 8 se almacena en x La sentenciax + 1 = 23 2 no es una asignacioacuten vaacutelida ya que en el lado izquierdo debemos teneruacutenicamente un nombre de variableVeamos un ejemplo con algunas operaciones y asignaciones

Variables 13

Operaciones y asignaciones author Luis J Saacutenchez

public class Asignaciones

public static void main(String[] args)

int x = 2

int y = 9

int sum = x + y

Systemoutprintln(La suma de mis variables es + sum)

int mul = x y

Systemoutprintln(La multiplicacioacuten de mis variables es + mul)

24 Conversioacuten de tipos (casting)

En ocasiones es necesario convertir una variable (o una expresioacuten en general) de untipo a otro Simplemente hay que escribir entre pareacutentesis el tipo que se quiere obtenerExperimenta con el siguiente programa y observa los diferentes resultados que seobtienen

Conversioacuten de tipos author Luis J Saacutenchez

public class ConversionDeTipos

public static void main(String[] args)

int x = 2

int y = 9

double division

division = (double)y (double)xdivision = y x Comenta esta liacutenea y

observa la diferencia

Variables 14

Systemoutprintln(El resultado de la divisioacuten es + division)

Variables 15

25 Ejercicios

Ejercicio 1Escribe un programa en el que se declaren las variables enteras x e y Asignaleslos valores 144 y 999 respectivamente A continuacioacuten muestra por pantallael valor de cada variable la suma la resta la divisioacuten y la multiplicacioacuten

Ejercicio 2Crea la variable nombre y asiacutegnale tu nombre completo Muestra su valor porpantalla de tal forma que el resultado del programa sea el mismo que en elejercicio 1 del capiacutetulo 1

Ejercicio 3Crea las variables nombre direccion y telefono y asiacutegnale los valores corres-pondientes Muestra los valores de esas variables por pantalla de tal formaque el resultado del programa sea el mismo que en el ejercicio 2

Ejercicio 4Realiza un conversor de euros a pesetas La cantidad en euros que se quiereconvertir deberaacute estar almacenada en una variable

Ejercicio 5Realiza un conversor de pesetas a euros La cantidad en pesetas que se quiereconvertir deberaacute estar almacenada en una variable

Ejercicio 6Escribe un programa que calcule el total de una factura a partir de la baseimponible (precio sin IVA) La base imponible estaraacute almacenada en unavariable

3 Lectura de datos desde tecladoHemos visto en los capiacutetulos anteriores coacutemo mostrar informacioacuten por pantalla ycoacutemo usar variables Veremos ahora algo muy importante que te permitiraacute realizarprogramas algo maacutes funcionales que tengan una utilidad real aprenderaacutes a leer lainformacioacuten que introduce un usuario mediante el tecladoEl funcionamiento de casi todos los programas se podriacutea resumir en los siguientespuntos

1 Entrada de datos desde teclado (o desde cualquier otro dispositivo de entrada)2 Procesamiento de los datos de entrada para producir un resultado3 Visualizacioacuten de los resultados por pantalla

De momento hemos visto coacutemo realizar los puntos 2 y 3 Vamos a ver a continuacioacutencoacutemo se recoge la informacioacuten desde el teclado

31 Lectura de texto

Para recoger datos por teclado usamos Systemconsole()readLine() Cuando llegamos aesta sentencia el programa se detiene y espera que el usuario introduzca informacioacutenmediante el teclado La introduccioacuten de datos termina con la pulsacioacuten de la teclaINTRO Una vez que el usuario presiona INTRO todo lo que se ha tecleado se almacenaen una variable en el siguiente ejemplo esa variable es nombre

Lectura de datos desde teclado author Luis J Sanchez

public class DimeTuNombre

public static void main(String[] args)

String nombre

Systemoutprint(Por favor dime coacutemo te llamas )

nombre = Systemconsole()readLine()

Systemoutprintln(Hola + nombre + iexclencantado de conocerte)

16

Lectura de datos desde teclado 17

Mediante Systemconsole()readLine() se recoge una liacutenea de texto introducidapor teclado

Cuando se piden datos por teclado es importante que el programa especifiqueclaramente cuaacutel es exactamente la informacioacuten que requiere por parte del usuarioDate cuenta que este programa muestra el mensaje ldquoPor favor dime coacutemo te llamasrdquoImagina que se omite este mensaje en la pantalla apareceriacutea uacutenicamente un cursorparpadeando y el usuario no sabriacutea queacute tiene que hacer o queacute dato introducirTambieacuten es importante resentildear que los datos introducidos por teclado se recogen comouna cadena de caracteres (un String)

32 Lectura de nuacutemeros

Si en lugar de texto necesitamos datos numeacutericos deberemos convertir la cadenaintroducida en un nuacutemero con el meacutetodo adecuado Como se muestra en el ejemploIntegerparseInt() convierte el texto introducido por teclado en un dato numeacutericoconcretamente en un nuacutemero entero

Lectura de datos desde teclado author Luis J Saacutenchez

public class LeeNumeros

public static void main(String[] args)

String linea

Systemoutprint(Por favor introduce un nuacutemero )

linea = Systemconsole()readLine()

int primerNumero

primerNumero = IntegerparseInt( linea )

Systemoutprint(introduce otro por favor )

linea = Systemconsole()readLine()

int segundoNumero

segundoNumero = IntegerparseInt( linea )

int total

total = (2 primerNumero) + segundoNumero

Systemoutprint(El primer nuacutemero introducido es + primerNumero)

Lectura de datos desde teclado 18

Systemoutprintln( y el segundo es + segundoNumero)

Systemoutprint(El doble del primer nuacutemero maacutes el segundo es )

Systemoutprint(total)

Este uacuteltimo programa se podriacutea acortar un poco Por ejemplo estas dos liacuteneas

int total

total = (2 primerNumero) + segundoNumero

se podriacutean quedar en una sola liacutenea

int total = (2 primerNumero) + segundoNumero

De igual modo estas tres liacuteneas

linea = Systemconsole()readLine()

int primerNumero

primerNumero = IntegerparseInt( linea )

tambieacuten se podriacutean reducir a una sola tal que asiacute

int primerNumero = IntegerparseInt( Systemconsole()readLine() )

Es muy importante que el coacutedigo de nuestros programas sea limpio y legible A vecesabreviando demasiado el coacutedigo se hace maacutes difiacutecil de leer es preferible tener unasliacuteneas de maacutes y que el coacutedigo se entienda bien a tener un coacutedigo muy compacto peromenos legible

33 La clase Scanner

El meacutetodo Systemconsole()readLine() funciona bien en modo consola (en una ventana determinal) pero puede provocar problemas cuando se trabaja con IDEs como EclipseNetbeans JavaEdit etc Para evitar estos problemas puedes usar la clase Scanner

cuando necesites recoger datos desde teclado La clase Scanner funciona tanto enentornos integrados como en una ventana de terminal

Lectura de datos desde teclado 19

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScanner01

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tu nombre )

String nombre = snextLine()

Systemoutprint(Introduce tu edad )

int edad = IntegerparseInt(snextLine())

Systemoutprintln(Tu nombre es + nombre + y tu edad es + edad)

Fiacutejate que en el programa anterior la sentencia

snextLine()

seriacutea el equivalente a

Systemconsole()readLine()`

Mediante el uso de la clase Scanner es posible leer varios datos en una misma liacutenea Enel programa anterior se pediacutea un nombre y una edad en total dos datos que habiacutea queintroducir en liacuteneas separadas Observa coacutemo en el siguiente ejemplo se piden esosdos datos en una sola liacutenea y separados por un espacio

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScanner02

Lectura de datos desde teclado 20

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tu nombre y tu edad separados por un espacio )

String nombre = snext()

int edad = snextInt()

Systemoutprintln(Tu nombre es + nombre + y tu edad es + edad)

Fiacutejate coacutemo se ha utilizado snext() para leer una cadena de caracteres y snextInt()

para leer un nuacutemero entero todo ello en la misma liacuteneaEl siguiente programa de ejemplo calcula la media de tres nuacutemeros decimales Paraleer cada uno de los nuacutemeros en la misma liacutenea se utiliza snextDouble

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScannerMedia

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tres nuacutemeros (pueden contener decimales) separados por esp

acios )

double x1 = snextDouble()

double x2 = snextDouble()

double x3 = snextDouble()

double media = (x1 + x2 + x3) 3

Systemoutprintln(La media de esos tres nuacutemeros es + media)

Lectura de datos desde teclado 21

Recuerda que iexcla programar se aprende programando Es muy importanteque pruebes los ejemplos - si los modificas y experimentas todaviacutea mejor - yque realices los ejercicios Para aprender a programar no basta con leer el libroy entenderlo es una condicioacuten necesaria pero no suficiente Igual que paraser piloto hacen falta muchas horas de vuelo para ser programador hacenfalta muchas horas picando coacutedigo probando corrigiendo erroreshellip iexclAacutenimoiexclEl esfuerzo merece la pena

Lectura de datos desde teclado 22

34 Ejercicios

Ejercicio 1Realiza un programa que pida dos nuacutemeros y que luego muestre el resultadode su multiplicacioacuten

Ejercicio 2Realiza un conversor de euros a pesetas La cantidad de euros que se quiereconvertir debe ser introducida por teclado

Ejercicio 3Realiza un conversor de pesetas a euros La cantidad de pesetas que se quiereconvertir debe ser introducida por teclado

Ejercicio 4Escribe un programa que sume reste multiplique y divida dos nuacutemerosintroducidos por teclado

Ejercicio 5Escribe un programa que calcule el aacuterea de un rectaacutengulo

Ejercicio 6Escribe un programa que calcule el aacuterea de un triaacutengulo

Ejercicio 7Escribe un programa que calcule el total de una factura a partir de la baseimponible

Ejercicio 8Escribe un programa que calcule el salario semanal de un empleado en basea las horas trabajadas a razoacuten de 12 euros la hora

Lectura de datos desde teclado 23

Ejercicio 9Escribe un programa que calcule el volumen de un cono seguacuten la foacutermula V =13πr

2h

Ejercicio 10Realiza un conversor de Mb a Kb

Ejercicio 11Realiza un conversor de Kb a Mb

Ejercicio 12Escribe un programa que calcule el precio final de un producto seguacuten subase imponible (precio antes de impuestos) el tipo de IVA aplicado (generalreducido o superreducido) y el coacutedigo promocional Los tipos de IVA generalreducido y superreducido son del 21 10 y 4 respectivamente Los coacutedi-gos promocionales pueden ser nopro mitad meno5 o 5porc que significanrespectivamente que no se aplica promocioacuten el precio se reduce a la mitadse descuentan 5 euros o se descuenta el 5 El ejercicio se da por bueno si semuestran los valores correctos aunque los nuacutemeros no esteacuten tabuladosEjemplo

Introduzca la base imponible 25

Introduzca el tipo de IVA (general reducido o superreducido) reducido

Introduzca el coacutedigo promocional (nopro mitad meno5 o 5porc) mitad

Base imponible 2500

IVA (10) 250

Precio con IVA 2750

Coacuted promo (mitad) -1375

TOTAL 1375

Lectura de datos desde teclado 24

Ejercicio 13Realiza un programa que calcule la nota que hace falta sacar en el segundoexamen de la asignatura Programacioacuten para obtener la media deseada Hayque tener en cuenta que la nota del primer examen cuenta el 40 y la delsegundo examen un 60Ejemplo 1

Introduce la nota del primer examen 7

iquestQueacute nota quieres sacar en el trimestre 85

Para tener un 85 en el trimestre necesitas sacar un 95 en el segundo examen

Ejemplo 2

Introduce la nota del primer examen 8

iquestQueacute nota quieres sacar en el trimestre 7

Para tener un 7 en el trimestre necesitas sacar un 633 en el segundo examen

4 Sentencia condicional (if y switch)Una sentencia condicional permite al programa bifurcar el flujo de ejecucioacuten deinstrucciones dependiendo del valor de una expresioacuten

41 Sentencia if

La sentencia if permite la ejecucioacuten de una serie de instrucciones en funcioacuten delresultado de una expresioacuten loacutegica El resultado de evaluar una expresioacuten loacutegica essiempre verdadero (true) o falso (false) Es muy simple en lenguaje natural seriacutea algocomo rdquosi esta condicioacuten es verdadera entonces haz esto sino haz esto otrordquoEl formato de la sentencia if es el siguiente

if (condicioacuten)

instrucciones a ejecutar si la condicioacuten es verdadera

else

instrucciones a ejecutar si la condicioacuten es falsa

A continuacioacuten se muestra un ejempo del uso de la sentencia if

Sentencia if author Luis J Saacutenchez

public class SentenciaIf01

public static void main(String[] args)

Systemoutprint(iquestCuaacutel es la capital de Kiribati )

String respuesta = Systemconsole()readLine()

if (respuestaequals(Tarawa))

Systemoutprintln(iexclLa respuesta es correcta)

else

Systemoutprintln(Lo siento la respuesta es incorrecta)

25

Sentencia condicional (if y switch) 26

En el programa se le pregunta al usuario cuaacutel es la capital de Kiriwati La respuestaintroducida por el usuario se almacena en la variable respuesta A continuacioacuten vienela sentencia condicional if

if (respuestaequals(Tarawa))

Llegado a este punto el programa evaluacutea la expresioacuten respuestaequals(Tarawa)Observa que para comparar dos cadenas de caracteres se utiliza equals() Ima-ginemos que el usuario ha introducido por teclado Madrid entonces la expresioacutenMadridequals(Tarawa) dariacutea como resultado false (falso)Si la expresioacuten hubiera dado como resultado true (verdadero) se ejecutaria la liacutenea

Systemoutprintln(iexclLa respuesta es correcta)

pero no es el caso el resultado de la expresioacuten ha sido false (falso) todo el mundosabe que la capital de Kiriwati no es Madrid por tanto se ejecutariacutea la liacutenea

Systemoutprintln(Lo siento la respuesta es incorrecta)

Vamos a ver otro ejemplo esta vez con nuacutemeros El usuario introduciraacute un nuacutemero porteclado y el programa diraacute si se trata de un nuacutemero positivo o negativo

Sentencia if author Luis J Saacutenchez

public class SentenciaIf02

public static void main(String[] args)

Systemoutprint(Por favor introduce un nuacutemero entero )

String linea = Systemconsole()readLine()

int x = IntegerparseInt( linea )

if (x lt 0)

Systemoutprintln(El nuacutemero introducido es negativo)

else

Systemoutprintln(El nuacutemero introducido es positivo)

El siguiente bloque de coacutedigo

Sentencia condicional (if y switch) 27

if (x lt 0)

Systemoutprintln(El nuacutemero introducido es negativo)

elseSystemoutprintln(El nuacutemero introducido es positivo)

compilariacutea y funcionariacutea sin problemas - fiacutejate que hemos quitado las llaves - ya queantes y despueacutes del else hay una sola sentencia y en estos casos no es obligatorioponer llaves Sin embargo nosotros siempre usaremos llaves es una exigencia delestaacutendar de Google al que nos centildeimos en este manual

Llaves egipcias (egyptian brackets)Fiacutejate en la manera de colocar las llaves dentro del coacutedigo de un programaen Java La llave de apertura de bloque se coloca justo al final de la liacutenea y lallave de cierre va justo al principio de la liacutenea Se llaman llaves egipcias1 porla similitud entre las llaves y las manos de los egipcios que aparecen en lospapiros

1httpblogcodinghorrorcomnew-programming-jargon

Sentencia condicional (if y switch) 28

42 Operadores de comparacioacuten

En el ejemplo anterior usamos el operador lt en la comparacioacuten if (x lt 0) para saber sila variable x es menor que cero Hay maacutes operadores de comparacioacuten en la siguientetabla se muestran todos

OPERADOR NOMBRE EJEMPLO DESCRIPCIOacuteN== igual a == b a es igual a b= distinto a = b a es distinto de blt menor que a lt b a es menor que bgt mayor que a gt b a es mayor que b

lt= mayor o igual que a gt = b a es mayor o igual que b

El siguiente ejemplo muestra el uso de uno de estos operadores concretamente de gt=

(mayor o igual) El usuario introduce una nota si esta nota es mayor o igual a 5 sele mostraraacute un mensaje diciendo que ha aprobado y en caso de que no se cumpla lacondicioacuten se mostraraacute un mensaje diciendo que estaacute suspenso

Sentencia if author Luis J Saacutenchez

public class SentenciaIf03

public static void main(String[] args)

Systemoutprint(iquestQueacute nota has sacado en el uacuteltimo examen )

String line = Systemconsole()readLine()

double nota = DoubleparseDouble( line )

if (nota gt= 5)

Systemoutprintln(iexclEnhorabuena iexclhas aprobado)

else

Systemoutprintln(Lo siento has suspendido)

Sentencia condicional (if y switch) 29

43 Operadores loacutegicos

Los operadores de comparacioacuten se pueden combinar con los operadores loacutegicos Porejemplo si queremos saber si la variable a es mayor que b y ademaacutes es menor que cescribiriacuteamos if ((a gt b) ampamp (a lt c)) En la siguiente tabla se muestran los operadoresloacutegicos de Java

OPERADOR NOMBRE EJEMPLO DEVUELVEVERDADEROCUANDOhellip

ampamp y (7 gt 2) ampamp (2 lt 4) las dos condicionesson verdaderas

|| o (7 gt 2) || (2 lt 4) al menos una de lascondiciones es

verdadera no (7 gt 2) la condicioacuten es falsa

Vamos a ver coacutemo funcionan los operadores loacutegicos con un ejemplo Mediante if ((n lt

1) || (n gt 100)) se pueden detectar los nuacutemeros que no estaacuten en el rango de 1 a 100literalmente seriacutea ldquosi n es menor que 1 o n es mayor que 100rdquo

Operadores loacutegicos author Luis J Saacutenchez

public class OperadoresLogicos01

public static void main(String[] args)

Systemoutprintln(Adivina el nuacutemero que estoy pensando)

Systemoutprint(Introduce un nuacutemero entre el 1 y el 100 )

String linea = Systemconsole()readLine()

int n = IntegerparseInt( linea )

if ((n lt 1) || (n gt 100))

Systemoutprintln(El nuacutemero introducido debe estar en el intervalo 1 - 100)

Systemoutprint(Tienes otra oportunidad introduce un nuacutemero )

linea = Systemconsole()readLine()

n = IntegerparseInt( linea )

if (n == 24)

Systemoutprintln(iexclEnhorabuena iexclhas acertado)

else

Systemoutprintln(Lo siento ese no es el nuacutemero que estoy pensando)

Sentencia condicional (if y switch) 30

En el siguiente programa puedes ver el uso de operadores loacutegicos combinado conoperadores relacionales (operadores de comparacioacuten) Intenta adivinar cuaacutel seraacute elresultado mirando el coacutedigo

Operadores loacutegicos y relacionales author Luis J Saacutenchez

public class OperadoresLogicos02

public static void main(String[] args)

boolean a = trueboolean b = falseSystemoutprintln(a = + a)

Systemoutprintln(b = + b)

Systemoutprintln(a ampamp b = + (a ampamp b))

Systemoutprintln(a || b = + (a || b))

Systemoutprintln(a = + a)

Systemoutprintln(a || (6 gt 10) = + (a || (6 gt 10)))

Systemoutprintln(((4 lt= 4) || false) ampamp (a) = + (((4 lt= 4) || false) ampamp (a)))

Sentencia condicional (if y switch) 31

44 Sentencia switch (seleccioacuten muacuteltiple)

A veces es necesario comparar el valor de una variable con una serie de valoresconcretos La seleccioacuten muacuteltiple es muy parecida (aunque no es exactamente igual) auna secuencia de varias sentencias ifEl formato de switch es el que se muestra a continuacioacuten En legunaje natural seriacutea algoasiacute como ldquoSi variable vale valor1 entonces entra por case valor1 si variable vale valor2

entonces entra por case valor2hellip si variable no vale ninguno de los valores que hay enlos distintos case entonces entra por default

switch(variable)

case valor1

sentencias

break

case valor2

sentencias

break

default

sentencias

A continuacioacuten tienes un ejemplo completo en Java Se pide al usuario un nuacutemero demes y el programa da el nombre del mes que corresponde a ese nuacutemero

Sentencia muacuteltiple (switch) author Luis Joseacute Saacutenchez

public class SentenciaSwitch

public static void main(String[] args)

Systemoutprint(Por favor introduzca un numero de mes )

int mes = IntegerparseInt(Systemconsole()readLine())

String nombreDelMes

switch (mes)

Sentencia condicional (if y switch) 32

case 1

nombreDelMes = enero

breakcase 2

nombreDelMes = febrero

breakcase 3

nombreDelMes = marzo

breakcase 4

nombreDelMes = abril

breakcase 5

nombreDelMes = mayo

breakcase 6

nombreDelMes = junio

breakcase 7

nombreDelMes = julio

breakcase 8

nombreDelMes = agosto

breakcase 9

nombreDelMes = septiembre

breakcase 10

nombreDelMes = octubre

breakcase 11

nombreDelMes = noviembre

breakcase 12

nombreDelMes = diciembre

breakdefault

nombreDelMes = no existe ese mes

Systemoutprintln(Mes + mes + + nombreDelMes)

Observa que es necesario introducir un break despueacutes de la asignacioacuten de la variable

Sentencia condicional (if y switch) 33

nombreDelMes En caso de no encontrarse el break el programa continuacutea la ejecucioacuten enla liacutenea siguienteEl bloque que corresponde al default se ejecuta cuando la variable no coincide conninguno de los valores de los case Escribiremos siempre el default al final de lasentencia switch aunque no sea necesarioLa sentencia switch se utiliza con frecuencia para crear menuacutes

Ejemplo de un menuacute con switch author Luis Joseacute Saacutenchez

public class MenuConSwitch

public static void main(String[] args)

Systemoutprintln( CAacuteLCULO DE AacuteREAS)

Systemoutprintln( ----------------)

Systemoutprintln( 1 Cuadrado)

Systemoutprintln( 2 Rectaacutengulo)

Systemoutprintln( 3 Triaacutengulo)

Systemoutprint(n Elija una opcioacuten (1-3) )

int opcion = IntegerparseInt(Systemconsole()readLine())

double lado

double base

double altura

switch (opcion)

case 1

Systemoutprint(nIntroduzca el lado del cuadrado en cm )

lado = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(nEl aacuterea del cuadrado es + (lado lado) + cm2)

break

case 2

Systemoutprint(nIntroduzca la base del rectaacutengulo en cm )

base = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura del rectaacutengulo en cm )

altura = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El aacuterea del rectaacutengulo es + (base altura) + cm2)

break

Sentencia condicional (if y switch) 34

case 3

Systemoutprint(nIntroduzca la base del triaacutengulo en cm )

base = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura del triaacutengulo en cm )

altura = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El aacuterea del triaacutengulo es + ((base altura) 2) + cm2)

break

default

Systemoutprint(nLo siento la opcioacuten elegida no es correcta)

Sentencia condicional (if y switch) 35

45 Ejercicios

Ejercicio 1Escribe un programa que pida por teclado un diacutea de la semana y que diga queacuteasignatura toca a primera hora ese diacutea

Ejercicio 2Realiza un programa que pida una hora por teclado y que muestre luegobuenos diacuteas buenas tardes o buenas noches seguacuten la hora Se utilizaraacuten lostramos de 6 a 12 de 13 a 20 y de 21 a 5 respectivamente Soacutelo se tienen encuenta las horas los minutos no se deben introducir por teclado

Ejercicio 3Escribe un programa en que dado un nuacutemero del 1 a 7 escriba el correspon-diente nombre del diacutea de la semana

Ejercicio 4Vamos a ampliar uno de los ejercicios de la relacioacuten anterior para considerarlas horas extras Escribe un programa que calcule el salario semanal de untrabajador teniendo en cuenta que las horas ordinarias (40 primeras horas detrabajo) se pagan a 12 euros la hora A partir de la hora 41 se pagan a 16euros la hora

Ejercicio 5Realiza un programa que resuelva una ecuacioacuten de primer grado (del tipo ax+b = 0)

Ejercicio 6Realiza un programa que calcule el tiempo que tardaraacute en caer un objeto desdeuna altura h Aplica la foacutermula t =

radic2hg siendo g = 981ms2

Ejercicio 7Realiza un programa que calcule la media de tres notas

Sentencia condicional (if y switch) 36

Ejercicio 8Ampliacutea el programa anterior para que diga la nota del boletiacuten (insuficientesuficiente bien notable o sobresaliente)

Ejercicio 9Realiza un programa que resuelva una ecuacioacuten de segundo grado (del tipoax2 + bx+ c = 0)

Ejercicio 10Escribe un programa que nos diga el horoacutescopo a partir del diacutea y el mes denacimiento

Ejercicio 11Escribe un programa que dada una hora determinada (horas y minutos)calcule los segundos que faltan para llegar a la medianoche

Ejercicio 12Realiza un minicuestionario con 10 preguntas tipo test sobre las asignaturasque se imparten en el curso Cada pregunta acertada sumaraacute un punto Elprograma mostraraacute al final la calificacioacuten obtenida Paacutesale el minicuestionarioa tus compantildeeros y piacutedeles que lo hagan para ver queacute tal andan de conoci-mientos en las diferentes asignaturas del curso

Ejercicio 13Escribe un programa que ordene tres nuacutemeros enteros introducidos porteclado

Ejercicio 14Realiza un programa que diga si un nuacutemero introducido por teclado es par yodivisible entre 5

Ejercicio 15Escribe un programa que pinte una piraacutemide rellena con un caraacutecter introdu-cido por teclado que podraacute ser una letra un nuacutemero o un siacutembolo como +- $ amp etc El programa debe permitir al usuario mediante un menuacute elegir siel veacutertice de la piraacutemide estaacute apuntando hacia arriba hacia abajo hacia laizquierda o hacia la derecha

Sentencia condicional (if y switch) 37

Ejercicio 16Realiza un programa que nos diga si hay probabilidad de que nuestra parejanos estaacute siendo infiel El programa iraacute haciendo preguntas que el usuariocontestaraacute con verdadero o falso Cada pregunta contestada como verdaderosumaraacute 3 puntos Las preguntas contestadas con falso no suman puntos Utili-za el fichero test_infidelidadtxt para obtener las preguntas y las conclusionesdel programa

Ejercicio 17Escribe un programa que diga cuaacutel es la uacuteltima cifra de un nuacutemero enterointroducido por teclado

Ejercicio 18Escribe un programa que diga cuaacutel es la primera cifra de un nuacutemero enterointroducido por teclado Se permiten nuacutemeros de hasta 5 cifras

Ejercicio 19Realiza un programa que nos diga cuaacutentos diacutegitos tiene un nuacutemero entero quepuede ser positivo o negativo Se permiten nuacutemeros de hasta 5 diacutegitos

Ejercicio 20Realiza un programa que diga si un nuacutemero entero positivo introducido porteclado es capicuacutea Se permiten nuacutemeros de hasta 5 cifras

Sentencia condicional (if y switch) 38

Ejercicio 21Calcula la nota de un trimestre de la asignatura Programacioacuten El programapediraacute las dos notas que ha sacado el alumno en los dos primeros controlesSi la media de los dos controles da un nuacutemero mayor o igual a 5 el alumnoestaacute aprobado y se mostraraacute la media En caso de que la media sea un nuacutemeromenor que 5 el alumno habraacute tenido que hacer el examen de recuperacioacutenque se califica como apto o no apto por tanto se debe preguntar al usuarioiquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) Si elresultado de la recuperacioacuten es apto la nota seraacute un 5 en caso contrario semantiene la nota media anteriorEjemplo 1

Nota del primer control 7

Nota del segundo control 10

Tu nota de Programacioacuten es 85

Ejemplo 2

Nota del primer control 6

Nota del segundo control 3

iquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) apto

Tu nota de Programacioacuten es 5

Ejemplo 3

Nota del primer control 6

Nota del segundo control 3

iquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) no apto

Tu nota de Programacioacuten es 45

Ejercicio 22Realiza un programa que dado un diacutea de la semana (de lunes a viernes) y unahora (horas y minutos) calcule cuaacutentos minutos faltan para el fin de semanaSe consideraraacute que el fin de semana comienza el viernes a las 1500h Se dapor hecho que el usuario introduciraacute un diacutea y hora correctos anterior al viernesa las 1500h

5 BuclesLos bucles se utilizan para repetir un conjunto de sentencias Por ejemplo imagina quees necesario introducir la notas de 40 alumnos con el fin de calcular la media la notamaacutexima y la nota miacutenima Podriacuteamos escribir 40 veces la intruccioacuten que pide un datopor teclado Systemconsole()readLine() y convertir cada uno de esos datos a un nuacutemerocon decimales con 40 instrucciones DoubleparseDouble() no parece algo muy eficienteEs mucho maacutes praacutectico meter dentro de un bucle aquellas sentencias que queremosque se repitanNormalmente existe una condicioacuten de salida que hace que el flujo del programaabandone el bucle y continuacutee justo en la siguiente sentencia Si no existe condicioacuten desalida o si esta condicioacuten no se cumple nunca se produciriacutea lo que se llama un bucleinfinito y el programa no terminariacutea nunca

51 Bucle for

Se suele utilizar cuando se conoce previamente el nuacutemero exacto de iteraciones(repeticiones) que se van a realizar La sintaxis es la siguiente

for (expresion1 expresion2 expresion3)

sentencias

Justo al principio se ejecuta expresion1 normalmente se usa para inicializar una variableEl bucle se repite mientras se cumple expresion2 y en cada iteraccioacuten del bucle seejecuta expresion3 que suele ser el incremento o decremento de una variable Conun ejemplo se veraacute mucho maacutes claro

Bucle for author Luis Joseacute Saacutenchez

public class EjemploFor

public static void main(String[] args)

for (int i = 1 i lt 11 i++)

Systemoutprintln(i)

39

Bucles 40

En este ejemplo int i = 1 se ejecuta solo una vez antes que cualquier otra cosa comoves esta expresioacuten se utiliza para inicializar la variable i a 1 Mientra se cumpla lacondicioacuten i lt 11 el contenido del bucle o sea Systemoutprintln(i) se va a ejecutarEn cada iteracioacuten del bucle i++ hace que la variable i se incremente en 1 El resultadodel ejemplo es la impresioacuten en pantalla de los nuacutemeros del 1 al 10Intenta seguir mentalmente el flujo del programa Experimenta inicializando la variablei con otros valores cambia la condicioacuten con gt o lt= y observa lo que sucede Pruebatambieacuten a cambiar el incremento de la variable i por ejemplo con i = i + 2

52 Bucle while

El bucle while se utiliza para repetir un conjunto de sentencias siempre que se cumplauna determinada condicioacuten Es importante resentildear que la condicioacuten se comprueba alcomienzo del bucle por lo que se podriacutea dar el caso de que dicho bucle no se ejecutasenunca La sintaxis es la siguiente

while (expresion)

sentencias

Las sentencias se ejecutan una y otra vez mientras expresion sea verdadera El siguienteejemplo produce la misma salida que el ejemplo anterior muestra coacutemo cambian losvalores de i del 1 al 10

Bucle while author Luis Joseacute Saacutenchez

public class EjemploWhile

public static void main(String[] args)

int i = 1

while (i lt 11)

Systemoutprintln(i)

Bucles 41

i++

En el siguiente ejemplo se cuentan y se suman los nuacutemeros que se van introduciendopor teclado Para indicarle al programa que debe dejar de pedir nuacutemeros el usuariodebe introducir un nuacutemero negativo esa seraacute la condicioacuten de salida del bucle Observaque el bucle se repite mientras el nuacutemero introducido sea mayor o igual que cero

Bucle while que termina cuando se introduce por teclado un nuacutemero negativo author Luis Joseacute Saacutenchez

public class CuentaPositivos

public static void main(String[] args)

Systemoutprintln(Por favor vaya introduciendo nuacutemeros y pulsando INTRO)

Systemoutprintln(Para terminar introduzca un nuacutemero negativo)

int numeroIntroducido = 0

int cuentaNumeros = 0

int suma = 0

while (numeroIntroducido gt= 0)

numeroIntroducido = IntegerparseInt(Systemconsole()readLine())

cuentaNumeros++ Incrementa en uno la variablesuma += numeroIntroducido Equivale a suma = suma + NumeroIntroducido

Systemoutprintln(Has introducido + (cuentaNumeros - 1) + nuacutemeros positivos)

Systemoutprintln(La suma total de ellos es + (suma - numeroIntroducido))

53 Bucle do-while

El bucle do-while funciona de la misma manera que el bucle while con la salvedad deque expresion se evaluacutea al final de la iteraccioacuten Las sentencias que encierran el bucledo-while por tanto se ejecutan como miacutenimo una vez La sintaxis es la siguiente

Bucles 42

do

sentencias

while (expresion)

El siguiente ejemplo es el equivalente do-while a los dos ejemplos anteriores quecuentan del 1 al 10

Bucle do-while author Luis Joseacute Saacutenchez

public class EjemploDoWhile

public static void main(String[] args)

int i = 1

do

Systemoutprintln(i)

i++

while (i lt 11)

Veamos otro ejemplo En este caso se van a ir leyendo nuacutemeros de teclado mientrasel nuacutemero introducido sea par el programa pararaacute por tanto cuando se introduzcaun nuacutemero impar

Bucle do-while que termina cuando se introduce por teclado un nuacutemero impar author Luis Joseacute Saacutenchez

public class TerminaCuandoEsImpar

public static void main(String[] args)

int numero

Bucles 43

do

Systemoutprint(Dime un nuacutemero )

numero = IntegerparseInt(Systemconsole()readLine())

if (numero 2 == 0) comprueba si el nuacutemero introducido es parSystemoutprintln(Queacute bonito es el + numero)

else

Systemoutprintln(No me gustan los nuacutemeros impares adioacutes)

while (numero 2 == 0)

Te invito a que realices una modificacioacuten sobre este uacuteltimo ejemplo Despueacutes de pedirun nuacutemero haz que el programa diga iquestQuiere continuar (sn) Si el usuario introduceuna s o una S el programa deberaacute continuar pidiendo nuacutemerosCualquier bucle que un programador quiera realizar en Java lo puede implementar confor while o do-while por tanto con una sola de estas tres opciones tendriacutea suficienteNo obstante seguacuten el programa en cuestioacuten una u otra posibilidad se adapta mejorque las otras y resulta maacutes elegante Con la experiencia te iraacutes dando cuenta cuaacutendoes mejor utilizar cada una

Bucles 44

54 Ejercicios

Ejercicio 1Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle for

Ejercicio 2Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle while

Ejercicio 3Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle do-while

Ejercicio 4Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 hacia atraacutesutilizando un bucle for

Ejercicio 5Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 hacia atraacutesutilizando un bucle while

Ejercicio 6Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 utilizando un bucledo-while

Ejercicio 7Realiza el control de acceso a una caja fuerte La combinacioacuten seraacute unnuacutemero de 4 cifras El programa nos pediraacute la combinacioacuten para abrirla Si noacertamos se nos mostraraacute el mensaje ldquoLo siento esa no es la combinacioacutenrdquoy si acertamos se nos diraacute ldquoLa caja fuerte se ha abierto satisfactoriamenterdquoTendremos cuatro oportunidades para abrir la caja fuerte

Ejercicio 8Muestra la tabla de multiplicar de un nuacutemero introducido por teclado

Bucles 45

Ejercicio 9Realiza un programa que nos diga cuaacutentos diacutegitos tiene un nuacutemero introducidopor teclado

Ejercicio 10Escribe un programa que calcule la media de un conjunto de nuacutemeros positivosintroducidos por teclado A priori el programa no sabe cuaacutentos nuacutemeros seintroduciraacuten El usuario indicaraacute que ha terminado de introducir los datoscuando meta un nuacutemero negativo

Ejercicio 11Escribe un programa que muestre en tres columnas el cuadrado y el cubo delos 5 primeros nuacutemeros enteros a partir de uno que se introduce por teclado

Ejercicio 12Escribe un programa que muestre los n primeros teacuterminos de la serie deFibonacci El primer teacutermino de la serie de Fibonacci es 0 el segundo es 1y el resto se calcula sumando los dos anteriores por lo que tendriacuteamos quelos teacuterminos son 0 1 1 2 3 5 8 13 21 34 55 89 144hellip El nuacutemero n sedebe introducir por teclado

Ejercicio 13Escribe un programa que lea una lista de diez nuacutemeros y determine cuaacutentosson positivos y cuaacutentos son negativos

Ejercicio 14Escribe un programa que pida una base y un exponente (entero positivo) yque calcule la potencia

Ejercicio 15Escribe un programa que dados dos nuacutemeros uno real (base) y un enteropositivo (exponente) saque por pantalla todas las potencias con base elnumero dado y exponentes entre uno y el exponente introducido No se debenutilizar funciones de exponenciacioacuten Por ejemplo si introducimos el 2 y el 5se deberaacuten mostrar 21 22 23 24 y 25

Bucles 46

Ejercicio 16Escribe un programa que diga si un nuacutemero introducido por teclado es o noprimo Un nuacutemero primo es aquel que soacutelo es divisible entre eacutel mismo y launidad

Ejercicio 17Realiza un programa que sume los 100 nuacutemeros siguientes a un nuacutemero enteroy positivo introducido por teclado Se debe comprobar que el dato introducidoes correcto (que es un nuacutemero positivo)

Ejercicio 18Escribe un programa que obtenga los nuacutemeros enteros comprendidos entredos nuacutemeros introducidos por teclado y validados como distintos el programadebe empezar por el menor de los enteros introducidos e ir incrementando de7 en 7

Ejercicio 19Realiza un programa que pinte una piraacutemide por pantalla La altura se debepedir por teclado El caraacutecter con el que se pinta la piraacutemide tambieacuten se debepedir por teclado

Ejercicio 20Igual que el ejercicio anterior pero esta vez se debe pintar una piraacutemide hueca

Ejercicio 21Realiza un programa que vaya pidiendo nuacutemeros hasta que se introduzca unnumero negativo y nos diga cuantos nuacutemeros se han introducido la media delos impares y el mayor de los pares El nuacutemero negativo soacutelo se utiliza paraindicar el final de la introduccioacuten de datos pero no se incluye en el coacutemputo

Ejercicio 22Muestra por pantalla todos los nuacutemeros primos entre 2 y 100 ambos incluidos

Bucles 47

Ejercicio 23Escribe un programa que permita ir introduciendo una serie indeterminadade nuacutemeros mientras su suma no supere el valor 10000 Cuando esto uacuteltimoocurra se debe mostrar el total acumulado el contador de los nuacutemerosintroducidos y la media

Ejercicio 24Escribe un programa que lea un nuacutemero n e imprima una piraacutemide de nuacutemeroscon n filas como en la siguiente figura

1

121

12321

1234321

Ejercicio 25Realiza un programa que pida un nuacutemero por teclado y que luego muestre esenuacutemero al reveacutes

Ejercicio 26Realiza un programa que pida primero un nuacutemero y a continuacioacuten un diacutegitoEl programa nos debe dar la posicioacuten (o posiciones) contando de izquierda aderecha que ocupa ese diacutegito en el nuacutemero introducido

Ejercicio 27Escribe un programa que muestre cuente y sume los muacuteltiplos de 3 que hayentre 1 y un nuacutemero leiacutedo por teclado

Ejercicio 28Escribe un programa que calcule el factorial de un nuacutemero entero leiacutedo porteclado

Ejercicio 29Escribe un programa que muestre por pantalla todos los nuacutemeros enterospositivos menores a uno leiacutedo por teclado que no sean divisibles entre otrotambieacuten leiacutedo de igual forma

Bucles 48

Ejercicio 30Realiza una programa que calcule las horas transcurridas entre dos horas dedos diacuteas de la semana No se tendraacuten en cuenta los minutos ni los segundosEl diacutea de la semana se puede pedir como un nuacutemero (del 1 al 7) o comouna cadena (de ldquolunesrdquo a ldquodomingordquo) Se debe comprobar que el usuariointroduce los datos correctamente y que el segundo diacutea es posterior al primeroA continuacioacuten se muestra un ejemplo

Por favor introduzca la primera hora

Diacutea lunes

Hora 18

Por favor introduzca la segunda hora

Diacutea martes

Hora 20

Entre las 1800h del lunes y las 2000h del martes hay 26 horas

Ejercicio 31Realiza un programa que pinte la letra L por pantalla hecha con asteriscos Elprograma pediraacute la altura El palo horizontal de la L tendraacute una longitud de lamitad (divisioacuten entera entre 2) de la altura maacutes unoEjemplo

Introduzca la altura de la L 5

Bucles 49

Ejercicio 32Escribe un programa que dado un nuacutemero entero diga cuaacuteles son y cuaacutentosuman los diacutegitos pares Los diacutegitos pares se deben mostrar en orden deizquierda a derecha Usa long en lugar de int donde sea necesario para admitirnuacutemeros largosEjemplo 1

Por favor introduzca un nuacutemero entero positivo 94026782

Diacutegitos pares 4 0 2 6 8 2

Suma de los diacutegitos pares 22

Ejemplo 2

Por favor introduzca un nuacutemero entero positivo 31779

Diacutegitos pares

Suma de los diacutegitos pares 0

Ejemplo 3

Por favor introduzca un nuacutemero entero positivo 2404

Diacutegitos pares 2 4 0 4

Suma de los diacutegitos pares 10

Ejercicio 33Realiza un programa que pinte la letra U por pantalla hecha con asteriscos Elprograma pediraacute la altura Fiacutejate que el programa inserta un espacio y pintados asteriscos menos en la base para simular la curvatura de las esquinasinferioresEjemplo

Introduzca la altura de la U 5

Bucles 50

Ejercicio 34Escribe un programa que pida dos nuacutemeros por teclado y que luego mezcle endos nuacutemeros diferentes los diacutegitos pares y los impares Se van comprobandolos diacutegitos de la siguiente manera primer diacutegito del primer nuacutemero primerdiacutegito del segundo nuacutemero segundo diacutegito del primer nuacutemero segundodiacutegito del segundo nuacutemero tercer diacutegito del primer nuacutemerohellip Para facilitarel ejercicio podemos suponer que el usuario introduciraacute dos nuacutemeros de lamisma longitud y que siempre habraacute al menos un diacutegito par y uno impar Usalong en lugar de int donde sea necesario para admitir nuacutemeros largosEjemplo 1

Por favor introduzca un nuacutemero 9402

Introduzca otro nuacutemero 6782

El nuacutemero formado por los diacutegitos pares es 640822

El nuacutemero formado por los diacutegitos impares es 97

Ejemplo 2

Por favor introduzca un nuacutemero 137

Introduzca otro nuacutemero 909

El nuacutemero formado por los diacutegitos pares es 0

El nuacutemero formado por los diacutegitos impares es 19379

6 Nuacutemeros aleatoriosLos nuacutemeros aleatorios se utilizan con frecuencia en programacioacuten para emular elcomportamiento de alguacuten fenoacutemeno natural el resultado de un juego de azar o engeneral para generar cualquier valor impredecible a prioriPor ejemplo se pueden utilizar nuacutemeros aleatorios para generar tiradas de dados detal forma que de antemano no se puede saber el resultado Antes de tirar un dado nosabemos si saldraacute un 3 o un 5 se trataraacute pues de un nuacutemero impredecible lo que siacutesabemos es que saldraacute un nuacutemero entre el 1 y el 6 es decir podemos acotar el rangode los valores que vamos a obtener de forma aleatoria

61 Generacioacuten de nuacutemeros aleatorios con y sin decimales

Para generar valores aleatorios utilizaremos Mathrandom() Esta funcioacuten genera unnuacutemero con decimales (de tipo double) en el intervalo [0 - 1) es decir genera un nuacutemeromayor o igual que 0 y menor que 1El siguiente programa genera diez nuacutemeros aleatorios

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio01

public static void main(String[] args)

Systemoutprintln(Diez nuacutemeros aleatoriosn)

for (int i = 1 i lt 11 i++)

Systemoutprintln(Mathrandom())

La salida del programa puede ser algo como esto

51

Nuacutemeros aleatorios 52

030830376099567813

08330493363981046

02322483682676435

03130746053770094

034192944433558736

09636470440975567

03398896383918959

079825461825305

09868509622870223

09967893773101499

Te invito a que ejecutes varias veces el programa Podraacutes observar que cada vez salennuacutemeros diferentes aunque siempre estaacuten comprendidos entre 0 y 1 (incluyendo el0)Pensaraacutes que no es muy uacutetil generar nuacutemeros aleatorios entre 0 y 1 si lo que queremoses por ejemplo sacar una carta al azar de la baraja espantildeola pero en realidad unnuacutemero decimal entre 0 y 1 es lo uacutenico que nos hace falta para generar cualquier tipode valor aleatorio siempre y cuando se manipule ese nuacutemero de la forma adecuadaPor ejemplo si queremos generar valores aleatorios entre 0 y 10 (incluyendo el 0 y sinllegar a 10) simplemente tendremos que correr la coma un lugar o lo que es lo mismomultiplicar por 10

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio02

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 0 y 10)

Systemoutprintln( sin llegar a 10 (con decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprintln( Mathrandom()10 + )

El programa anterior genera una salida como eacutesta

Nuacutemeros aleatorios 53

007637674702636321

1025787417143682

1854993461897163

5690351111720931

382310645589797

5518007662236258

923529380254256

39201032643833376

5836554253122096

6224559064261578

7652976185871555

49922807025365135

7498156441347868

8743251697509109

9727764845406675

2929766691797686

005801413446517634

21575652936687284

Si queremos generar nuacutemeros enteros en lugar de nuacutemeros con decimales basta conhacer un casting para convertir los nuacutemeros de tipo double en nuacutemeros de tipo intRecuerda que (int)x transforma x en una variable de tipo entero si x era de tipo float

o double perderiacutea todos los decimales

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio03

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 0 y 9 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint((int)(Mathrandom()10) + )

Systemoutprintln()

La salida del programa debe ser algo muy parecido a esto

Nuacutemeros aleatorios 54

20 nuacutemeros aleatorios entre 0 y 9 (sin decimales)

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

iquestY si en lugar de generar nuacutemeros enteros entre 0 y 9 queremos generar nuacutemeros entre1 y 10 Como habraacutes podido adivinar simplemente habriacutea que sumar 1 al nuacutemerogenerado de esta forma se ldquodesplazan un pasordquo los valores generados al azar de talforma que el miacutenimo valor que se produce seriacutea el 0 + 1 = 1 y el maacuteximo seriacutea 9 + 1= 10

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio04

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 1 y 10 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint( (int)(Mathrandom()10 + 1) + )

Systemoutprintln()

Vamos a ponerlo un poco maacutes difiacutecil Ahora vamos a generar nuacutemeros enteros entre50 y 60 ambos incluidos Primero multiplicamos Mathrandom() por 11 con lo queobtenemos nuacutemeros decimales entre 0 y 109999hellip (sin llegar nunca hasta 11) Luegodesplazamos ese intervalo sumando 50 por lo que obtenemos nuacutemeros decimalesentre 50 y 609999hellip Por uacuteltimo quitamos los decimales haciendo casting y voilagraveya tenemos nuacutemeros enteros aleatorios entre 50 y 60 ambos incluidos

Nuacutemeros aleatorios 55

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio05

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 50 y 60 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint(((int)(Mathrandom()11) + 50 ) + )

Systemoutprintln()

62 Generacioacuten de palabras de forma aleatoria de un conjuntodado

Hemos visto coacutemo generar nuacutemeros aleatorios con y sin decimales y en diferentesintervalos Vamos a producir ahora de forma aleatoria una palabra - piedra papel otijera - generando primero un nuacutemero entero entre 0 y 2 y posteriormente haciendocorresponder una palabra a cada nuacutemero

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio06

public static void main(String[] args)

Systemoutprintln(Genera al azar piedra papel o tijera)

int mano = (int)(Mathrandom()3) genera un nuacutemero al azar entre 0 y 2 ambos incluidos

switch(mano)

case 0

Systemoutprintln(piedra)

Nuacutemeros aleatorios 56

breakcase 1

Systemoutprintln(papel)

breakcase 2

Systemoutprintln(tijera)

breakdefault

iquestCoacutemo podriacuteamos generar un diacutea de la semana de forma aleatoria En efecto primerogeneramos un nuacutemero entre 1 y 7 ambos inclusive y luego hacemos corresponder undiacutea de la semana a cada uno de los nuacutemeros

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio07

public static void main(String[] args)

Systemoutprintln(Muestra un diacutea de la semana al azar)

int dia = (int)(Mathrandom()7) + 1 genera un nuacutemero aleatorio entre el 1 y el 7

switch(dia)

case 1

Systemoutprintln(lunes)

breakcase 2

Systemoutprintln(martes)

breakcase 3

Systemoutprintln(mieacutercoles) breakcase 4

Systemoutprintln(jueves)

breakcase 5

Systemoutprintln(viernes)

breakcase 6

Nuacutemeros aleatorios 57

Systemoutprintln(saacutebado)

breakcase 7

Systemoutprintln(domingo)

breakdefault

Nuacutemeros aleatorios 58

63 Ejercicios

Ejercicio 1Escribe un programa que muestre la tirada de tres dados Se debe mostrartambieacuten la suma total (los puntos que suman entre los tres dados)

Ejercicio 2Realiza un programa que muestre al azar el nombre de una carta de labaraja francesa Esta baraja estaacute dividida en cuatro palos picas corazonesdiamantes y treacuteboles Cada palo estaacute formado por 13 cartas de las cuales 9cartas son numerales y 4 literales 2 3 4 5 6 7 8 9 10 J Q K y A (queseriacutea el 1) Para convertir un nuacutemero en una cadena de caracteres podemosusar StringvalueOf(n)

Ejercicio 3Igual que el ejercicio anterior pero con la baraja espantildeola Se utilizaraacute la barajade 40 cartas 2 3 4 5 6 7 sota caballo rey y as

Ejercicio 4Muestra 20 nuacutemeros enteros aleatorios entre 0 y 10 (ambos incluidos) sepa-rados por espacios

Ejercicio 5Muestra 50 nuacutemeros enteros aleatorios entre 100 y 199 (ambos incluidos)separados por espacios Muestra tambieacuten el maacuteximo el miacutenimo y la mediade esos nuacutemeros

Ejercicio 6Escribe un programa que piense un nuacutemero al azar entre 0 y 100 El usuariodebe adivinarlo y tiene para ello 5 oportunidades Despueacutes de cada intentofallido el programa diraacute cuaacutentas oportunidades quedan y si el nuacutemero intro-ducido es menor o mayor que el nuacutemero secreto

Ejercicio 7Escribe un programa que muestre tres apuestas de la quiniela en tres colum-nas para los 14 partidos y el pleno al quince (15 filas)

Nuacutemeros aleatorios 59

Ejercicio 8Modifica el programa anterior para que la probabilidad de que salga un 1 seade 12 la probabilidad de que salga x sea de 13 y la probabilidad de que salga2 sea de 16 Pista 12 = 36 y 13 = 26

Ejercicio 9Realiza un programa que vaya generando nuacutemeros aleatorios pares entre 0y 100 y que no termine de generar nuacutemeros hasta que no saque el 24 Elprograma deberaacute decir al final cuaacutentos nuacutemeros se han generado

Ejercicio 10Realiza un programa que pinte por pantalla diez liacuteneas formadas por carac-teres El caraacutecter con el que se pinta cada liacutenea se elige de forma aleatoriaentre uno de los siguientes - = | Las liacuteneas deben tener una longitudaleatoria entre 1 y 40 caracteres

Ejercicio 11Escribe un programa que muestre 20 notas generadas al azar Las notas debenaparecer de la forma suspenso suficiente bien notable o sobresaliente Alfinal apareceraacute el nuacutemero de suspensos el nuacutemero de suficientes el nuacutemerode bienes etc

Ejercicio 12Realiza un programa que llene la pantalla de caracteres aleatorios (a lo Matrix)con el coacutedigo ascii entre el 32 y el 126 Puedes hacer casting con (char) paraconvertir un entero en un caraacutecter

Ejercicio 13Escribe un programa que simule la tirada de dos dados El programa deberaacutecontinuar tirando los dados una y otra vez hasta que en alguna tirada los dosdados tengan el mismo valor

Ejercicio 14Realiza un programa que haga justo lo contrario a lo que hace el ejercicio 6El programa intentaraacute adivinar el nuacutemero que estaacutes pensando - un nuacutemeroentre 0 y 100 - teniendo para ello 5 oportunidades En cada intento fallido elprograma debe preguntar si el nuacutemero que estaacutes pensando es mayor o menorque el que te acaba de decir

Nuacutemeros aleatorios 60

Ejercicio 15Realiza un generador de melodiacutea con las siguientes condicionesa) Las notas deben estar generadas al azar Las 7 notas son do re mi fasol la y sib) Una melodiacutea estaacute formada por un nuacutemero aleatorio de notas mayor o iguala 4 menor o igual a 28 y siempre muacuteltiplo de 4 (4 8 12hellip)c) Cada grupo de 4 notas seraacute un compaacutes y estaraacute separado del siguientecompaacutes mediante la barra vertical ldquo|rdquo (Alt + 1) El final de la melodiacutea se marcacon dos barrasd) La uacuteltima nota de la melodiacutea debe coincidir con la primeraEjemplo 1

do mi fa mi | si do sol fa | fa re si do | sol mi re do ||

Ejemplo 2

la re mi sol | fa mi mi si | do la sol fa | fa re si sol | do sol mi re | fa la do la ||

Nuacutemeros aleatorios 61

Ejercicio 16Realiza un simulador de maacutequina tragaperras simplificada que cumpla lossiguientes requisitosa) El ordenador mostraraacute una tirada que consiste en mostrar 3 figuras Hay 5figuras posibles corazoacuten diamante herradura campana y limoacutenb) Si las tres figuras son diferentes se debe mostrar el mensaje ldquoLo sientoha perdidordquoc) Si hay dos figuras iguales y una diferente se debe mostrar el mensaje ldquoBienha recuperado su monedardquod) Si las tres figuras son iguales se debe mostrar ldquoEnhorabuena ha ganado10 monedasrdquoEjemplo 1

diamante diamante limoacuten

Bien ha recuperado su moneda

Ejemplo 2

herradura campana diamante

Lo siento ha perdido

Ejemplo 3

corazoacuten corazoacuten corazoacuten

Enhorabuena ha ganado 10 monedas

7 Arrays

71 Arrays de una dimensioacuten

Un array es un tipo de dato capaz de almacenar muacuteltiples valores Se utiliza paraagrupar datos muy parecidos por ejemplo si se necesita almacenar la temperaturamedia diaria en Maacutelaga durante el uacuteltimo antildeo se pueden utilizar las variables temp0temp1 temp2 temp3 temp4 hellip y asiacute hasta 365 variables distintas pero seriacutea poco praacutectico esmejor utilizar un array de nombre temp y usar un iacutendice para referanciar la temperaturade un diacutea concreto del antildeoEn matemaacuteticas un array de una dimensioacuten se llama vector En este libro noutilizaremos este teacutermino para no confundirlo con la clase Vector de JavaVeamos con un ejemplo coacutemo se crea y se utiliza un array

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array01

public static void main(String[] args)

int[] n se define n como un array de enterosn = new int[4] se reserva espacio para 4 enteros

n[0] = 26

n[1] = -30

n[2] = 0

n[3] = 100

Systemoutprint(Los valores del array n son los siguientes )

Systemoutprint(n[0] + + n[1] + + n[2] + + n[3])

int suma = n[0] + n[3]

Systemoutprintln(nEl primer elemento del array maacutes el uacuteltimo suman + suma)

Observa que el iacutendice de cada elemento de un array se indica entre corchetes de talforma que n[3] es el cuarto elemento ya que el primer iacutendice es el 0

62

Arrays 63

Array n

Iacutendice Valor0 261 -302 03 11

Fiacutejate que la definicioacuten del array y la reserva de memoria para los cuatro elementosque la componen se ha realizado en dos liacuteneas diferentes Se pueden hacer ambascosas en una sola liacutenea como veremos en el siguiente ejemplo

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array02

public static void main(String[] args)

definicioacuten del array y reserva de memoria en la misma liacuteneaint[] x = new int[5]

x[0] = 8

x[1] = 33

x[2] = 200

x[3] = 150

x[4] = 11

Systemoutprintln(El array x tiene 5 elementos iquestcuaacutel de ellos quiere ver)

Systemoutprint(Introduzca un nuacutemero del 0 al 4 )

int indice = IntegerparseInt(Systemconsole()readLine())

Systemoutprint(El elemento que se encuentra en la posicioacuten + indice)

Systemoutprintln( es el + x[indice])

El array x del ejemplo anterior se ha ido rellenando elemento a elemento Si se conocenpreviamente todos los valores iniciales del array se puede crear e inicializar en unasola liacutenea de la siguiente forma

int[] x = 8 33 200 150 11

Cada elemento del array se puede utilizar exactamente igual que cualquier otravariable es decir se le puede asignar un valor o se puede usar dentro de una

Arrays 64

expresioacuten En el siguiente ejemplo se muestran varias operaciones en las que losoperandos son elementos del array numPara recorrer todos los elementos de un array se suele utilizar un bucle for junto conun iacutendice que va desde 0 hasta el tamantildeo del array menos 1

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array03

public static void main(String[] args)

int[] num = new int[10]

num[0] = 8

num[1] = 33

num[2] = 200

num[3] = 150

num[4] = 11

num[5] = 88

num[6] = num[2] 10

num[7] = num[2] 10

num[8] = num[0] + num[1] + num[2]

num[9] = num[8]

Systemoutprintln(El array num contiene los siguientes elementos)

for (int i = 0 i lt 10 i++)

Systemoutprintln(num[i])

En Java a diferencia de otros lenguajes como Ruby o PHP todos los elementos de unarray deben ser del mismo tipo por ejemplo no puede haber un entero en la posicioacuten2 y una cadena de caracteres en la posicioacuten 7 del mismo array En el siguiente ejemplose muestra un array de caracteres

Arrays 65

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array04

public static void main(String[] args)

char[] caracter = new char[6]

caracter[0] = R

caracter[1] =

caracter[2] = amp

caracter[3] = +

caracter[4] = A

caracter[5] = 2

Systemoutprintln(El array caracter contiene los siguientes elementos)

for (int i = 0 i lt 6 i++)

Systemoutprintln(caracter[i])

En el siguiente ejemplo se muestra un array de nuacutemeros de tipo double que almacenanotas de alumnos

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array05

public static void main(String[] args)

double[] nota = new double[4]

Systemoutprintln(Para calcular la nota media necesito saber la )

Systemoutprintln(nota de cada uno de tus exaacutemenes)

for (int i = 0 i lt 4 i++)

Arrays 66

Systemoutprint(Nota del examen nordm + (i + 1) + )

nota[i] = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(Tus notas son )

double suma = 0

for (int i = 0 i lt 4 i++)

Systemoutprint(nota[i] + )

suma += nota[i]

Systemoutprintln(nLa media es + suma 4)

72 Arrays bidimensionales

Un array bidimensional utiliza dos iacutendices para localizar cada elemento Podemos vereste tipo de dato como un array que a su vez contiene otros arrays Tambieacuten se puedever como una cuadriacutecula en la que los datos quedan distribuidos en filas y columnasEn el siguiente ejemplo se muestra la definicioacuten y el uso de un array de dosdimensiones

author Luis Joseacute Saacutenchez Ejemplo de uso de arrays bidimensionales

public class ArrayBi01

public static void main(String[] args)

throws InterruptedException Se antildeade esta liacutenea para poder usar sleep

int[][] n = new int[3][2] array de 3 filas por 2 columnas

n[0][0]=20

n[1][0]=67

n[1][1]=33

n[2][1]=7

int fila columna

Arrays 67

for(fila = 0 fila lt 3 fila++)

Systemoutprint(Fila + fila)

for(columna = 0 columna lt 2 columna++)

Systemoutprintf(10d n[fila][columna])

Threadsleep(1000) retardo de un segundo

Systemoutprintln()

Mediante la liacutenea int[][] n = new int[3][2] se define un array bidimensional de 3 filaspor 2 columnas pero bien podriacutean ser 2 filas por 3 columnas seguacuten el objetivo y eluso que del array haga el programadorLos valores del array bidimensional se pueden proporcionar en la misma liacutenea de ladefinicioacuten como se muestra en el siguiente ejemplo

author Luis Joseacute Saacutenchez Ejemplo de uso de arrays bidimensionales

public class ArrayBi02

public static void main(String[] args)

throws InterruptedException Se antildeade esta liacutenea para poder usar sleep

int fila columna

int[][] n = 20 4 67 33 07

for(fila = 0 fila lt 3 fila++)

Systemoutprint(Fila + fila)

for(columna = 0 columna lt 2 columna++)

Systemoutprintf(10d n[fila][columna])

Threadsleep(1000) retardo de un segundo

Systemoutprintln()

Arrays 68

Los arrays bidimensionales se utilizan con frecuencia para situar objetos en un planocomo por ejemplo las piezas de ajedrez en un tablero o un personaje de video-juegoen un laberintoEn el siguiente programa se colocan una mina y un tesoro de forma aleatoria en uncuadrante de cuatro filas por cinco columnas El usuario intentaraacute averiguar doacutendeestaacute el tesoro indicando las coordenadas (x y)

Minijuego Busca el tesoro Se colocan una mina y un tesoro de forma aleatoria en un cuadrante de cuatro filas por cinco columnas El usuario intentaraacute averiguar doacutende estaacute el tesoro author Luis Joseacute Saacutenchez

public class BuscaTesoro

se definen constantes para representar el contenido de las celdasstatic final int VACIO = 0

static final int MINA = 1

static final int TESORO = 2

static final int INTENTO = 3

public static void main(String[] args)

int x

int y

int[][] cuadrante = new int[5][4]

inicializa el arrayfor(x = 0 x lt 4 x++)

for(y = 0 y lt 3 y++)

cuadrante[x][y] = VACIO

coloca la minaint minaX = (int)(Mathrandom()4)int minaY = (int)(Mathrandom()3)cuadrante[minaX][minaY] = MINA

coloca el tesoroint tesoroX

Arrays 69

int tesoroY

do

tesoroX = (int)(Mathrandom()4)tesoroY = (int)(Mathrandom()3)

while ((minaX == tesoroX) ampamp (minaY == tesoroY))

cuadrante[tesoroX][tesoroY] = TESORO

juegoSystemoutprintln(iexclBUSCA EL TESORO)

boolean salir = falseString c =

do

pinta el cuadrantefor(y = 3 y gt= 0 y--)

Systemoutprint(y + |)

for(x = 0 x lt 5 x++)

if (cuadrante[x][y] == INTENTO)

Systemoutprint(X )

elseSystemoutprint( )

Systemoutprintln()

Systemoutprintln( ----------n 0 1 2 3 4n)

pide las coordenadasSystemoutprint(Coordenada x )

x = IntegerparseInt(Systemconsole()readLine())

Systemoutprint(Coordenada y )

y = IntegerparseInt(Systemconsole()readLine())

mira lo que hay en las coordenadas indicadas por el usuarioswitch(cuadrante[x][y])

case VACIO

cuadrante[x][y] = INTENTO

breakcase MINA

Systemoutprintln(Lo siento has perdido)

salir = truebreak

case TESOROSystemoutprintln(Enhorabuena has encontrado el tesoro)

salir = truebreak

default

Arrays 70

while (salir)

pinta el cuadrantefor(y = 3 y gt= 0 y--)

Systemoutprint(y + )

for(x = 0 x lt 5 x++)

switch(cuadrante[x][y])

case VACIO

c =

breakcase MINA

c =

breakcase TESORO

c = euro

breakcase INTENTO

c = x

breakdefault

Systemoutprint(c)

Systemoutprintln()

Systemoutprintln( ----------n 0 1 2 3 4n)

73 Recorrer arrays con for al estilo foreach

Al trabajar con arrays es muy frecuente cometer errores utilizando los iacutendices El errormaacutes tiacutepico consiste en intentar acceder a un elemento mediante un iacutendice que se salede los liacutemites Por ejemplo si tenemos el array n definido de la siguiente forma int[] n =

new int[10] cuando intentamos acceder a n[-1] o a n[10] obtenemos un error en tiempode ejecucioacutenPara recorrer un array de un modo maacutes praacutectico y sencillo sin que tengamos quepreocuparnos de los liacutemites podemos utilizar el bucle for con el formato foreach Deesta forma indicamos simplemente el nombre del array que queremos recorrer y enqueacute variable se va a ir colocando cada elemento con cada iteraccioacuten del bucle No hayque especificar con queacute iacutendice comienza y termina el bucle de eso se encarga JavaA continuacioacuten se muestra el ejemplo Array05java visto anteriormente pero esta vezutilizando el for a la manera foreach

Arrays 71

Recorre un array con un for al estilo foreach author Luis Joseacute Saacutenchez

public class ArrayForEach

public static void main(String[] args)

double[] nota = new double[4]

Systemoutprintln(Para calcular la nota media necesito saber la )

Systemoutprintln(nota de cada uno de tus exaacutemenes)

for (int i = 0 i lt 4 i++)

Systemoutprint(Nota del examen nordm + (i + 1) + )

nota[i] = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(Tus notas son )

double suma = 0

for (double n nota) for al estilo foreachSystemoutprint(n + )

suma += n

Systemoutprintln(nLa media es + suma 4)

Fiacutejate en el segundo for en este caso no se utiliza ninguacuten iacutendice simplemente decimosldquove sacando uno a uno los elementos del array nota y deposita cada uno de esoselementos en la variable n que es de tipo doublerdquo

Arrays 72

74 Ejercicios

741 Arrays de una dimensioacuten

Ejercicio 1Define un array de 12 nuacutemeros enteros con nombre num y asigna los valoresseguacuten la tabla que se muestra a continuacioacuten Muestra el contenido de todoslos elementos del array iquestQueacute sucede con los valores de los elementos que nohan sido inicializados

Ejercicio 2Define un array de 10 caracteres con nombre simbolo y asigna valores a loselementos seguacuten la tabla que se muestra a continuacioacuten Muestra el contenidode todos los elementos del array iquestQueacute sucede con los valores de los elementosque no han sido inicializados

Ejercicio 3Escribe un programa que lea 10 nuacutemeros por teclado y que luego los muestreen orden inverso es decir el primero que se introduce es el uacuteltimo enmostrarse y viceversa

Ejercicio 4Define tres arrays de 20 nuacutemeros enteros cada una con nombres numerocuadrado y cubo Carga el array numero con valores aleatorios entre 0 y 100 En elarray cuadrado se deben almacenar los cuadrados de los valores que hay en elarray numero En el array cubo se deben almacenar los cubos de los valores quehay en numero A continuacioacuten muestra el contenido de los tres arrays dispuestoen tres columnas

Arrays 73

Ejercicio 5Escribe un programa que pida 10 nuacutemeros por teclado y que luego muestrelos nuacutemeros introducidos junto con las palabras ldquomaacuteximordquo y ldquomiacutenimordquo al ladodel maacuteximo y del miacutenimo respectivamente

Ejercicio 6Escribe un programa que lea 15 nuacutemeros por teclado y que los almacene en unarray Rota los elementos de ese array es decir el elemento de la posicioacuten 0debe pasar a la posicioacuten 1 el de la 1 a la 2 etc El nuacutemero que se encuentra enla uacuteltima posicioacuten debe pasar a la posicioacuten 0 Finalmente muestra el contenidodel array

Ejercicio 7Escribe un programa que genere 100 nuacutemeros aleatorios del 0 al 20 y que losmuestre por pantalla separados por espacios El programa pediraacute entoncespor teclado dos valores y a continuacioacuten cambiaraacute todas las ocurrencias delprimer valor por el segundo en la lista generada anteriormente Los nuacutemerosque se han cambiado deben aparecer entrecomillados

Ejercicio 8Realiza un programa que pida la temperatura media que ha hecho en cada mesde un determinado antildeo y que muestre a continuacioacuten un diagrama de barrashorizontales con esos datos Las barras del diagrama se pueden dibujar a basede asteriscos o cualquier otro caraacutecter

Ejercicio 9Realiza un programa que pida 8 nuacutemeros enteros y que luego muestre esosnuacutemeros junto con la palabra ldquoparrdquo o ldquoimparrdquo seguacuten proceda

Ejercicio 10Escribe un programa que genere 20 nuacutemeros enteros aleatorios entre 0 y 100y que los almacene en un array El programa debe ser capaz de pasar todoslos nuacutemeros pares a las primeras posiciones del array (del 0 en adelante) ytodos los nuacutemeros impares a las celdas restantes Utiliza arrays auxiliares sies necesario

Arrays 74

Ejercicio 11Realiza un programa que pida 10 nuacutemeros por teclado y que los almacene enun array A continuacioacuten se mostraraacute el contenido de ese array junto al iacutendice(0 ndash 9) utilizando para ello una tabla Seguidamente el programa pasaraacute losprimos a las primeras posiciones desplazando el resto de nuacutemeros (los queno son primos) de tal forma que no se pierda ninguno Al final se debe mostrarel array resultantePor ejemplo

Array inicial

Array final

Ejercicio 12Realiza un programa que pida 10 nuacutemeros por teclado y que los almacene enun array A continuacioacuten se mostraraacute el contenido de ese array junto al iacutendice(0 ndash 9) Seguidamente el programa pediraacute dos posiciones a las que llamaremosldquoinicialrdquo y ldquofinalrdquo Se debe comprobar que inicial es menor que final y queambos nuacutemeros estaacuten entre 0 y 9 El programa deberaacute colocar el nuacutemero dela posicioacuten inicial en la posicioacuten final rotando el resto de nuacutemeros para que nose pierda ninguno Al final se debe mostrar el array resultantePor ejemplo para inicial = 3 y final = 7

Array inicial

Array final

Arrays 75

Ejercicio 13Escribe un programa que rellene un array de 100 elementos con nuacutemeros ente-ros aleatorios comprendidos entre 0 y 500 (ambos incluidos) A continuacioacutenel programa mostraraacute el array y preguntaraacute si el usuario quiere destacar elmaacuteximo o el miacutenimo Seguidamente se volveraacute a mostrar el array escribiendoel nuacutemero destacado entre dobles asteriscosEjemplo

459 204 20 250 178 90 353 32 229 357 224 454 260 310 140 249 332 426 423 413 96 447 465 29

8 459 411 118 480 302 417 42 82 126 82 474 362 76 190 104 21 257 88 21 251 6 383 47 78 392

394 244 494 87 253 376 379 98 364 237 13 299 228 409 402 225 426 267 330 243 209 426 435

309 356 173 130 416 15 477 34 28 377 193 481 368 466 262 422 275 384 399 397 87 218 84 312

480 207 68 108

iquestQueacute quiere destacar (1 ndash miacutenimo 2 ndash maacuteximo) 1

459 204 20 250 178 90 353 32 229 357 224 454 260 310 140 249 332 426 423 413 96 447 465 29

8 459 411 118 480 302 417 42 82 126 82 474 362 76 190 104 21 257 88 21 251 6 383 47 78

392 394 244 494 87 253 376 379 98 364 237 13 299 228 409 402 225 426 267 330 243 209 426

435 309 356 173 130 416 15 477 34 28 377 193 481 368 466 262 422 275 384 399 397 87 218 84

312 480 207 68 108

Ejercicio 14Escribe un programa que pida 8 palabras y las almacene en un array Acontinuacioacuten las palabras correspondientes a colores se deben almacenar alcomienzo y las que no son colores a continuacioacuten Puedes utilizar tantos arraysauxiliares como quieras Los colores que conoce el programa deben estar enotro array y son los siguientes verde rojo azul amarillo naranja rosa negroblanco y moradoEjemplo

Array original

0 1 2 3 4 5 6 7

casa azul verde orden morado bombillabici rosa

Array resultado

0 1 2 3 4 5 6 7

azul verde morado rosa casa orden bombillabici

Arrays 76

Ejercicio 15Un restaurante nos ha encargado una aplicacioacuten para colocar a los clientes ensus mesas En una mesa se pueden sentar de 0 (mesa vaciacutea) a 4 comensales(mesa llena) Cuando llega un cliente se le pregunta cuaacutentos son De momentoel programa no estaacute preparado para colocar a grupos mayores a 4 por tantosi un cliente dice por ejemplo que son un grupo de 6 el programa daraacute elmensaje ldquoLo siento no admitimos grupos de 6 haga grupos de 4personas como maacuteximo e intente de nuevordquo Para el grupo que llegase busca siempre la primera mesa libre (con 0 personas) Si no quedan mesaslibres se busca donde haya un hueco para todo el grupo por ejemplo si elgrupo es de dos personas se podraacute colocar donde haya una o dos personasInicialmente las mesas se cargan con valores aleatorios entre 0 y 4 Cadavez que se sientan nuevos clientes se debe mostrar el estado de las mesasLos grupos no se pueden romper aunque haya huecos sueltos suficientes Elfuncionamiento del programa se ilustra a continuacioacutenEjemplo

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 0 2 4 1 0 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 2

Por favor sieacutentense en la mesa nuacutemero 3

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 1 0 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 4

Por favor sieacutentense en la mesa nuacutemero 7

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 1 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 3

Tendraacuten que compartir mesa Por favor sieacutentense en la mesa nuacutemero 6

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 4 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 4

Lo siento en estos momentos no queda sitio

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 4 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) -1

Gracias Hasta pronto

Arrays 77

Ejercicio 16Escribe un programa que rellene un array de 20 elementos con nuacutemeros ente-ros aleatorios comprendidos entre 0 y 400 (ambos incluidos) A continuacioacutenel programa mostraraacute el array y preguntaraacute si el usuario quiere resaltar losmuacuteltiplos de 5 o los muacuteltiplos de 7 Seguidamente se volveraacute a mostrar elarray escribiendo los nuacutemeros que se quieren resaltar entre corchetesEjemplo ldquolsquoconsole159 204 20 250 178 90 353 32 229 357 224 54 260 310 140 249 335 326 22313 iquestQueacute nuacutemeros quiere resaltar (1 ndash los muacuteltiplos de 5 2 ndash los muacuteltiplos de7) 1 159 204 [20] [250] 178 [90] 353 32 229 357 224 54 [260] [310] [140]249 [335] 326 223 13 ldquolsquo

742 Arrays bidimensionales

Ejercicio 1Define un array de nuacutemeros enteros de 3 filas por 6 columnas con nombre num

y asigna los valores seguacuten la siguiente tabla Muestra el contenido de todoslos elementos del array dispuestos en forma de tabla como se muestra en lafigura

Ejercicio 2Escribe un programa que pida 20 nuacutemeros enteros Estos nuacutemeros se debenintroducir en un array de 4 filas por 5 columnas El programa mostraraacute lassumas parciales de filas y columnas igual que si de una hoja de caacutelculo setratara La suma total debe aparecer en la esquina inferior derecha

Arrays 78

Ejercicio 3Modifica el programa anterior de tal forma que los nuacutemeros que se introducenen el array se generen de forma aleatoria (valores entre 100 y 999)

Ejercicio 4Modifica el programa anterior de tal forma que las sumas parciales y la sumatotal aparezcan en la pantalla con un pequentildeo retardo dando la impresioacuten deque el ordenador se queda ldquopensandordquo antes de mostrar los nuacutemeros

Ejercicio 5Realiza un programa que rellene un array de 6 filas por 10 columnas connuacutemeros enteros positivos comprendidos entre 0 y 1000 (ambos incluidos)A continuacioacuten el programa deberaacute dar la posicioacuten tanto del maacuteximo comodel miacutenimo

Ejercicio 6Modifica el programa anterior de tal forma que no se repita ninguacuten nuacutemero enel array

Ejercicio 7Mejora el juego ldquoBusca el tesorordquo de tal forma que si hay una mina a una casillade distancia el programa avise diciendo iexclCuidado iexclHay una mina cerca

Ejercicio 8Escribe un programa que dada una posicioacuten en un tablero de ajedrez nos digaa queacute casillas podriacutea saltar un alfil que se encuentra en esa posicioacuten Como seindica en la figura el alfil se mueve siempre en diagonal El tablero cuenta con64 casillas Las columnas se indican con las letras de la ldquoardquo a la ldquohrdquo y las filasse indican del 1 al 8

Arrays 79

Ejemplo

Introduzca la posicioacuten del alfil d5

El aacutelfil puede moverse a las siguientes posiciones

h1 a2 g2 b3 e3 c4 e4 c6 e6 b7 f7 a8 g8

Ejercicio 9Realiza un programa que sea capaz de rotar todos los elementos de unamatriz cuadrada una posicioacuten en el sentido de las agujas del reloj La matrizdebe tener 12 filas por 12 columnas y debe contener nuacutemeros generados alazar entre 0 y 100 Se debe mostrar tanto la matriz original como la matrizresultado ambas con los nuacutemeros convenientemente alineados

Ejercicio 10Realiza el juego de las tres en raya

8 Funciones

81 Implementando funciones para reutilizar coacutedigo

En programacioacuten es muy frecuente reutilizar coacutedigo es decir usar coacutedigo ya exis-tente Cuando una parte de un programa requiere una funcionalidad que ya estaacuteimplementada en otro programa no tiene mucho sentido emplear tiempo y energiacuteaen implementarla otra vezUna funcioacuten es un trozo de coacutedigo que realiza una tarea muy concreta y que se puedeincluir en cualquier programa cuando hace falta resolver esa tarea Opcionalmentelas funciones aceptan una entrada (paraacutemetros de entrada) y devuelven una salidaObserva el siguiente ejemplo Se trata de un programa que pide un nuacutemero por tecladoy luego dice si el nuacutemero introducido es o no es primo

Dice si un nuacutemero es o no es primo (sin funciones) author Luis Joseacute Saacutenchez

public class NumeroPrimo

public static void main(String[] args)

Systemoutprint(Introduce un nuacutemero entero positivo )

int n = IntegerparseInt(Systemconsole()readLine())

boolean esPrimo = truefor (int i = 2 i lt n i++)

if ((n i) == 0)

esPrimo = false

if (esPrimo)

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

80

Funciones 81

Podemos intuir que la tarea de averiguar si un nuacutemero es o no primo seraacute algo queutilizaremos con frecuencia maacutes adelante asiacute que podemos aislar el trozo de coacutedigoque realiza ese cometido para usarlo con comodidad en otros programas

Dice si un nuacutemero es o no es primo usando una funcioacuten author Luis Joseacute Saacutenchez

public class NumeroPrimoConFuncion

Programa principal

public static void main(String[] args)

Systemoutprint(Introduzca un nuacutemero entero positivo )

int n = IntegerparseInt(Systemconsole()readLine())

if (esPrimo(n))

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

Funciones

Comprueba si un nuacutemero entero positivo es primo o no Un nuacutemero es primo cuando uacutenicamente es divisible entre eacutel mismo y la unidad param x un nuacutemero entero positivo return ltcodegttrueltcodegt si el nuacutemero es primo return ltcodegtfalseltcodegt en caso contrario

public static boolean esPrimo(int x)

for (int i = 2 i lt x i++)

if ((x i) == 0)

return false

Funciones 82

return true

Cada funcioacuten tiene una cabecera y un cuerpo En el ejemplo anterior la cabecera es

public static boolean esPrimo(int x)

De momento no vamos a explicar queacute significa public static lo dejaremos para cuandoveamos el capiacutetulo 9 ldquoProgramacioacuten orientada a objetosrdquo por ahora lo escribiremos talcual cada vez que definamos una funcioacuten A continuacioacuten se escribe el tipo de dato quedevuelve la funcioacuten en este caso es boolean porque la funcioacuten devolveraacute siempre true

(verdadero) o false falso Lo uacuteltimo que lleva la cabecera son los paraacutemetros encerradosentre pareacutentesis Esos paraacutemetros son los valores que se le pasan a la funcioacuten paraque realice los caacutelculos En este caso concreto el paraacutemetro que se pasa es x o seael nuacutemero que queremos saber si es primo o no Es necesario indicar siempre el tipode cada paraacutemetro en esta ocasioacuten el paraacutemetro que se pasa es de tipo entero (int)

82 Comentarios de funciones

Los comentarios tienen un papel muy importante en los programas ya que aunque nose compilan ni se ejecutan permiten describir aclarar o dar informacioacuten relevantesobre queacute hace exactamente el coacutedigo Un programa bien comentado es muchomaacutes faacutecil de corregir mantener y mejorar que un programa mal comentado o quesimplemente no tiene comentariosExiste una herramienta llamada javadoc que crea unos documentos en HTML coninformacioacuten sobre programas escritos en Java Para ello javadoc utiliza los comentariosque se han hecho y ademaacutes la meta-informacioacuten que se incluye en esos comentariosEsta meta-informacioacuten es muy faacutecil de distinguir pues va precedida siempre de uncaraacutecter Te habraacutes dado cuenta que en los comentarios de los programas que hemos visto eneste manual se indica el nombre del autor mediante authorSi los comentarios de los programas en general son importantes debemos prestarespecial atencioacuten a los comentarios de las funciones ya que posiblemente seraacutenusadas por otros programadores que querraacuten saber exactamente coacutemo se utilizanCon la etiqueta param seguida de un nombre de paraacutemetro se indica queacute paraacutemetroespera como entrada la funcioacuten Si una funcioacuten acepta varios paraacutemetros se especifi-caraacuten varias etiquetas param en los comentariosMediante la etiqueta return especificamos queacute devuelve exactamente la funcioacutenAunque el tipo de dato que se devuelve ya viene indicado en la cabecera de la funcioacutenmediante la etiqueta return podemos explicarlo con maacutes detalle

Funciones 83

En los comentarios se pueden incluir elementos de HTML como ltcodegt ampnbsp etc yaque los entiende perfectamente javadocPuedes hacer una prueba generando la documentacioacuten del ejemplo ejecutando lasiguiente liacutenea en una ventana de terminal Como tenemos tildes en los comentariossi queremos que salgan bien en las paacuteginas de documentacioacuten debemos indicar lacodificacioacuten de caracteres

javadoc -encoding UTF-8 -charset UTF-8 -docencoding UTF-8 NumeroPrimoConFuncionjava

Para aprender maacutes sobre javadoc puedes consultar la documentacioacuten oficial de Oracle1

83 Creacioacuten de bibliotecas de rutinas mediante paquetes

Si la funcioacuten esPrimo() va a ser usada en tres programas diferentes se puede copiary pegar su coacutedigo en cada uno de los programas pero hay una solucioacuten mucho maacuteselegante y praacutecticaLas funciones de un determinado tipo (por ejemplo funciones matemaacuteticas) se puedenagrupar para crear un paquete (package) que luego se importaraacute desde el programa quenecesite esas funcionesCada paquete se corresponde con un directorio Por tanto si hay un paquete connombre matematicas debe haber un directorio llamado tambieacuten matematicas en la mismaubicacioacuten del programa que importa ese paquete (normalmente el programa princi-pal)Las funciones se pueden agrupar dentro de un paquete de dos maneras diferentesPuede haber subpaquetes dentro de un paquete por ejemplo si quisieacuteramos dividirlas funciones matemaacuteticas en funciones relativas al caacutelculo de aacutereas y voluacutemenesde figuras geomeacutetricas y funciones relacionadas con caacutelculos estadiacutesticos podriacuteamoscrear dos directorios dentro de matematicas con nombres geometria y estadistica respecti-vamente Estos subpaquetes se llamariacutean matematicasgeometria y matematicasestadisticaOtra manera de agrupar las funciones dentro de un mismo paquete consiste en crearvarios ficheros dentro de un mismo directorio En este caso se podriacutean crear los ficherosGeometriajava y EstadisticajavaEntenderemos mejor todos estos conceptos con un ejemplo completo Vamos a crearun paquete con nombre matematicas que contenga dos clases Varias (para funcionesmatemaacuteticas de propoacutesito general) y Geometria Por tanto en el disco duro tendremosuna carpeta con nombre matematicas que contiene los ficheros Variasjava y GeometriajavaEl contenido de estos ficheros se muestra a continuacioacuten

1httpwwworaclecomtechnetworkjavajavasedocumentationindex-137868html

Funciones 84

Funciones matemaacuteticas de propoacutesito general author Luis Joseacute Saacutenchez

package matematicas

public class Varias

Comprueba si un nuacutemero entero positivo es primo o no Un nuacutemero es primo cuando uacutenicamente es divisible entre eacutel mismo y la unidad param x un nuacutemero entero positivo return ltcodegttrueltcodegt si el nuacutemero es primo return ltcodegtfalseltcodegt en caso contrario

public static boolean esPrimo(int x)

for (int i = 2 i lt x i++)

if ((x i) == 0)

return false

return true

Devuelve el nuacutemero de diacutegitos que contiene un nuacutemero entero param x un nuacutemero entero return la cantidad de diacutegitos que contiene el nuacutemero

public static int digitos(int x)

if (x == 0)

return 1

else

int n = 0

while (x gt 0)

x = x 10

n++

Funciones 85

return n

Se incluye a continuacioacuten Geometriacuteajava Recuerda que tanto Variasjava como Geome-

triacuteajava se encuentran dentro del directorio matematicas

Funciones geomeacutetricas author Luis Joseacute Saacutenchez

package matematicas

public class Geometria

Calcula el volumen de un cilindro Tanto el radio como la altura se deben proporcionar en las mismas unidades para que el resultado sea congruente param r radio del cilindro param h altura del cilindro return volumen del cilindro

public static double volumenCilindro(double r double h)

return MathPI r r h

Calcula la longitud de una circunferencia a partir del radio param r radio de la circunferencia return longitud de la circunferencia

public static double longitudCircunferencia(double r)

return 2 MathPI r

Observa que en ambos ficheros se especifica que las clases declaradas (y por tantolas funciones que se definen dentro) pertenecen al paquete matematicas mediante la

Funciones 86

liacutenea package matematicas Ahora ya podemos probar las funciones desde un programaexterno El programa PruebaFuncionesjava estaacute fuera de la carpeta matematicas justo enun nivel superior en la estructura de directorios

Dice si un nuacutemero es o no es primo usando una funcioacuten author Luis Joseacute Saacutenchez

import matematicasVariasimport matematicasGeometria

public class PruebaFunciones

public static void main(String[] args)

int n

Prueba esPrimo()

Systemoutprint(Introduzca un nuacutemero entero positivo )

n = IntegerparseInt(Systemconsole()readLine())

if (matematicasVariasesPrimo(n))

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

Prueba digitos()

Systemoutprint(Introduzca un nuacutemero entero positivo )

n = IntegerparseInt(Systemconsole()readLine())

Systemoutprintln(n + tiene + matematicasVariasdigitos(n) + diacutegitos)

Prueba volumenCilindro()

double r h

Systemoutprintln(Caacutelculo del volumen de un cilindro)

Systemoutprint(Introduzca el radio en metros )

r = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura en metros )

Funciones 87

h = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El volumen del cilindro es + matematicasGeometriavolumenCilind

ro(r h) + m3)

Las liacuteneas

import matematicasVariasimport matematicasGeometria

cargan las clases contenidas en el paquete matematicas y por tanto todas las funcionescontenidas en ellas No vamos a utilizar el comodiacuten de la forma import matematicas yaque estaacute desaconsejado su uso en el estaacutendar de codificacioacuten en Java de GoogleEl uso de una funcioacuten es muy sencillo hay que indicar el nombre del paquete el nom-bre de la clase y finalmente el nombre de la funcioacuten con los paraacutemetros adecuados Porejemplo como vemos en el programa anterior matematicasVariasdigitos(n) devuelve elnuacutemero de diacutegitos de n siendo matematicas el paquete Varias la clase digitos la funcioacuteny n el paraacutemetro que se le pasa a la funcioacuten

84 Aacutembito de las variables

El aacutembito de una variable es el espacio donde ldquoexisterdquo esa variable o dicho de otromodo el contexto dentro del cual la variable es vaacutelidaSeguramente has utilizado muchas veces variables con nombres como x i max o aux Elaacutembito de cada una de esas variables era el programa en el que estaban declaradasFiacutejate que la x del primer programa que aparece en este libro no interfiere para nadacon la x del siguiente programa que usa una variable con ese mismo nombre Aunquese llamen igual son variables diferentesCuando se implementan funciones hay que tener muy claro que las variables utilizadascomo paraacutemetros (por valor) o las variables que se definen dentro de la funcioacuten sonlocales a esa funcioacuten es decir su aacutembito es la funcioacuten y fuera de ella esas variablesno existen Presta atencioacuten al programa Variosjava y observa que las dos funcionesque hay definidas dentro de la clase utilizan sendas variables con nombre x Puesbien cada una de esas variables son completamente independientes se trata de dosvariables distintas que tienen el mismo nombre pero que son vaacutelidas cada una en supropio aacutembito

85 Paso de paraacutemetros por valor y por referencia

En Java como en la mayoriacutea de lenguajes de programacioacuten existen dos maneras depasar paraacutemetros por valor y por referencia

Funciones 88

Cuando se pasa un paraacutemetro por valor en realidad se pasa una copia de la variableuacutenicamente importa el valor Cualquier modificacioacuten que se le haga a la variable que sepasa como paraacutemetro dentro de la funcioacuten no tendraacute ninguacuten efecto fuera de la mismaVeamos un ejemplo

Paso de paraacutemetros por valor author Luis Joseacute Saacutenchez

public class PruebaParametros1

public static void main(String[] args)

int n = 10

Systemoutprintln(n)

calcula(n)

Systemoutprintln(n)

public static void calcula(int x)

x += 24

Systemoutprintln(x)

La salida del programa anterior es la siguiente

10

34

10

A pesar de que la variable que se pasa como paraacutemetro se modifica dentro de lafuncioacuten los cambios no tienen ninguacuten efecto en el programa principalCuando se pasa un paraacutemetro por referencia por el contrario si se modifica su valordentro de la funcioacuten los cambios se mantienen una vez que la funcioacuten ha terminadode ejecutarseEn la mayoriacutea de los lenguajes de programacioacuten es el programador quien decidecuaacutendo un paraacutemetro se pasa por valor y cuaacutendo se pasa por referencia En Java nopodemos elegir Todos los paraacutemetros que son de tipo int double float char o String

se pasan siempre por valor mientras que los arrays se pasan siempre por referenciaEsto quiere decir que cualquier cambio que efectuemos en un array que se pasa comoparaacutemetro permanece cuando termina la ejecucioacuten de la funcioacuten por lo que hay quetener especial cuidado en estos casos

Funciones 89

Paso de un array como paraacutemetro author Luis Joseacute Saacutenchez

public class PruebaParametrosArray

public static void main(String[] args)

int n[] = 8 33 200 150 11

int m[] = new int[5]

muestraArray(n)

incrementa(n)

muestraArray(n)

public static void muestraArray(int x[])

for (int i = 0 i lt xlength i++)

Systemoutprint(x[i] + )

Systemoutprintln()

public static void incrementa(int x[])

for (int i = 0 i lt xlength i++)

x[i]++

La salida del programa anterior es la siguiente

8 33 200 150 11

9 34 201 151 12

Comprobamos por tanto que el array que se ha pasado como paraacutemetro se hamodificado en la funcioacuten y se han conservado los cambios en el programa principalPor uacuteltimo se muestra un programa que contiene funciones que operan con arrays dedos dimensiones

Funciones 90

Paso de un array bidimensional como paraacutemetro author Luis Joseacute Saacutenchez

import matematicasVarias

public class ArrayBiFunciones

public static void main(String[] args)

int[][] n = new int[6][9]

for(int i = 0 i lt 6 i++)

for(int j = 0 j lt 9 j++)

n[i][j] = (int)(Mathrandom()100000)

muestraArrayIntBi(n)

Funciones

Devuelve el nuacutemero de filas de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return nuacutemero de filas del array

public static int filasArrayIntBi(int x[][])

return xlength

Devuelve el nuacutemero de columnas de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return nuacutemero de columnas del array

public static int columnasArrayIntBi(int x[][])

Funciones 91

return x[0]length

Devuelve el maacuteximo de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return el valor maacuteximo encontrado en el array

public static int maximoArrayIntBi(int x[][])

int maximo = IntegerMIN_VALUE

for (int f = 0 f lt filasArrayIntBi(x) f++)

for (int c = 0 c lt columnasArrayIntBi(x) c++)

if (x[f][c] gt maximo)

maximo = x[f][c]

return maximo

Muestra por pantalla el contenido de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros

public static void muestraArrayIntBi(int x[][])

String formatoNumero = + matematicasVariasdigitos(maximoArrayIntBi(x)) + d

for (int f = 0 f lt filasArrayIntBi(x) f++)

for (int c = 0 c lt columnasArrayIntBi(x) c++)

Systemoutprintf(formatoNumero + x[f][c])

Systemoutprintln()

Funciones 92

86 Ejercicios

Ejercicios 1-14Crea una biblioteca de funciones matemaacuteticas que contenga las siguientesfunciones Recuerda que puedes usar unas dentro de otras si es necesario

1 esCapicua Devuelve verdadero si el nuacutemero que se pasa como paraacute-metro es capicuacutea y falso en caso contrario

2 esPrimo Devuelve verdadero si el nuacutemero que se pasa como paraacutemetroes primo y falso en caso contrario

3 siguientePrimo Devuelve el menor primo que es mayor al nuacutemero quese pasa como paraacutemetro

4 potencia Dada una base y un exponente devuelve la potencia5 digitos Cuenta el nuacutemero de diacutegitos de un nuacutemero entero6 voltea Le da la vuelta a un nuacutemero7 digitoN Devuelve el diacutegito que estaacute en la posicioacuten n de un nuacutemero

entero Se empieza contando por el 0 y de izquierda a derecha8 posicionDeDigito Da la posicioacuten de la primera ocurrencia de un diacutegito

dentro de un nuacutemero entero Si no se encuentra devuelve -19 quitaPorDetras Le quita a un nuacutemero n diacutegitos por detraacutes (por la

derecha)10 quitaPorDelante Le quita a un nuacutemero n diacutegitos por delante (por la

izquierda)11 pegaPorDetras Antildeade un diacutegito a un nuacutemero por detraacutes12 pegaPorDelante Antildeade un diacutegito a un nuacutemero por delante13 trozoDeNumero Toma como paraacutemetros las posiciones inicial y final

dentro de un nuacutemero y devuelve el trozo correspondiente14 juntaNumeros Pega dos nuacutemeros para formar uno

Ejercicio 15Muestra los nuacutemeros primos que hay entre 1 y 1000

Ejercicio 16Muestra los nuacutemeros capicuacutea que hay entre 1 y 99999

Ejercicio 17Escribe un programa que pase de binario a decimal

Ejercicio 18Escribe un programa que pase de decimal a binario

Funciones 93

Ejercicio 19Une y ampliacutea los dos programas anteriores de tal forma que se permitaconvertir un nuacutemero entre cualquiera de las siguientes bases decimal binariohexadecimal y octal

Ejercicios 20-28Crea una biblioteca de funciones para arrays (de una dimensioacuten) de nuacutemerosenteros que contenga las siguientes funciones

1 generaArrayInt Genera un array de tamantildeo n con nuacutemeros aleatorioscuyo intervalo (miacutenimo y maacuteximo) se indica como paraacutemetro

2 minimoArrayInt Devuelve el miacutenimo del array que se pasa comoparaacutemetro

3 maximoArrayInt Devuelve el maacuteximo del array que se pasa comoparaacutemetro

4 mediaArrayInt Devuelve la media del array que se pasa como paraacute-metro

5 estaEnArrayInt Dice si un nuacutemero estaacute o no dentro de un array6 posicionEnArray Busca un nuacutemero en un array y devuelve la posicioacuten

(el iacutendice) en la que se encuentra7 volteaArrayInt Le da la vuelta a un array8 rotaDerechaArrayInt Rota n posiciones a la derecha los nuacutemeros de

un array9 rotaIzquierdaArrayInt Rota n posiciones a la izquierda los nuacutemeros de

un array

Funciones 94

Ejercicio 29-34Crea una biblioteca de funciones para arrays bidimensionales (de dos dimen-siones) de nuacutemeros enteros que contenga las siguientes funciones

1 generaArrayBiInt Genera un array de tamantildeo n x m con nuacutemerosaleatorios cuyo intervalo (miacutenimo y maacuteximo) se indica como paraacutemetro

2 filaDeArrayBiInt Devuelve la fila i-eacutesima del array que se pasa comoparaacutemetro

3 columnaDeArrayBiInt Devuelve la columna j-eacutesima del array que sepasa como paraacutemetro

4 coordenadasEnArrayBiInt Devuelve la fila y la columna (en un arraycon dos elementos) de la primera ocurrencia de un nuacutemero dentro de unarray bidimensional Si el nuacutemero no se encuentra en el array la funcioacutendevuelve el array -1 -1

5 esPuntoDeSilla Dice si un nuacutemero es o no punto de silla es decirmiacutenimo en su fila y maacuteximo en su columna

6 diagonal Devuelve un array que contiene una de las diagonales delarray bidimensional que se pasa como paraacutemetro Se pasan comoparaacutemetros fila columna y direccioacuten La fila y la columna determinanel nuacutemero que marcaraacute las dos posibles diagonales dentro del array Ladireccioacuten es una cadena de caracteres que puede ser ldquonoserdquo o ldquonesordquo Lacadena ldquonoserdquo indica que se elige la diagonal que va del noroeste haciael sureste mientras que la cadena ldquonesordquo indica que se elige la diagonalque va del noreste hacia el suroeste

9 Programacioacuten orientada a objetos

91 Clases y objetos

La programacioacuten orientada a objetos es un paradigma de programacioacuten que se basacomo su nombre indica en la utilizacioacuten de objetos Estos objetos tambieacuten se suelenllamar instanciasUn objeto en teacuterminos de POO no se diferencia mucho de lo que conocemos comoun objeto en la vida real Pensemos por ejemplo en un coche Nuestro coche seriacuteaun objeto concreto de la vida real igual que el coche del vecino o el coche de uncompantildeero de trabajo o un deportivo que vimos por la calle el fin de semana pasadohellipTodos esos coches son objetos concretos que podemos ver y tocarTanto mi coche como el coche del vecino tienen algo en comuacuten ambos son cochesEn este caso mi coche y el coche del vecino seriacutean instancias (objetos) y coche (asecas) seriacutea una clase La palabra coche define algo geneacuterico es una abstraccioacutenno es un coche concreto sino que hace referencia a unos elementos que tienen unaserie de propiedades como matriacutecula marca modelo color etc este conjunto depropiedades se denominan atributos o variables de instancia

ClaseConcepto abstracto que denota una serie de cualidades por ejemplo cocheInstanciaObjeto palpable que se deriva de la concrecioacuten de una clase por ejemplo micocheAtributosConjunto de caracteriacutesticas que comparten los objetos de una clase porejemplo para la clase coche tendriacuteamos matriacutecula marca modelo color ynuacutemero de plazas

En Java los nombres de las clases se escriben con la primera letra en mayuacutesculamientras que los nombres de las instancias comienzan con una letra en minuacutesculaPor ejemplo la clase coche se escribe en Java como Coche y el objeto ldquomi cocherdquo sepodriacutea escribir como miCocheDefiniremos cada clase en un fichero con el mismo nombre maacutes la extensioacuten java portanto la definicioacuten de la clase Coche debe estar contenida en un fichero con nombreCochejava

Vamos a definir a continuacioacuten la clase Libro con los atributos isbn autor titulo ynumeroPaginas

95

Programacioacuten orientada a objetos 96

Librojava Definicioacuten de la clase Libro author Luis Joseacute Saacutenchez

public class Libro

atributosString isbn

String titulo

String autor

int numeroPaginas

A continuacioacuten creamos varios objetos de esta clase

PruebaLibrojava Programa que prueba la clase Libro author Luis Joseacute Saacutenchez

public class PruebaLibro

public static void main(String[] args)

Libro lib = new Libro()

Libro miLibrito = new Libro()

Libro quijote = new Libro()

Hemos creado tres instancias de la clase libro lib miLibrito y quijote Ya sabemos definiruna clase indicando sus atributos y crear instancias

Las variables de instancia (atributos) determinan las cualidades de losobjetos

92 Encapsulamiento y ocultacioacuten

Uno de los pilares en los que se basa la Programacioacuten Orientada a Objetos es elencapsulamiento Baacutesicamente el encapsulamiento consiste en definir todas las

Programacioacuten orientada a objetos 97

propiedades y el comportamiento de una clase dentro de esa clase es decir en laclase Coche estaraacute definido todo lo concerniente a la clase Coche y en la clase Libro

estaraacute definido todo lo que tenga que ver con la clase LibroEl encapsulamiento parece algo obvio casi de perogrullo pero hay que tenerlosiempre muy presente al programar utilizando clases y objetos En alguna ocasioacutenpuede que estemos tentados a mezclar parte de una clase con otra clase distintapara resolver un problema puntual No hay que caer en esa trampa Se deben escribirlos programas de forma que cada cosa esteacute en su sitio Sobre todo al principiocuando definimos nuestras primeras clases debemos estar pendientes de que todoestaacute definido donde correspondeLa ocultacioacuten es una teacutecnica que incorporan algunos lenguajes (entre ellos Java) quepermite esconder los elementos que definen una clase de tal forma que desde otraclase distinta no se pueden ldquover las tripasrdquo de la primera La ocultacioacuten facilita comoveremos maacutes adelante el encapsulamiento

93 Meacutetodos

Un coche arranca para se aparca hace sonar el claxon se puede llevar a repararhellipUn gato puede comer dormir maullar ronronearhellipLas acciones asociadas a una clase se llaman meacutetodos Estos meacutetodos se definendentro del cuerpo de la clase y se suelen colocar a continuacioacuten de los atributos

Los meacutetodos determinan el comportamiento de los objetos

931 Creiacute haber visto un lindo gatito

Vamos a crear la clase GatoSimple La llamamos asiacute porque maacutes adelante crearemos otraclase algo maacutes elaborada que se llamaraacute Gato Para saber queacute atributos debe tener estaclase hay que preguntarse queacute caracteriacutesticas tienen los gatos Todos los gatos son deun color determinado pertenecen a una raza tienen una edad tienen un determinadosexo - son machos o hembras - y tienen un peso que se puede expresar en kilogramosEacutestos seraacuten por tanto los atributos que tendraacute la clase GatoSimplePara saber queacute metodos debemos implementar hay que preguntarse queacute accionesestaacuten asociadas a los gatos Bien pues los gatos maullan ronronean comen y si sonmachos se pelean entre ellos para disputarse el favor de las hembras Esos seraacuten losmeacutetodos que definamos en la clase

Programacioacuten orientada a objetos 98

GatoSimplejava Definicioacuten de la clase GatoSimple author Luis Joseacute Saacutenchez

public class GatoSimple

atributos

String color raza sexo

int edad

double peso

meacutetodos

constructorGatoSimple (String s)

thissexo = s

getterString getSexo()

return thissexo

Hace que el gato maulle

void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute

Programacioacuten orientada a objetos 99

param comida la comida que se le ofrece al gato

void come(String comida)

if (comidaequals(pescado))

Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Pone a pelear dos gatos Solo se van a pelear dos machos entre siacute param contrincante es el gato contra el que pelear

void peleaCon(GatoSimple contrincante)

if (thissexoequals(hembra))

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo()equals(hembra))

Systemoutprintln(no peleo contra gatitas)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

ConstructorEl meacutetodo constructor tiene siempre el mismo nombre que la clase y se utilizanormalmente para inicializar los atributos

Los atributos de la clase GatoSimple - color raza sexo edad y peso - se declaran igual quelas variables que hemos venido usando hasta ahora pero hay una gran diferenciaentre estos atributos y las variables que aparecen en el main (programa principal) Unavariable definida en el cuerpo del programa principal es uacutenica sin embargo cada unode los objetos que se crean en el programa principal tienen sus propios atributos esdecir si en el programa principal se crean 20 objetos de la clase GatoSimple cada unotiene sus valores para los atributos color raza etcFiacutejate en la cabecera del meacutetodo peleaCon

Programacioacuten orientada a objetos 100

void peleaCon(GatoSimple contrincante)

Como puedes comprobar es posible pasar un objeto como paraacutemetro A continuacioacutense muestra un programa que prueba la clase GatoSimple Te recomiendo seguir elprograma liacutenea a liacutenea y observar atentamente la salida que produce

PruebaGatoSimplejava Programa que prueba la clase GatoSimple author Luis Joseacute Saacutenchez

public class PruebaGatoSimple

public static void main(String[] args)

GatoSimple garfield = new GatoSimple(macho)

Systemoutprintln(hola gatito)

garfieldmaulla()

Systemoutprintln(toma tarta)

garfieldcome(tarta selva negra)

Systemoutprintln(toma pescado a ver si esto te gusta)

garfieldcome(pescado)

GatoSimple tom = new GatoSimple(macho)

Systemoutprintln(Tom toma sopita de verduras)

tomcome(sopa de verduras)

GatoSimple lisa = new GatoSimple(hembra)

Systemoutprintln(gatitos a ver coacutemo maullaacuteis)

garfieldmaulla()

tommaulla()

lisamaulla()

garfieldpeleaCon(lisa)

lisapeleaCon(tom)

tompeleaCon(garfield)

Observa coacutemo al crear una instancia se llama al constructor que como deciacuteamos antestiene el mismo nombre de la clase y sirve para inicializar los atributos En este casose inicializa el atributo sexo Maacutes adelante veremos constructores que inicializan variosatributos e incluso definiremos distintos constructores en la misma clase

Programacioacuten orientada a objetos 101

GatoSimple garfield = new GatoSimple(macho)

Como puedes ver hay meacutetodos que no toman ninguacuten paraacutemetro

garfieldmaulla()

Y hay otros meacutetodos que deben tomar paraacutemetros obligatoriamente

garfieldcome(tarta selva negra)

932 Meacutetodos getter y setter

Vamos a crear la clase Cubo Para saber queacute atributos se deben definir nos preguntamosqueacute caracteriacutesticas tienen los cubos - igual que hicimos con la clase GatoSimple Todos loscubos tienen una determinada capacidad un color estaacuten hechos de un determinadomaterial - plaacutestico latoacuten etc - y puede que tengan asa o puede que no Un cubo sefabrica con el propoacutesito de contener liacutequido por tanto otra caracteriacutestica es la cantidadde litros de liacutequido que contiene en un momento determinado Por ahora solo nosinteresa saber la capacidad maacutexima y los litros que contiene el cubo en cada momentoasiacute que esos seraacuten los atributos que tendremos en cuenta

Cubojava Definicioacuten de la clase Cubo author Luis Joseacute Saacutenchez

public class Cubo

atributos

int capacidad capacidad maacutexima en litrosint contenido contenido actual en litros

meacutetodos

constructorCubo (int c)

thiscapacidad = c

meacutetodos getterint getCapacidad()

return thiscapacidad

Programacioacuten orientada a objetos 102

int getContenido()

return thiscontenido

meacutetodo settervoid setContenido(int litros)

thiscontenido = litros

otros meacutetodosvoid vacia()

thiscontenido = 0

Llena el cubo al maacuteximo de su capacidad

void llena()

thiscontenido = thiscapacidad

Pinta el cubo en la pantalla Se muestran los bordes del cubo con el caraacutecter y el agua que contiene con el caraacutecter ~

void pinta()

for (int nivel = thiscapacidad nivel gt 0 nivel--)

if (thiscontenido gt= nivel)

Systemoutprintln(~~~~)

else

Systemoutprintln( )

Systemoutprintln()

Vuelca el contenido de un cubo sobre otro Antes de echar el agua se comprueba cuaacutento le cabe al cubo destino

void vuelcaEn(Cubo destino)

Programacioacuten orientada a objetos 103

int libres = destinogetCapacidad() - destinogetContenido()

if (libres gt 0)

if (thiscontenido lt= libres)

destinosetContenido(destinogetContenido() + thiscontenido)thisvacia()

else

thiscontenido -= libres

destinollena()

Observa estos meacutetodos extraiacutedos de la clase Cubo

int getCapacidad()

return thiscapacidad

int getContenido()

return thiscontenido

Se trata de meacutetodos muy simples su cometido es devolver el valor de un atributoPodriacutean tener cualquier nombre pero en Java es costumbre llamarlos con la palabraget (obtener) seguida del nombre del atributoFijeacutemonos ahora este otro meacutetodo

void setContenido(int litros)

thiscontenido = litros

Ahora estamos ante un setter Este tipo de meacutetodos tiene el cometido de establecerun valor para un determinado atributo Como puedes ver setContenido estaacute formadapor set (asignar) maacutes el nombre del atributoPodriacuteas preguntarte iquestpor queacute se crea un meacutetodo getter para extraer el valor de unavariable y no se accede a la variable directamenteParece maacutes loacutegico hacer esto

Systemoutprint(miCubocapacidad)

que esto otro

Programacioacuten orientada a objetos 104

Systemoutprint(miCubogetCapacidad())

Sin embargo en Java se opta casi siempre por esta uacuteltima opcioacuten Tiene su explicacioacuteny lo entenderaacutes bien cuando estudies el apartado Aacutembitovisibilidad de los elementosde una clase - public protected y privateProbamos con el siguiente ejemplo la clase Cubo que acabamos de definir Crea tuspropios cubos pasa agua de unos a otros y observa lo que se muestra por pantalla

PruebaCubojava Programa que prueba la clase Cubo author Luis Joseacute Saacutenchez

public class PruebaCubo

public static void main(String[] args)

Cubo cubito = new Cubo(2)

Cubo cubote = new Cubo(7)

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

Systemoutprintln(nLleno el cubito n)

cubitollena()

cubitopinta()

Systemoutprintln(nEl cubote sigue vaciacuteo n)

cubotepinta()

Systemoutprintln(nAhora vuelco lo que tiene el cubito en el cuboten)

cubitovuelcaEn(cubote)

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

Systemoutprintln(nAhora vuelco lo que tiene el cubote en el cubiton)

cubotevuelcaEn(cubito)

Programacioacuten orientada a objetos 105

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

933 Meacutetodo toString

La definicioacuten de la clase Cubo del apartado anterior contiene el meacutetodo pinta que comosu nombre indica permite pintar en pantalla un objeto de esa clase Se podriacutea definirel meacutetodo ficha para mostrar informacioacuten sobre objetos de la clase Alumno por ejemploTambieacuten seriacutea posible implementar el meacutetodo imprime dentro de la clase Libro con elpropoacutesito de mostrar por pantalla los datos de un libro Todos estos meacutetodos - pintaficha e imprime - hacen baacutesicamente lo mismoEn Java existe una solucioacuten muy elegante para mostrar informacioacuten sobre un objetopor pantalla Si se quiere mostrar el contenido de la variable entera x se utilizaSystemoutprint(x) y si se quiere mostrar el valor de la variable de tipo cadena decaracteres nombre se escribe Systemoutprint(nombre) De la misma manera si se quieremostrar el objeto miPiramide que pertenece a la clase Piramide tambieacuten se podriacutea usarSystemoutprint(miPiramide) Java sabe perfectamente coacutemo mostrar nuacutemeros y cadenasde caracteres pero no sabe a priori coacutemo se pintan piraacutemides Para indicar a Java coacutemodebe pintar un objeto de la clase Piramide basta con implementar el meacutetodo toString

dentro de la claseVeamos un ejemplo muy sencillo de implementacioacuten de toString Definiremos la claseCuadrado con el atributo lado el constructor y el meacutetodo toString

Cuadradojava Definicioacuten de la clase Cuadrado author Luis Joseacute Saacutenchez

public class Cuadrado

int lado

public Cuadrado(int l)

thislado = l

public String toString()

Programacioacuten orientada a objetos 106

int i espacios

String resultado =

for (i = 0 i lt thislado i++)

resultado +=

resultado += n

for (i = 1 i lt thislado - 1 i++)

resultado +=

for (espacios = 1 espacios lt thislado - 1 espacios++)

resultado +=

resultado += n

for (i = 0 i lt thislado i++)

resultado +=

resultado += n

return resultado

Observa que el meacutetodo toString() devuelve una cadena de caracteres Esa cadena esprecisamente la que mostraraacute por pantalla Systemoutprint() En el programa que semuestra a continuacioacuten y que prueba la clase Cuadrado puedes comprobar que se pintaun cuadrado igual que si se tratara de cualquier otra variable

PruebaCuadradojava Programa que prueba la clase Cuadrado author Luis Joseacute Saacutenchez

public class PruebaCuadrado

public static void main(String[] args)

Cuadrado miCuadradito = new Cuadrado(5)

Systemoutprintln(miCuadradito)

Programacioacuten orientada a objetos 107

94 Aacutembitovisibilidad de los elementos de una clase - publicprotected y private

Al definir los elementos de una clase se pueden especificar sus aacutembitos (scope) devisibilidad o accesibilidad Un elemento public (puacuteblico) es visible desde cualquierclase un elemento protected (protegido) es visible desde la clase actual y desde todassus subclases y finalmente un elemento private (privado) uacutenicamente es visible dentrode la clase actualEn el siguiente apartado veremos queacute son las subclases De momento fiacutejate en elaacutembito del atributo y de los meacutetodos en la definicioacuten de la clase Animal

Animaljava Definicioacuten de la clase Animal author Luis Joseacute Saacutenchez

public abstract class Animal

private Sexo sexo

public Animal ()

sexo = SexoMACHO

public Animal (Sexo s)

sexo = s

public Sexo getSexo()

return sexo

public String toString()

return Sexo + thissexo + n

Hace que el animal se eche a dormir

public void duerme()

Systemoutprintln(Zzzzzzz)

Programacioacuten orientada a objetos 108

Fiacutejate que el atributo sexo se ha definido como private

private Sexo sexo

Eso quiere decir que a ese atributo uacutenicamente se tiene acceso dentro de la claseAnimal Sin embargo todos los meacutetodos se han definido public lo que significa quese podraacuten utilizar desde cualquier otro programa por ejemplo como veremos maacutesadelante desde el programa PurebaAnimaljava

Salvo casos puntuales se seguiraacute la regla de declarar private las variables deinstancia y public los meacutetodos

El sexo de un animal solo puede ser macho hembra o hermafrodita Una forma dedelimitar los valores que puede tomar un atributo es definir un tipo enumerado

Tipo enumeradoMediante enum se puede definir un tipo enumerado de esta forma un atributosolo podraacute tener uno de los posibles valores que se dan como opcioacuten Losvalores que se especifican en el tipo enumerado se suelen escribir con todaslas letras en mayuacutescula

Sexojava Definicioacuten del tipo enumerado Sexo author Luis Joseacute Saacutenchez

public enum Sexo

MACHO HEMBRA HERMAFRODITA

95 Herencia

La herencia es una de las caracteriacutesticas maacutes importantes de la POO Si definimosuna serie de atributos y meacutetodos para una clase al crear una subclase todos estosatributos y meacutetodos siguen siendo vaacutelidosEn el apartado anterior se define la clase Animal Uno de los meacutetodos de esta clase esduerme A continuacioacuten podemos crear las clases Gato y Perro como subclases de AnimalDe forma automaacutetica se puede utilizar el meacutetodo duerme con las instancias de las clasesGato y Perro iquestno es fantaacutestico

Programacioacuten orientada a objetos 109

La clase Ave es subclase de Animal y la clase Pinguino a su vez seriacutea subclase de Ave ypor tanto hereda todos sus atributos y meacutetodos

Clase abstracta (abstract)Una clase abstracta es aquella que no va a tener instancias de forma directaaunque siacute habraacute instancias de las subclases (siempre que esas subclasesno sean tambieacuten abstractas) Por ejemplo si se define la clase Animal comoabstracta no se podraacuten crear objetos de la clase Animal es decir no se podraacutehacer Animal mascota = new Animal() pero siacute se podraacuten crear instancias de la claseGato Ave o Pinguino que son subclases de Animal

Para crear en Java una subclase de otra clase existente se utiliza la palabra reservadaextends A continuacioacuten se muestra el coacutedigo de las clases Gato Ave y Pinguino asiacutecomo el programa que prueba estas clases creando instancias y aplicaacutendoles meacutetodosRecuerda que la definicioacuten de la clase Animal se muestra en el apartado anterior

Gatojava Definicioacuten de la clase Gato author Luis Joseacute Saacutenchez

public class Gato extends Animal

private String raza

public Gato (Sexo s String r)

super(s)raza = r

public Gato (Sexo s)

super(s)raza = siameacutes

public Gato (String r)

super(SexoHEMBRA)raza = r

public Gato ()

super(SexoHEMBRA)

Programacioacuten orientada a objetos 110

raza = siameacutes

public String toString()

return supertoString()+ Raza + thisraza+ nn

Hace que el gato maulle

public void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

public void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al gato

public void come(String comida)

if (comidaequals(pescado))

Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Pone a pelear dos gatos Solo se van a pelear dos machos entre siacute param contrincante es el gato contra el que pelear

public void peleaCon(Gato contrincante)

Programacioacuten orientada a objetos 111

if (thisgetSexo() == SexoHEMBRA)

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo() == SexoHEMBRA)

Systemoutprintln(no peleo contra gatitas)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

Observa que se definen nada menos que cuatro constructores en la clase Gato Desdeel programa principal se dilucida cuaacutel de ellos se utiliza en funcioacuten del nuacutemero y tipode paraacutemetros que se pasa al meacutetodo Por ejemplo si desde el programa principal secrea un gato de esta forma

Gato gati = new Gato()

entonces se llamariacutea al constructor definido como

public Gato ()

super(SexoHEMBRA)raza = siameacutes

Por tanto gati seriacutea una gata de raza siameacutes Si por el contrario creamos gati de estaotra manera desde el programa principal

Gato gati = new Gato(SexoMACHO siberiano)

se llamariacutea al siguiente constructor

public Gato (Sexo s String r)

super(s)raza = r

y gati seriacutea en este caso un gato macho de raza siberianoEl meacutetodo super() hace una llamada al meacutetodo equivalente de la superclase Fiacutejate quese utiliza tanto en el constructor como en el meacutetodo toString() Por ejemplo al llamara super() dentro del meacutetodo toString() se estaacute llamando al toString() que hay definidoen la clase Animal justo un nivel por encima de Gato en la jerarquiacutea de clasesA continuacioacuten tenemos la definicioacuten de la clase Ave que es una subclase de Animal

Programacioacuten orientada a objetos 112

Avejava Definicioacuten de la clase Ave author Luis Joseacute Saacutenchez

public class Ave extends Animal

public Ave(Sexo s)

super(s)

public Ave()

super()

Hace que el ave se limpie

public void aseate()

Systemoutprintln(Me estoy limpiando las plumas)

Hace que el ave levante el vuelo

public void vuela()

Systemoutprintln(Estoy volando)

951 Sobrecarga de meacutetodos

Un meacutetodo se puede redefinir (volver a definir con el mismo nombre) en una subclasePor ejemplo el meacutetodo vuela que estaacute definido en la clase Ave se vuelve a definir enla clase Pinguino En estos casos indicaremos nuestra intencioacuten de sobreescribir unmeacutetodo mediante la etiqueta OverrideSi no escribimos esta etiqueta la sobreescritura del meacutetodo se realizaraacute de todasformas ya que Override indica simplemente una intencioacuten Ahora imagina que quieressobreescribir el meacutetodo come de Animal declarando un come especiacutefico para los gatos enla clase Gato Si escribes Override y luego te equivocas en el nombre del meacutetodo yescribes comer entonces el compilador diriacutea algo como ldquoiexclCuidado algo no estaacute bienme has dicho que ibas a sobreescribir un meacutetodo de la superclase y sin embargo comer

no estaacute definidordquoA continuacioacuten tienes la definicioacuten de la clase Pinguino

Programacioacuten orientada a objetos 113

Pinguinojava Definicioacuten de la clase Pinguino author Luis Joseacute Saacutenchez

public class Pinguino extends Ave

public Pinguino()

super()

public Pinguino(Sexo s)

super(s)

El pinguumlino se siente triste porque no puede volar

Override

public void vuela()

Systemoutprintln(No puedo volar)

Con el siguiente programa se prueba la clase Animal y todas las subclases que derivande ella Observa cada liacutenea y comprueba queacute hace el programa

PruebaAnimaljava Programa que prueba la clase Animal y sus subclases author Luis Joseacute Saacutenchez

public class PruebaAnimal

public static void main(String[] args)

Gato garfield = new Gato(SexoMACHO romano)

Gato tom = new Gato(SexoMACHO)

Gato lisa = new Gato(SexoHEMBRA)

Gato silvestre = new Gato()

Systemoutprintln(garfield)

Systemoutprintln(tom)

Systemoutprintln(lisa)

Programacioacuten orientada a objetos 114

Systemoutprintln(silvestre)

Ave miLoro = new Ave()

miLoroaseate()

miLorovuela()

Pinguino pingu = new Pinguino(SexoHEMBRA)

pinguaseate()

pinguvuela()

En el ejemplo anterior los objetos miLoro y pingu actuacutean de manera polimoacuterfica porquea ambos se les aplican los meacutetodos aseate y vuela

PolimorfismoEn Programacioacuten Orientada a Objetos se llama polimorfismo a la capacidadque tienen los objetos de distinto tipo (de distintas clases) de responder almismo meacutetodo

96 Atributos y meacutetodos de clase (static)

Hasta el momento hemos definido atributos de instancia como raza sexo o color ymeacutetodos de instancia como maulla come o vuela De tal modo que si en el programa secrean 20 gatos cada uno de ellos tiene su propia raza y puede haber potencialmente20 razas diferentes Tambieacuten podriacutea aplicar el meacutetodo maulla a todos y cada uno deesos 20 gatosNo obstante en determinadas ocasiones nos puede interesar tener atributos de clase(variables de clase) y meacutetodos de clase Cuando se define una variable de clase soloexiste una copia del atributo para toda la clase y no una para cada objeto Esto es uacutetilcuando se quiere llevar la cuenta global de alguacuten paraacutemetro Los meacutetodos de clase seaplican a la clase y no a instancias concretasA continuacioacuten se muestra un ejemplo que contiene la variable de clase kilometra-

jeTotal Si bien cada coche tiene un atributo kilometraje donde se van acumulando loskiloacutemetros que va recorriendo en la variable de clase kilometrajeTotal se lleva la cuentade los kiloacutemetros que han recorrido todos los coches que se han creadoTambieacuten se crea un meacutetodo de clase llamado getKilometrajeTotal que simplemente esun getter para la variable de clase kilometrajeTotal

Programacioacuten orientada a objetos 115

Cochejava Definicioacuten de la clase Coche author Luis Joseacute Saacutenchez

public class Coche

atributo de claseprivate static int kilometrajeTotal = 0

meacutetodo de clasepublic static int getKilometrajeTotal()

return kilometrajeTotal

private String marca

private String modelo

private int kilometraje

public Coche(String ma String mo)

marca = ma

modelo = mo

kilometraje = 0

public int getKilometraje()

return kilometraje

Recorre una determinada distancia param km distancia a recorrer en kiloacutemetros

public void recorre(int km)

kilometraje += km

kilometrajeTotal += km

Como ya hemos comentado el atributo kilometrajeTotal almacena el nuacutemero total dekiloacutemetros que recorren todos los objetos de la clase Coche es un uacutenico valor por esose declara como static Por el contrario el atributo kilometraje almacena los kiloacutemetrosrecorridos por un objeto concreto y tendraacute un valor distinto para cada uno de ellos

Programacioacuten orientada a objetos 116

Si en el programa principal se crean 20 objetos de la clase Coche cada uno tendraacute supropio kilometrajeA continuacioacuten se muestra el programa que prueba la clase Coche

PruebaCochejava Programa que prueba la clase Coche author Luis Joseacute Saacutenchez

public class PruebaCoche

public static void main(String[] args)

Coche cocheDeLuis = new Coche(Saab 93)

Coche cocheDeJuan = new Coche(Toyota Avensis)

cocheDeLuisrecorre(30)

cocheDeLuisrecorre(40)

cocheDeLuisrecorre(220)

cocheDeJuanrecorre(60)

cocheDeJuanrecorre(150)

cocheDeJuanrecorre(90)

Systemoutprintln(El coche de Luis ha recorrido + cocheDeLuisgetKilometraje() +

Km)

Systemoutprintln(El coche de Juan ha recorrido + cocheDeJuangetKilometraje() +

Km)

Systemoutprintln(El kilometraje total ha sido de + CochegetKilometrajeTotal() +

Km)

El meacutetodo getKilometrajeTotal() se aplica a la clase Coche por tratarse de un meacutetodo declase (meacutetodo static) Este meacutetodo no se podriacutea aplicar a una instancia de la mismamanera que un meacutetodo que no sea static no se puede aplicar a la clase sino a losobjetos

97 Interfaces

Una interfaz contiene uacutenicamente la cabecera de una serie de meacutetodos (opcional-mente tambieacuten puede contener constantes) Por tanto se encarga de especificar uncomportamiento que luego tendraacute que ser implementado La interfaz no especificael ldquocoacutemordquo ya que no contiene el cuerpo de los meacutetodos solo el ldquoqueacuterdquoUna interfaz puede ser uacutetil en determinadas circunstancias En principio separala definicioacuten de la implementacioacuten o como deciacuteamos antes el ldquoqueacuterdquo del ldquocoacutemordquo

Programacioacuten orientada a objetos 117

Tendremos entonces la menos dos ficheros la interfaz y la clase que implementaesa interfaz Se puede dar el caso que un programador escriba la interfaz y luegose la pase a otro programador para que sea eacuteste uacuteltimo quien la implementeHay que destacar que cada interfaz puede tener varias implementaciones asociadasPara ilustrar el uso de interfaces utilizaremos algunas clases ya conocidas La super-clase que va a estar por encima de todas las demaacutes seraacute la clase Animal vista conanterioridad El coacutedigo de esta clase no variacutea por lo tanto no lo vamos a reproduciraquiacute de nuevoDefinimos la interfaz Mascota

Mascotajava Definicioacuten de la interfaz Mascota author Luis Joseacute Saacutenchez

public interface Mascota

String getCodigo()

void hazRuido()

void come(String comida)

void peleaCon(Animal contrincante)

Como puedes ver uacutenicamente se escriben las cabeceras de los meacutetodos que debetener las clases que implementen la interfaz MascotaUna de las implementaciones de Mascota seraacute Gato

Gatojava Definicioacuten de la clase Gato author Luis Joseacute Saacutenchez

public class Gato extends Animal implements Mascota

private String codigo

public Gato (Sexo s String c)

super(s)thiscodigo = c

Override

Programacioacuten orientada a objetos 118

public String getCodigo()

return thiscodigo

Hace que el gato emita sonidos

Override

public void hazRuido()

thismaulla()thisronronea()

Hace que el gato maulle

public void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

public void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al gato

Override

public void come(String comida)

if (comidaequals(pescado))

supercome()Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Programacioacuten orientada a objetos 119

Pone a pelear al gato contra otro animal Solo se van a pelear dos machos entre siacute param contrincante es el animal contra el que pelear

Override

public void peleaCon(Animal contrincante)

if (thisgetSexo() == SexoHEMBRA)

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo() == SexoHEMBRA)

Systemoutprintln(no peleo contra hembras)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

Mediante la siguiente liacutenea

public class Gato extends Animal implements Mascota

estamos diciendo que Gato es una subclase de Animal y que ademaacutes es una im-plementacioacuten de la interfaz Mascota Fiacutejate que no es lo mismo la herencia que laimplementacioacutenObserva que los meacutetodos que se indicaban en Mascota uacutenicamente con la cabeceraahora estaacuten implementados completamente en Gato Ademaacutes Gato contiene otrosmeacutetodos que no se indicaban en Mascota como maulla y ronroneaLos meacutetodos de Gato que implementan meacutetodos especificados en Mascota deben tenerla anotacioacuten OverrideComo dijimos anteriormente una interfaz puede tener varias implementaciones Acontinuacioacuten se muestra Perro otra implementacioacuten de Mascota

Programacioacuten orientada a objetos 120

Perrojava Definicioacuten de la clase Perro author Luis Joseacute Saacutenchez

public class Perro extends Animal implements Mascota

private String codigo

public Perro (Sexo s String c)

super(s)thiscodigo = c

Override

public String getCodigo()

return thiscodigo

Hace que el Perro emita sonidos

Override

public void hazRuido()

thisladra()

Hace que el Perro ladre

public void ladra()

Systemoutprintln(Guau guau)

Hace que el Perro coma A los Perros les gusta la carne si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al Perro

Override

public void come(String comida)

if (comidaequals(carne))

Programacioacuten orientada a objetos 121

supercome()Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como carne)

Pone a pelear el perro contra otro animal Solo se van a pelear si los dos son perros param contrincante es el animal contra el que pelear

Override

public void peleaCon(Animal contrincante)

if (contrincantegetClass()getSimpleName()equals(Perro))

Systemoutprintln(ven aquiacute que te vas a enterar)

else

Systemoutprintln(no me gusta pelear)

Por uacuteltimo mostramos el programa que prueba Mascota y sus implementaciones Gato yPerro

PruebaMascotajava Programa que prueba la interfaz Mascota author Luis Joseacute Saacutenchez

public class PruebaMascota

public static void main(String[] args)

Mascota garfield = new Gato(SexoMACHO 34569)

Mascota lisa = new Gato(SexoHEMBRA 96059)

Mascota kuki = new Perro(SexoHEMBRA 234678)

Mascota ayo = new Perro(SexoMACHO 778950)

Systemoutprintln(garfieldgetCodigo())

Systemoutprintln(lisagetCodigo())

Systemoutprintln(kukigetCodigo())

Systemoutprintln(ayogetCodigo())

garfieldcome(pescado)

Programacioacuten orientada a objetos 122

lisacome(hamburguesa)

kukicome(pescado)

lisapeleaCon((Gato)garfield)

ayopeleaCon((Perro)kuki)

Observa que para crear una mascota que es un gato escribimos lo siguiente

Mascota garfield = new Gato(SexoMACHO 34569)

Una interfaz no se puede instanciar por tanto la siguiente liacutenea seriacutea incorrecta

Mascota garfield = new Mascota(SexoMACHO 34569)

InterfacesLa interfaz indica ldquoqueacuterdquo hay que hacer y la implementacioacuten especifica ldquocoacutemordquose haceUna interfaz puede tener varias implementacionesUna interfaz no se puede instanciarLa implementacioacuten puede contener meacutetodos adicionales cuyas cabeceras noestaacuten en su interfaz

98 Arrays de objetos

Del mismo modo que se pueden crear arrays de nuacutemeros enteros decimales o cadenasde caracteres tambieacuten es posible crear arrays de objetosVamos a definir la clase Alumnopara luego crear un array de objetos de esta clase

Alumnojava Definicioacuten de la clase Alumno author Luis Joseacute Saacutenchez

public class Alumno

private String nombre

private double notaMedia = 00

public String getNombre()

Programacioacuten orientada a objetos 123

return nombre

public void setNombre(String nombre)

thisnombre = nombre

public double getNotaMedia()

return notaMedia

public void setNotaMedia(double notaMedia)

thisnotaMedia = notaMedia

A continuacioacuten se define un array de cinco alumnos que posteriormente se rellena Poruacuteltimo se muestran los datos de los alumnos por pantallaObserva que la siguiente liacutenea uacutenicamente define la estructura del array pero no crealos objetos

Alumno[] alum = new Alumno[5]

Cada objeto concreto se crea de forma individual mediante

alum[i] = new Alumno()

Aquiacute tienes el ejemplo completo

ArrayDeAlumnosPrincipaljava Programa que prueba un array de la clase Alumno author Luis Joseacute Saacutenchez

public class ArrayDeAlumnosPrincipal

public static void main(String[] args)

Define la estructura un array de 5 alumnos pero no crea los objetosAlumno[] alum = new Alumno[5]

Pide los datos de los alumnos

Programacioacuten orientada a objetos 124

Systemoutprintln(A continuacion debera introducir el nombre y la nota media de 5 al

umnos)

String nombreIntroducido

double notaIntroducida

for(int i = 0 i lt 5 i++)

alum[i] = new Alumno()

Systemoutprintln(Alumno + i)

Systemoutprint(Nombre )

nombreIntroducido = Systemconsole()readLine()

(alum[i])setNombre(nombreIntroducido)

Systemoutprint(Nota media )

notaIntroducida = DoubleparseDouble(Systemconsole()readLine())

alum[i]setNotaMedia(notaIntroducida)

for i

Muestra los datos de los alumnos

Systemoutprintln(Los datos introducidos son los siguientes)

double sumaDeMedias = 0

for(int i = 0 i lt 5 i++)

Systemoutprintln(Alumno + i)

Systemoutprintln(Nombre + alum[i]getNombre())

Systemoutprintln(Nota media + alum[i]getNotaMedia())

Systemoutprintln(----------------------------)

sumaDeMedias += alum[i]getNotaMedia()

for i

Systemoutprintln(La media global de la clase es + sumaDeMedias 5)

Veamos ahora un ejemplo algo maacutes complejo Se trata de una gestioacuten tiacutepica - altabaja listado y modificacioacuten - de una coleccioacuten de discos Este tipo de programas sesuele denominar CRUD (Create Read Update Delete)Primero se define la clase Disco

Programacioacuten orientada a objetos 125

Discojava Definicioacuten de la clase Disco author Luis Joseacute Saacutenchez

public class Disco

private String codigo = LIBRE

private String autor

private String titulo

private String genero

private int duracion duracioacuten total en minutos

public String getCodigo()

return codigo

public void setCodigo(String codigo)

thiscodigo = codigo

public String getAutor()

return autor

public void setAutor(String autor)

thisautor = autor

public String getGenero()

return genero

public void setGenero(String genero)

thisgenero = genero

public String getTitulo()

return titulo

public void setTitulo(String titulo)

thistitulo = titulo

Programacioacuten orientada a objetos 126

public int getDuracion()

return duracion

public void setDuracion(int duracion)

thisduracion = duracion

public String toString()

String cadena = n------------------------------------------

cadena += nCoacutedigo + thiscodigocadena += nAutor + thisautorcadena += nTiacutetulo + thistitulocadena += nGeacutenero + thisgenerocadena += nDuracioacuten + thisduracioncadena += n------------------------------------------

return cadena

A continuacioacuten se crea el programa principal Cada elemento de la coleccioacuten seraacuteun objeto de la clase Disco Se trata como veraacutes de una gestioacuten muy simple perototalmente funcionalNo se incluye en el manual porque ocupariacutea varias paacuteginas El coacutedigo del programa sepuede descargar desde el siguiente enlace httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos09_POOColeccionDeDiscosColeccionDeDiscosPrincipaljava

Programacioacuten orientada a objetos 127

99 Ejercicios

991 Conceptos de POO

Ejercicio 1iquestCuaacuteles seriacutean los atributos de la clase PilotoDeFormula1 iquestSe te ocurren algunasinstancias de esta clase

Ejercicio 2A continuacioacuten tienes una lista en la que estaacuten mezcladas varias clases coninstancias de esas clases Para ponerlo un poco maacutes difiacutecil todos los elementosestaacuten escritos en minuacutescula Di cuaacuteles son las clases cuaacuteles las instanciasa queacute clase pertenece cada una de estas instancias y cuaacutel es la jerarquiacuteaentre las clases paula goofy gardfiel perro mineral caballo tom silvestrepirita rocinante milu snoopy gato pluto animal javier bucefalo pegasoayudante_de_santa_claus cuarzo laika persona pato_lucas

Ejercicio 3iquestCuaacuteles seriacutean los atributos de la clase Vivienda iquestQueacute subclases se te ocurren

Ejercicio 4Piensa en la liga de baloncesto iquestqueacute 5 clases se te ocurren para representar5 elementos distintos que intervengan en la liga

Ejercicio 5Haz una lista con los atributos que podriacutea tener la clase caballo A continuacioacutenhaz una lista con los posibles meacutetodos (acciones asociadas a los caballos)

Ejercicio 6Lista los atributos de la clase Alumno iquestSeriacutea nombre uno de los atributos de laclase Razona tu respuesta

Ejercicio 7iquestCuaacuteles seriacutean los atributos de la clase Ventana (de ordenador) iquestcuaacuteles seriacuteanlos meacutetodos Piensa en las propiedades y en el comportamiento de unaventana de cualquier programa

Programacioacuten orientada a objetos 128

992 POO en Java

Ejercicio 1Implementa la clase Caballo vista en un ejercicio anterior Prueacutebala creandoinstancias y aplicaacutendole algunos meacutetodos

Ejercicio 2Crea la clase Vehiculo asiacute como las clases Bicicleta y Coche como subclases dela primera Para la clase Vehiculo crea los atributos de clase vehiculosCreadosykilometrosTotales asiacute como el atributo de instancia kilometrosRecorridos Creatambieacuten alguacuten meacutetodo especiacutefico para cada una de las subclases Prueba lasclases creadas mediante un programa con un menuacute como el que se muestraa continuacioacuten

VEHIacuteCULOS

=========

1 Anda con la bicicleta

2 Haz el caballito con la bicicleta

3 Anda con el coche

4 Quema rueda con el coche

5 Ver kilometraje de la bicicleta

6 Ver kilometraje del coche

7 Ver kilometraje total

8 Salir

Elige una opcioacuten (1-8)

Ejercicio 3Crea las clases Animal Mamifero Ave Gato Perro Canario Pinguino y Lagarto Creaal menos tres meacutetodos especiacuteficos de cada clase y redefne ellos meacutetodoscuando sea necesario Prueba las clases creadas en un programa en el que seinstancien objetos y se les apliquen meacutetodos

Ejercicio 4Crea la clase Fraccioacuten Los atributos seraacuten numerador y denominador Y algunos delos meacutetodos pueden ser invierte simplifica multiplica divide etc

Programacioacuten orientada a objetos 129

Ejercicio 5Crea la clase Pizza con los atributos y meacutetodos necesarios Sobre cada pizzase necesita saber el tamantildeo - mediana o familiar - el tipo - margarita cuatroquesos o funghi - y su estado - pedida o servida La clase debe almacenarinformacioacuten sobre el nuacutemero total de pizzas que se han pedido y que sehan servido Siempre que se crea una pizza nueva su estado es ldquopedidardquoEl siguiente coacutedigo del programa principal debe dar la salida que se muestra

public class PedidosPizza

public static void main(String[] args)

Pizza p1 = new Pizza(margarita mediana)

Pizza p2 = new Pizza(funghi familiar)

p2sirve()

Pizza p3 = new Pizza(cuatro quesos mediana)

Systemoutprintln(p1)

Systemoutprintln(p2)

Systemoutprintln(p3)

p2sirve()

Systemoutprintln(pedidas + PizzagetTotalPedidas())

Systemoutprintln(servidas + PizzagetTotalServidas())

pizza margarita mediana pedida

pizza funghi familiar servida

pizza cuatro quesos mediana pedida

esa pizza ya se ha servido

pedidas 3

servidas 1

Ejercicio 6Crea la clase Tiempo con los meacutetodos suma y resta Los objetos de la clase Tiempo

son intervalos de tiempo y se crean de la forma Tiempo t = new Tiempo(1 20

30) donde los paraacutemetros que se le pasan al constructor son las horas losminutos y los segundos respectivamente Crea el meacutetodo toString para ver losintervalos de tiempo de la forma 10h 35m 5s Si se suman por ejemplo 30m 40s y35m 20s el resultado deberiacutea ser 1h 6m 0s Realiza un programa de prueba paracomprobar que la clase funciona bien

Programacioacuten orientada a objetos 130

Ejercicio 7Queremos gestionar la venta de entradas (no numeradas) de ExpocochesCampanillas que tiene 3 zonas la sala principal con 1000 entradas dispo-nibles la zona de compra-venta con 200 entradas disponibles y la zona vipcon 25 entradas disponibles Hay que controlar que existen entradas antes devenderlasLa clase Zona con sus atributos y meacutetodos se muestra a continuacioacuten

Definicioacuten de la clase Zona author Luis Joseacute Saacutenchez

public class Zona

private int entradasPorVender

public Zona(int n)

entradasPorVender = n

public int getEntradasPorVender()

return entradasPorVender

Vende un nuacutemero de entradas ltpgt Comprueba si quedan entradas libres antes de realizar la venta param n nuacutemero de entradas a vender

public void vender(int n)

if (thisentradasPorVender == 0)

Systemoutprintln(Lo siento las entradas para esa zona estaacuten agotadas)

else if (thisentradasPorVender lt n)

Systemoutprintln(Soacutelo me quedan + thisentradasPorVender+ entradas para esa zona)

if (thisentradasPorVender gt= n)

entradasPorVender -= n

Systemoutprintln(Aquiacute tiene sus + n + entradas gracias)

El menuacute del programa debe ser el que se muestra a continuacioacuten Cuandoelegimos la opcioacuten 2 se nos debe preguntar para queacute zona queremos lasentradas y cuaacutentas queremos Loacutegicamente el programa debe controlar queno se puedan vender maacutes entradas de la cuenta

1 Mostrar nuacutemero de entradas libres

2 Vender entradas

3 Salir

Programacioacuten orientada a objetos 131

993 Arrays de objetos

Ejercicio 1Utiliza la clase Gato para crear un array de cuatro gatos e introduce los datosde cada uno de ellos mediante un bucle Muestra a continuacioacuten los datos detodos los gatos utilizando tambieacuten un bucle

Ejercicio 2Cambia el programa anterior de tal forma que los datos de los gatos se intro-duzcan directamente en el coacutedigo de la forma gatito[2]setColor(ldquomarroacutenrdquo) o bienmediante el constructor de la forma gatito[3] = new Gato(ldquoGarfieldrdquo ldquonaranjardquo

ldquomachordquo) Muestra a continuacioacuten los datos de todos los gatos utilizando unbucle

Ejercicio 3Realiza el programa ldquoColeccioacuten de discosrdquo por tu cuenta mirando lo menosposible el ejemplo que se proporciona Prueacutebalo primero para ver coacutemofunciona y luego intenta implementarlo tuacute mismo

Ejercicio 4Modifica el programa ldquoColeccioacuten de discosrdquo como se indica a continuacioacutena) Mejora la opcioacuten ldquoNuevo discordquo de tal forma que cuando se llenen todas lasposiciones del array el programa muestre un mensaje de error No se permitiraacuteintroducir los datos de ninguacuten disco hasta que no se borre alguno de la listab) Mejora la opcioacuten ldquoBorrarrdquo de tal forma que se verifique que el coacutedigointroducido por el usuario existec) Modifica el programa de tal forma que el coacutedigo del disco sea uacutenico es decirque no se pueda repetird) Crea un submenuacute dentro dentro de ldquoListadordquo de tal forma que exista unlistado completo un listado por autor (todos los discos que ha publicado undeterminado autor) un listado por geacutenero (todos los discos de un geacutenero de-terminado) y un listado de discos cuya duracioacuten esteacute en un rango determinadopor el usuario

Programacioacuten orientada a objetos 132

Ejercicio 5Crea el programa GESTISIMAL (GESTIoacuten SIMplificada de Almaceacuten) para llevarel control de los artiacuteculos de un almaceacuten De cada artiacuteculo se debe saberel coacutedigo la descripcioacuten el precio de compra el precio de venta y el stock(nuacutemero de unidades) El menuacute del programa debe tener al menos lassiguientes opciones

1 Listado

2 Alta

3 Baja

4 Modificacioacuten

5 Entrada de mercanciacutea

6 Salida de mercanciacutea

7 Salir

La entrada y salida de mercanciacutea supone respectivamente el incremento ydecremento de stock de un determinado artiacuteculo Hay que controlar que no sepueda sacar maacutes mercanciacutea de la que hay en el almaceacuten

10 Colecciones y diccionarios

101 Colecciones la clase ArrayList

Una coleccioacuten en Java es una estructura de datos que permite almacenar muchosvalores del mismo tipo por tanto conceptualmente es praacutecticamente igual que unarray Seguacuten el uso y seguacuten si se permiten o no repeticiones Java dispone de un ampliocataacutelogo de colecciones ArrayList (lista) ArrayBlockingQueue (cola) HashSet (conjunto)Stack (pila) etc En este manual estudiaremos la coleccioacuten ArrayListUn ArrayList es una estructura en forma de lista que permite almacenar elementos delmismo tipo (pueden ser incluso objetos) su tamantildeo va cambiando a medida que seantildeaden o se eliminan esos elementosNos podemos imaginar un ArrayList como un conjunto de celdas o cajoncitos donde seguardan los valores exactamente igual que un array convencional En la praacutectica seraacutemaacutes faacutecil trabajar con un ArrayListEn capiacutetulos anteriores hemos podido comprobar la utilidad del array es un recursoimprescindible que cualquier programador debe manejar con soltura No obstante elarray presenta algunos inconvenientes Uno de ellos es la necesidad de conocer eltamantildeo exacto en el momento de su creacioacuten Una coleccioacuten sin embargo se crea sinque se tenga que especificar el tamantildeo posteriormente se van antildeadiendo y quitandoelementos a medida que se necesitanTrabajando con arrays es frecuente cometer errores al utilizar los iacutendices por ejemploal intentar guardar un elemento en una posicioacuten que no existe (iacutendice fuera de rango)Aunque las colecciones permiten el uso de iacutendices no es necesario indicarlos siemprePor ejemplo en una coleccioacuten del tipo ArrayList cuando hay que antildeadir el elementoAmapola se puede hacer simplemente floresadd(Amapola) Al no especificar iacutendice elelemento Amapola se antildeadiriacutea justo al final de flores independientemente del tamantildeoy del nuacutemero de elementos que se hayan introducido yaLa clase ArrayList es muy similar a la clase Vector Eacutesta uacuteltima estaacute obsoleta y por tantono se recomienda su uso

1011 Principales meacutetodos de ArrayList

Las operaciones maacutes comunes que se pueden realizar con un objeto de la claseArrayList son las siguientes

add(elemento)Antildeade un elemento al final de la lista

133

Colecciones y diccionarios 134

add(indice elemento)Inserta un elemento en una posicioacuten determinada desplazando el resto deelementos hacia la derecha

clear()Elimina todos los elementos pero no borra la lista

contains(elemento)Devuelve true si la lista contiene el elemento que se especifica y false en casocontrario

get(indice)Devuelve el elemento de la posicioacuten que se indica entre pareacutentesis

indexOf(elemento)Devuelve la posicioacuten de la primera ocurrencia del elemento que se indica entrepareacutentesis

isEmpty()Devuelve true si la lista estaacute vaciacutea y false en caso de tener alguacuten elemento

remove(indice)Elimina el elemento que se encuentra en una posicioacuten determinada

remove(elemento)Elimina la primera ocurrencia de un elemento

set(indice elemento)Machaca el elemento que se encuentra en una determinada posicioacuten con elelemento que se pasa como paraacutemetro

size()Devuelve el tamantildeo (nuacutemero de elementos) de la lista

toArray()Devuelve un array con todos y cada uno de los elementos que contiene la lista

Puedes consultar todos los meacutetodos disponibles en la documentacioacuten oficial de la claseArrayList1

1httpdocsoraclecomjavase7docsapijavautilArrayListhtml

Colecciones y diccionarios 135

1012 Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de suselementos

A continuacioacuten se muestra un ejemplo en el que se puede ver coacutemo se declara unArrayList y coacutemo se insertan y se extraen elementos

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList01

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

Systemoutprintln(Nordm de elementos + asize())

aadd(rojo)

aadd(verde)

aadd(azul)

Systemoutprintln(Nordm de elementos + asize())

aadd(blanco)

Systemoutprintln(Nordm de elementos + asize())

Systemoutprintln(El elemento que hay en la posicioacuten 0 es + aget(0))

Systemoutprintln(El elemento que hay en la posicioacuten 3 es + aget(3))

Observa que al crear un objeto de la clase ArrayList hay que indicar el tipo de dato quese almacenaraacute en las celdas de esa lista Para ello se utilizan los caracteres lt y gt Nohay que olvidar los pareacutentesis del final

Es necesario importar la clase ArrayList para poder crear objetos de estaclase para ello debe aparecer al principio del programa la liacutenea import

javautilArrayList Algunos IDEs (por ej Netbeans) insertan esta liacutenea decoacutedigo de forma automaacutetica

En el siguiente ejemplo se muestra un ArrayList de nuacutemeros enteros

Colecciones y diccionarios 136

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList011

public static void main(String[] args)

ArrayListltIntegergt a = new ArrayListltIntegergt()

aadd(18)

aadd(22)

aadd(-30)

Systemoutprintln(Nordm de elementos + asize())

Systemoutprintln(El elemento que hay en la posicioacuten 1 es + aget(1))

Se define la estructura de la siguiente manera

ArrayListltIntegergt a = new ArrayListltIntegergt()

Fiacutejate que no se utiliza el tipo simple int sino el wrapper Integer Recuerda quelos wrapper son clases que engloban a los tipos simples y les antildeaden nuevasfuncionalidades (p ej permiten tratar a las variables numeacutericas como objetos) Elwrapper de int es Integer el de float es Float el de double es Double el de long es Longel de boolean es Boolean y el de char es CharacterEn el siguiente ejemplo podemos ver coacutemo extraer todos los elementos de una lista ala manera tradicional con un bulce for

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList02

Colecciones y diccionarios 137

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(int i=0 i lt asize() i++)

Systemoutprintln(aget(i))

Si estaacutes acostumbrado al for claacutesico habraacutes visto que es muy sencillo recorrer todoslos elementos del ArrayList No obstante al trabajar con colecciones es recomendableusar el for al estilo foreach como se muestra en el siguiente ejemplo Como puedes verla sintaxis es maacutes corta y no se necesita crear un iacutendice para recorrer la estructura

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList03

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(String color a)

Colecciones y diccionarios 138

Systemoutprintln(color)

Fiacutejate en estas liacuteneas

for(String color a)

Systemoutprintln(color)

El significado de este coacutedigo seriacutea el siguiente

for(String color a)

rarr Saca uno a uno todos los elementos de a y ve metieacutendolos en una variable de nombrecolor

Systemoutprintln(color)

rarr Muestra por pantalla el contenido de la variable colorVeamos ahora en otro ejemplo coacutemo eliminar elementos de un ArrayList Se utiliza elmeacutetodo remove() y se puede pasar como paraacutemetro el iacutendice del elemento que se quiereeliminar o bien el valor del elemento O sea aremove(2) elimina el elemento que seencuentra en la posicioacuten 2 de a mientras que aremove(blanco) elimina el valor blancoEs importante destacar que el ArrayList se reestructura de forma automaacutetica despueacutesdel borrado de cualquiera de sus elementos

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList04

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

Colecciones y diccionarios 139

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

aadd(blanco)

Systemoutprintln(Contenido de la lista )

for(String color a)

Systemoutprintln(color)

if (acontains(blanco))

Systemoutprintln(El blanco estaacute en la lista de colores)

aremove(blanco)

Systemoutprintln(Contenido de la lista despueacutes de quitar la +

primera ocurrencia del color blanco )

for(String color a)

Systemoutprintln(color)

aremove(2)

Systemoutprintln(Contenido de la lista despueacutes de quitar el +

elemento de la posicioacuten 2 )

for(String color a)

Systemoutprintln(color)

A continuacioacuten se muestra un ejemplo en el que se ldquomachacardquo una posicioacuten delArrayList Al hacer aset(2 turquesa) se borra lo que hubiera en la posicioacuten 2 y secoloca el valor turquesa Seriacutea equivalente a hacer a[2] = turquesa en caso de que a

fuese un array tradicional en lugar de un ArrayList

Colecciones y diccionarios 140

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList05

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido del vector )

for(String color a)

Systemoutprintln(color)

aset(2 turquesa)

Systemoutprintln(Contenido del vector despueacutes de machacar la posicioacuten 2 )

for(String color a)

Systemoutprintln(color)

El meacutetodo add permite antildeadir elementos a un ArrayList como ya hemos visto Porejemplo aadd(amarillo) antildeade el elemento amarillo al final de a Este meacutetodo sepuede utilizar tambieacuten con un iacutendice de la forma aadd(1 turquesa) En este caso loque se hace es insertar en la poscioacuten indicada Lo mejor de todo es que el ArrayList sereestructura de forma automaacutetica desplazando el resto de elementos

Colecciones y diccionarios 141

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList06

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(String color a)

Systemoutprintln(color)

aadd(1 turquesa)

Systemoutprintln(Contenido del vector despueacutes de insertar en la posicioacuten 1 )

for(String color a)

Systemoutprintln(color)

1013 ArrayList de objetos

Una coleccioacuten ArrayList puede contener objetos que son instancias de clases definidaspor el programador Esto es muy uacutetil sobre todo en aplicaciones de gestioacuten paraguardar datos de alumnos productos libros etcEn el siguiente ejemplo definimos una lista de gatos En cada celda de la lista sealmacenaraacute un objeto de la clase Gato

Colecciones y diccionarios 142

Uso de un ArrayList de objetos author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList07

public static void main(String[] args)

ArrayListltGatogt g = new ArrayListltGatogt()

gadd(new Gato(Garfield naranja mestizo))

gadd(new Gato(Pepe gris angora))

gadd(new Gato(Mauri blanco manx))

gadd(new Gato(Ulises marroacuten persa))

Systemoutprintln(nDatos de los gatosn)

for (Gato gatoAux g)

Systemoutprintln(gatoAux+n)

En el siguiente apartado se muestra la definicioacuten de la clase Gato

1014 Ordenacioacuten de un ArrayList

Los elementos de una lista se pueden ordenar con el meacutetodo sort El formato es elsiguiente

Collectionssort(lista)

Observa que sort es un meacutetodo de clase que estaacute definido en Collections Para poderutilizar este meacutetodo es necesario incluir la liacutenea

import javautilCollections

al principio del programa A continuacioacuten se muestra un ejemplo del uso de sort

Colecciones y diccionarios 143

Ordenacioacuten de un ArrayList author Luis Joseacute Saacutenchez

import javautilCollectionsimport javautilArrayList

public class EjemploArrayList071

public static void main(String[] args)

ArrayListltIntegergt a = new ArrayListltIntegergt()

aadd(67)

aadd(78)

aadd(10)

aadd(4)

Systemoutprintln(nNuacutemeros en el orden original)

for (int numero a)

Systemoutprintln(numero)

Collectionssort(a)

Systemoutprintln(nNuacutemeros ordenados)

for (int numero a)

Systemoutprintln(numero)

Tambieacuten es posible ordenar una lista de objetos En este caso es necesario indicar elcriterio de ordenacioacuten en la definicioacuten de la clase En el programa principal se utilizael meacutetodo sort igual que si se tratase de una lista de nuacutemeros o de palabras como semuestra a continuacioacuten

Colecciones y diccionarios 144

Ordenacioacuten de un ArrayList de objetos author Luis Joseacute Saacutenchez

import javautilCollectionsimport javautilArrayList

public class EjemploArrayList08

public static void main(String[] args)

ArrayListltGatogt g = new ArrayListltGatogt()

gadd(new Gato(Garfield naranja mestizo))

gadd(new Gato(Pepe gris angora))

gadd(new Gato(Mauri blanco manx))

gadd(new Gato(Ulises marroacuten persa))

gadd(new Gato(Adaacuten negro angora))

Collectionssort(g)

Systemoutprintln(nDatos de los gatos ordenados por nombre)

for (Gato gatoAux g)

Systemoutprintln(gatoAux+n)

Ahora bien en la definicioacuten de la clase Gato hay que indicar de alguna manera coacutemo sedebe realizar la ordenacioacuten ya que Java no sabe de antemano si los gatos se ordenanseguacuten el color el nombre el peso etcLo primero que hay que hacer es indicar que los objetos de la clase Gato se puedencomparar unos con otros Para ello cambiamos la siguiente liacutenea

public class Gato

por esta otra

public class Gato implements ComparableltGatogt

Lo siguiente y no menos importante es definir el meacutetodo compareTo Este meacutetodo debedevolver un 0 si los elementos que se comparan son iguales un nuacutemero negativo si

Colecciones y diccionarios 145

el primer elemento que se compara es menor que el segundo y un nuacutemero positivoen caso contrario Afortunadamente las clases String Integer Double etc ya tienenimplementado su propio meacutetodo compareTo asiacute que tenemos hecho lo maacutes difiacutecil Louacutenico que deberemos escribir en nuestro coacutedigo es un compareTo con los atributos quequeremos compararEn el caso que nos ocupa si queremos ordenar los gatos por nombre tendremos queimplementar el compareTo de la clase Gato de tal forma que nos devuelva el resultadodel compareTo de los nombres de los gatos que estamos comparando de la siguientemanera

public int compareTo(Gato g)

return (thisnombre)compareTo(ggetNombre())

Si en lugar de ordenar por nombre quisieacuteramos ordenar por raza el meacutetodo compareTo

de la clase Gato seriacutea el siguiente

public int compareTo(Gato g)

return (thisraza)compareTo(ggetRaza())

A continuacioacuten se muestra la definicioacuten completa de la clase Gato

Definicioacuten de la clase Gato author

public class Gato implements ComparableltGatogt

private String nombre

private String color

private String raza

public Gato(String nombre String color String raza)

thisnombre = nombre

thiscolor = color

thisraza = raza

public String getNombre()

return nombre

Colecciones y diccionarios 146

public String getRaza()

return raza

public String toString()

return Nombre + thisnombre + nColor + thiscolor + nRaza + thisraza

public int compareTo(Gato g)

return (thisnombre)compareTo(ggetNombre())

public boolean equals(Gato g)

return (thisnombre)equals(ggetNombre())

102 Diccionarios la clase HashMap

Imagina un diccionario ingleacutes-espantildeol Queremos saber queacute significa la palabra ldquostiffrdquoSabemos que en el diccionario hay muchas entradas y en cada entrada tenemos unapalabra en ingleacutes y su correspondiente traduccioacuten al espantildeol Buscando por la ldquosrdquoencontramos que ldquostiffrdquo significa ldquoagujetasrdquoUn diccionario en Java funciona exactamente igual Contiene una serie de elementosque son las entradas que a su vez estaacuten formadas por un par (clave valor) La clave(key) permite acceder al valor No puede haber claves duplicadas En el ejemploanterior la clave seriacutea ldquostiffrdquo y el valor ldquoagujetasrdquoJava dispone de varios tipos de diccionarios HashMap EnumMap Hashtable IdentityHashMapLinkedHashMap etc Nosotros estudiaremos el diccionario HashMap

1021 Principales meacutetodos de HashMap

Algunos de los meacutetodos maacutes importantes de la clase HasMap son

get(clave)Obtiene el valor correspondiente a una clave Devuelve null si no existe esa claveen el diccionario

put(clave valor)Antildeade un par (clave valor) al diccionario Si ya habiacutea un valor para esa clave semachaca

keySet()Devuelve un conjunto (set) con todas las claves

Colecciones y diccionarios 147

values()Devuelve una coleccioacuten con todos los valores (los valores pueden estar duplicadosa diferencia de las claves)

entrySet()Devuelve una coleccioacuten con todos los pares (clave valor)

containsKey(clave)Devuelve true si el diccionario contiene la clave indicada y false en caso contrario

getKey()Devuelve la clave de la entrada Se aplica a una sola entrada del diccionario (noal diccionario completo) es decir a una pareja (clave valor)

Por ejemplo

for (MapEntry pareja mentrySet())

Systemoutprintln(parejagetKey())

getValue()Devuelve el contenido de la entrada Se aplica a una entrada del diccionario (noal diccionario completo) es decir a una pareja (clave valor)

Por ejemplo

for (MapEntry pareja mentrySet())

Systemoutprintln(parejagetValue())

1022 Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas

Al declarar un diccionario hay que indicar los tipos tanto de la clave como del valorEn el siguiente ejemplo definimos el diccionario m que tendraacute como clave un nuacutemeroentero y una cadena de caracteres como valor Este diccionario se declara de estaforma

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

No hay que olvidar importar la clase al principio del programa

import javautilHashMap

Para insertar una entrada en el diccionario se utiliza el meacutetodo put indicando siemprela clave y el valor Veamos un ejemplo completo

Colecciones y diccionarios 148

Ejemplo de uso de la clase HasMap author Luis Joseacute Saacutenchez

import javautilHashMap

public class EjemploHashMap01

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(Los elementos de m son n + m)

Para extraer valores se utiliza el meacutetodo get Se proporciona una clave y el diccionarionos devuelve el valor igual que un diccionario de verdad Si no existe ninguna entradacon la clave que se indica se devuelve null

Ejemplo de uso de la clase HasMap author Luis Joseacute Saacutenchez

import javautilHashMap

public class EjemploHashMap011

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

Colecciones y diccionarios 149

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(mget(921))

Systemoutprintln(mget(605))

Systemoutprintln(mget(888))

iquestY si queremos extraer todas las entradas Tenemos varias opciones Podemos usar elmeacutetodo print directamente sobre el diccionario de la forma Systemoutprint(diccionario)

como vimos en un ejemplo anterior de esta manera se muestran por pantalla todaslas entradas encerradas entre llaves Tambieacuten podemos convertir el diccionario enun entrySet (conjunto de entradas) y mostrarlo con print de esta forma se obtieneuna salida por pantalla muy parecida a la primera (en lugar de llaves se muestrancorchetes) Otra opcioacuten es utilizar un for para recorrer una a una todas las entradasEn este uacuteltimo caso hay que convertir el diccionario en un entrySet ya que no se puedensacar las entradas directamente del diccionario Estas dos uacuteltimas opciones se ilustranen el siguiente ejemplo

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautilHashMapimport javautilMap

public class EjemploHashMap02

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(Todas las entradas del diccionario extraiacutedas con entrySet)

Systemoutprintln(mentrySet())

Systemoutprintln(nEntradas del diccionario extraiacutedas una a una)

Colecciones y diccionarios 150

for (MapEntry pareja mentrySet())

Systemoutprintln(pareja)

A continuacioacuten se muestra el uso de los meacutetodos getKey y getValue que extraen la clavey el valor de una entrada respectivamente

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautil

public class EjemploHashMap03

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(CoacutedigotNombren------t-------------)

for (MapEntry pareja mentrySet())

Systemoutprint(parejagetKey() + t)

Systemoutprintln(parejagetValue())

En el uacuteltimo programa de ejemplo hacemos uso del meacutetodo containsKey que nos serviraacutepara saber si existe o no una determinada clave en un diccionario y del meacutetodo get

que como ya hemos visto sirve para extraer un valor a partir de su clave

Colecciones y diccionarios 151

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautil

public class EjemploHashMap04

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprint(Por favor introduzca un coacutedigo )

int codigoIntroducido = IntegerparseInt(Systemconsole()readLine())

if (mcontainsKey(codigoIntroducido))

Systemoutprint(El coacutedigo + codigoIntroducido + corresponde a )

Systemoutprintln(mget(codigoIntroducido))

else

Systemoutprint(El coacutedigo introducido no existe)

Colecciones y diccionarios 152

103 Ejercicios

Ejercicio 1Crea un ArrayList con los nombres de 6 compantildeeros de clase A continuacioacutenmuestra esos nombres por pantalla Utiliza para ello un bucle for que recorratodo el ArrayList sin usar ninguacuten iacutendice

Ejercicio 2Realiza un programa que introduzca valores aleatorios (entre 0 y 100) en unArrayList y que luego calcule la suma la media el maacuteximo y el miacutenimo de esosnuacutemeros El tamantildeo de la lista tambieacuten seraacute aleatorio y podraacute oscilar entre 10y 20 elementos ambos inclusive

Ejercicio 3Escribe un programa que ordene 10 nuacutemeros enteros introducidos por tecladoy almacenados en un objeto de la clase ArrayList

Ejercicio 4Realiza un programa equivalente al anterior pero en esta ocasioacuten el programadebe ordenar palabras en lugar de nuacutemeros

Ejercicio 5Realiza de nuevo el ejercicio de la coleccioacuten de discos pero utilizando esta vezuna lista para almacenar la informacioacuten sobre los discos en lugar de un arrayconvencional Comprobaraacutes que el coacutedigo se simplifica notablemente iquestCuaacutentoocupa el programa original hecho con un array iquestCuaacutento ocupa este nuevoprograma hecho con una lista

Ejercicio 6Implementa el control de acceso al aacuterea restringida de un programa Se debepedir un nombre de usuario y una contrasentildea Si el usuario introduce losdatos correctamente el programa diraacute ldquoHa accedido al aacuterea restringidardquo Elusuario tendraacute un maacuteximo de 3 oportunidades Si se agotan las oportunidadesel programa diraacute ldquoLo siento no tiene acceso al aacuterea restringidardquo Los nombresde usuario con sus correspondientes contrasentildeas deben estar almacenadosen una estructura de la clase HashMap

Colecciones y diccionarios 153

Ejercicio 7La maacutequina Eurocoin genera una moneda de curso legal cada vez que se pulsaun botoacuten siguiendo la siguiente pauta o bien coincide el valor con la monedaanteriormente generada - 1 ceacutentimo 2 ceacutentimos 5 ceacutentimos 10 ceacutentimos 25ceacutentimos 50 ceacutentimos 1 euro o 2 euros - o bien coincide la posicioacuten ndash cara ocruz Simula mediante un programa la generacioacuten de 6 monedas aleatoriassiguiendo la pauta correcta Cada moneda generada debe ser una instanciade la clase Moneda y la secuencia se debe ir almacenando en una lista

Ejemplo

2 ceacutentimos ndash cara

2 ceacutentimos ndash cruz

50 ceacutentimos ndash cruz

1 euro ndash cruz

1 euro ndash cara

10 ceacutentimos ndash cara

Ejercicio 8Realiza un programa que escoja al azar 10 cartas de la baraja espantildeola(10 objetos de la clase Carta) Emplea un objeto de la clase ArrayList paraalmacenarlas y aseguacuterate de que no se repite ninguna

Ejercicio 9Modifica el programa anterior de tal forma que las cartas se muestren orde-nadas Primero se ordenaraacuten por palo bastos copas espadas oros Cuandocoincida el palo se ordenaraacute por nuacutemero as 2 3 4 5 6 7 sota caballo rey

Ejercicio 10Crea un mini-diccionario espantildeol-ingleacutes que contenga al menos 20 palabras(con su correspondiente traduccioacuten) Utiliza un objeto de la clase HashMap paraalmacenar las parejas de palabras El programa pediraacute una palabra en espantildeoly daraacute la correspondiente traduccioacuten en ingleacutes

Ejercicio 11Realiza un programa que escoja al azar 5 palabras en espantildeol del mini-diccionario del ejercicio anterior El programa iraacute pidiendo que el usuarioteclee la traduccioacuten al ingleacutes de cada una de las palabras y comprobaraacute sison correctas Al final el programa deberaacute mostrar cuaacutentas respuestas sonvaacutelidas y cuaacutentas erroacuteneas

Colecciones y diccionarios 154

Ejercicio 12Escribe un programa que genere una secuencia de 5 cartas de la barajaespantildeola y que sume los puntos seguacuten el juego de la brisca El valor de lascartas se debe guardar en una estructura HashMap que debe contener parejas(figura valor) por ejemplo (ldquocaballordquo 3) La secuencia de cartas debe ser unaestructura de la clase ArrayList que contiene objetos de la clase Carta El valorde las cartas es el siguiente as rarr 11 tres rarr 10 sota rarr 2 caballo rarr 3 rey rarr4 el resto de cartas no vale nada

Ejemplo

as de oros

cinco de bastos

caballo de espadas

sota de copas

tres de oros

Tienes 26 puntos

Ejercicio 13Modifica el programa Gestisimal realizado anteriormente antildeadiendo lassiguientes mejoras

bull Utiliza una lista en lugar de un array para el almacenamiento de los datosbull Comprueba la existencia del coacutedigo en el alta la baja y la modificacioacuten

de artiacuteculos para evitar erroresbull Cambia la opcioacuten ldquoSalida de stockrdquo por ldquoVentardquo Esta nueva opcioacuten

permitiraacute hacer una venta de varios artiacuteculos y emitir la factura corres-pondiente Se debe preguntar por los coacutedigos y las cantidades de cadaartiacuteculo que se quiere comprar Aplica un 21 de IVA

11 Ficheros de texto y paso de paraacutemetrospor liacutenea de comandos

Mediante un programa en Java se puede acceder al contenido de un fichero grabadoen un dispositivo de almacenamiento (por ejemplo en el disco duro) tanto para leercomo para escribir (grabar) datosLa informacioacuten contenida en las variables los arrays los objetos o cualquier otraestructura de datos es volaacutetil es decir se pierde cuando se cierra el programaLos ficheros permiten tener ciertos datos almacenados y disponibles en cualquiermomento para cuando nuestro programa los necesitePensemos por ejemplo en un juego Podriacuteamos utilizar un fichero para guardar elranking de jugadores con las mejores puntuaciones De esta manera estos datos nose perderiacutean al salir del juego De igual forma en un programa de gestioacuten puede seruacutetil tener un fichero de configuracioacuten con datos como el nuacutemero maacuteximo de elementosque se muestran en un listado o los distintos tipos de IVA aplicables a las facturas Almodificar esta informacioacuten quedaraacute almacenada en el fichero correspondiente y nose perderaacute cuando se cierre el programa

Cuando un programa se cierra se pierde la informacioacuten almacenada envariables arrays objetos o cualquier otra estructura Si queremos conservarciertos datos debemos guardarlos en ficheros

Hay programas que hacen un uso intensivo de datos Por ejemplo la aplicacioacutenSeacuteneca- que por cierto estaacute hecha en Java - lleva el control de la matriculacioacuten de cientosde miles de alumnos y la gestioacuten de decenas de miles de profesores En este caso yen otros similares se utiliza un sistema gestor de bases de datos El acceso a bases dedatos mediante Java lo estudiaremos en el capiacutetulo 13

La creacioacuten y uso de ficheros desde un programa en Java se lleva a cabocuando hay poca informacioacuten que almacenar o cuando esa informacioacuten esheterogeacutenea En los casos en que la informacioacuten es abundante y homogeacuteneaes preferible usar una base de datos relacional (por ejemplo MySQL) en lugarde ficheros

En este capiacutetulo estudiaremos ademaacutes del acceso a ficheros desde un programa enJava el paso de paraacutemetros desde la liacutenea de comandos Son cosas diferentes y nohay que utilizarlas juntas necesariamente pero como podraacutes comprobar se combinanmuy bien por eso hemos incluido estos dos recursos de Java en un mismo capiacutetulo

155

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 156

111 Lectura de un fichero de texto

Aunque Java puede manejar tambieacuten ficheros binarios vamos a centrarnos exclusi-vamente en la utilizacioacuten de ficheros de texto Los ficheros de texto tienen una granventaja se pueden crear y manipular mediante cualquier editor como por ejemploGEditSiempre que vayamos a usar ficheros deberemos incluir al principio del programa unao varias liacuteneas para cargar las clases necesarias Anque se pueden cargar varias clasesen una sola liacutenea usando el asterisco de la siguiente manera

import javaio

nosotros no lo haremos asiacute ya que nuestro coacutedigo sigue las normas del estaacutendar deGoogle y estas normas lo prohiben taxativamente Se importaraacuten las clases usandovarias liacuteneas una liacutenea por cada clase que se importa en el programa de esta forma

import javaioBufferedReaderimport javaioFileReader

No es necesario saber de memoria los nombres de las clases el entorno de desarrolloNetbeans detecta queacute clases hacen falta cargar y antildeade los import de forma automaacute-ticaTodas las operaciones que se realicen sobre ficheros deberaacuten estar incluidas en unbloque try-catch Esto nos permitiraacute mostrar mensajes de error y terminar el programade una forma ordenada en caso de que se produzca alguacuten fallo - el fichero no existeno tenemos permiso para acceder a eacutel etcEl bloque try-catch tiene el siguiente formato

try

Operaciones_con_fichero

catch (tipo_de_error nombre_de_variable)

Mensaje_de_error

Tanto para leer como para escribir utilizamos lo que en programacioacuten se llama unldquomanejador de ficherordquo Es algo asiacute como una variable que hace referencia al ficherocon el que queremos trabajarEn nuestro ejemplo el manejador de fichero se llama bf y se crea de la siguientemanera

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 157

BufferedReader bf = new BufferedReader(new FileReader(malaga1txt))

El fichero con el que vamos a trabajar tiene por nombre malaga1txt y contieneinformacioacuten extraiacuteda de la Wikipedia sobre la bonita ciudad de Maacutelaga1 A partir deaquiacute siempre que queramos realizar una operacioacuten sobre ese archivo utilizaremos sumanejador de fichero asociado es decir bfEn el ejemplo que se muestra a continuacioacuten el programa lee el contenido del ficheromalaga1txt y lo muestra tal cual en pantalla igual que si hicieacuteramos en una ventanade terminal cat malaga1txtObserva que se va leyendo el fichero liacutenea a liacutenea mediante bfreadLine() hasta que seacaban las liacuteneas Cuando no quedan maacutes liacuteneas por leer se devuelve el valor null

Ejemplo de uso de la clase File Lectura de un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileNotFoundExceptionimport javaioFileReaderimport javaioIOException

class EjemploFichero01

public static void main(String[] args)

try

BufferedReader bf = new BufferedReader(new FileReader(malaga1txt))

String linea =

while (linea = null)

Systemoutprintln(linea)

linea = bfreadLine()

bfclose()

catch (FileNotFoundException e) queacute hacer si no se encuentra el ficheroSystemoutprintln(No se encuentra el fichero malagatxt)

catch (IOException e) queacute hacer si hay un error en la lectura del fichero

1httpeswikipediaorgwikiMC3A1laga

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 158

Systemoutprintln(No se puede leer el fichero malagatxt)

Es importante ldquocerrar el ficherordquo cuando se han realizado todas las operacionesnecesarias sobre eacutel En este ejemplo esta accioacuten se ha llevado a cabo con la sentenciabfclose()A continuacioacuten se muestra un programa un poco maacutes complejo Se trata de unaaplicacioacuten que pide por teclado un nombre de fichero Previamente en ese fichero(por ejemplo numerostxt) habremos introducido una serie de nuacutemeros a razoacuten de unopor liacutenea Se podriacutean leer tambieacuten los nuacutemeros si estuvieran separados por comaso espacios aunque seriacutea un poco maacutes complicado (no mucho maacutes) Los nuacutemerospueden contener decimales ya que se van a leer como Double Cada nuacutemero que selee del fichero se va sumando de tal forma que la suma total estaraacute contenida en lavariable suma a la par se va llevando la cuenta de los elementos que se van leyendoen la variable i Finalmente dividiendo la suma total entre el nuacutemero de elementosobtenemos la media aritmeacutetica de los nuacutemeros contenidos en el fichero

Ejemplo de uso de la clase File Calcula la media de los nuacutemeros que se encuentran en un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileReaderimport javaioIOException

class EjemploFichero08

public static void main(String[] args)

Systemoutprint(Introduzca el nombre del archivo donde se encuentran los nuacutemeros )

String nombreFichero = Systemconsole()readLine()

try

BufferedReader bf = new BufferedReader(new FileReader(nombreFichero))

String linea = 0

int i = 0

double suma = 0

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 159

while (linea = null)

i++

suma += DoubleparseDouble(linea)

linea = bfreadLine()

i--

bfclose()

Systemoutprintln(La media es + suma (double)i)

catch (IOException e)

Systemoutprintln(egetMessage())

112 Escritura sobre un fichero de texto

La escritura en un fichero de texto es si cabe maacutes faacutecil que la lectura Solo hay quecambiar Systemoutprint(texto) por manejadorwrite(texto) Se pueden incluir saltosde liacutenea tabuladores y espacios igual que al mostrar un mensaje por pantallaEs importante ejecutar close() despueacutes de realizar la escritura de esta manera nosaseguramos que se graba toda la informacioacuten en el discoAl realizar escrituras en ficheros con Java hay que tener ciertas precauciones Cuandotoca dar este tema en clase es frecuente que a maacutes de un alumno le empiece a irlento el ordenador luego se le queda inutilizado y por uacuteltimo ni siquiera le arrancaiquestqueacute ha pasado Pues que ha estado escribiendo datos en ficheros y por alguna razoacutensu programa se ha metido en un bucle infinito lo que da como resultado cuelgues yficheros de varios gigabytes de basura Por eso es muy importante asegurarse biende que la informacioacuten que se va a enviar a un fichero es la correcta iquestcoacutemo muy faacutecilenviaacutendola primero a la pantalla

Primero a pantalla y luego a ficheroEnviacutea primero a la pantalla todo lo que quieras escribir en el fichero Cuandocompruebes que lo que se ve por pantalla es realmente lo que quieres grabaren el fichero entonces y solo entonces cambia Systemoutprint(texto) pormanejadorwrite(texto)

A continuacioacuten se muestra un programa de ejemplo que crea un fichero de texto yluego esribe en eacutel tres palabras una por cada liacutenea

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 160

Ejemplo de uso de la clase File Escritura en un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedWriterimport javaioFileWriterimport javaioIOException

class EjemploFichero02

public static void main(String[] args)

try

BufferedWriter bw = new BufferedWriter(new FileWriter(frutatxt))

bwwrite(naranjan)

bwwrite(mangon)

bwwrite(chirimoyan)

bwclose()

catch (IOException ioe)

Systemoutprintln(No se ha podido escribir en el fichero)

113 Lectura y escritura combinadas

Las operaciones de lectura y escritura sobre ficheros se pueden combinar de tal formaque haya un flujo de lectura y otro de escritura uno de lectura y dos de escritura tresde lectura etcEn el ejemplo que presentamos a continuacioacuten hay dos flujos de lectura y uno deescritura Observa que se declaran en total tres manejadores de fichero (dos paralectura y uno para escritura) El programa va leyendo de forma alterna una liacutenea decada fichero - una liacutenea de fichero1txt y otra liacutenea de fichero2txt - mientras quedenliacuteneas por leer en alguno de los ficheros y al mismo tiempo va guardando esas liacuteneasen otro fichero con nombre mezclatxt

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 161

Ejemplo de uso de la clase File Mezcla de dos ficheros author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioBufferedWriterimport javaioFileReaderimport javaioFileWriterimport javaioIOException

class EjemploFichero03

public static void main(String[] args)

try

BufferedReader bf1 = new BufferedReader(new FileReader(fichero1txt))

BufferedReader bf2 = new BufferedReader(new FileReader(fichero2txt))

BufferedWriter bw = new BufferedWriter(new FileWriter(mezclatxt))

String linea1 =

String linea2 =

while ( (linea1 = null) || (linea2 = null) )

linea1 = bf1readLine()

linea2 = bf2readLine()

if (linea1 = null) bwwrite(linea1 + n)

if (linea2 = null) bwwrite(linea2 + n)

bf1close()

bf2close()

bwclose()

catch (IOException ioe)

Systemoutprintln(Se ha producido un error de lecturaescritura)

Systemerrprintln(ioegetMessage())

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 162

114 Otras operaciones sobre ficheros

Ademaacutes de leer desde o escribir en un fichero hay otras operaciones relacionadas conlos archivos que se pueden realizar desde un programa escrito en JavaVeremos tan solo un par de ejemplos Si quieres profundizar maacutes eacutechale un vistazo ala documentacioacuten oficial de la clase File2El siguiente ejemplo muestra por pantalla un listado con todos los archivos quecontiene un directorio

Ejemplo de uso de la clase File Listado de los archivos del directorio actual author Luis Joseacute Saacutenchez

import javaioFile

class EjemploFichero04

public static void main(String[] args)

File fichero = new File() se indica la ruta entre comillas el punto () es el directorio actual

String[] listaArchivos = ficherolist()

for(int i = 0 i lt listaArchivoslength i++)

Systemoutprintln(listaArchivos[i])

El siguiente programa de ejemplo comprueba si un determinado archivo existe ono mediante exists() y en caso de que exista lo elimina mediante delete() Siintentaacuteramos borrar un archivo que no existe obtendriacuteamos un error

2httpdocsoraclecomjavase7docsapijavaioFilehtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 163

Ejemplo de uso de la clase File Comprobacioacuten de existencia y borrado de un fichero author Luis Joseacute Saacutenchez

import javaioFile

class EjemploFichero05

public static void main(String[] args)

Systemoutprint(Introduzca el nombre del archivo que desea borrar )

String nombreFichero = Systemconsole()readLine()

File fichero = new File(nombreFichero)

if (ficheroexists())

ficherodelete()

Systemoutprintln(El fichero se ha borrado correctamente)

else

Systemoutprintln(El fichero + nombreFichero + no existe)

115 Paso de argumentos por liacutenea de comandos

Como dijimos al comienzo de este capiacutetulo el paso de argumentos por liacutenea decomandos no estaacute directamente relacionado con los ficheros aunque es muy frecuentecombinar estos dos recursosSeguro que has usado muchas veces el paso de argumentos por liacutenea de comandossin saberlo Por ejemplo si tecleas el siguiente comando en una ventana de terminal

$ head -5 etcbashbashrc

se muestran por pantalla las 5 primeras liacuteneas del fichero bashbashrc que se encuentraen el directorio etc En este caso head es el nombre del programa que estamosejecutando y los valores -5 y etcbashbashrc son los argumentosVolvamos al comienzo al primer capiacutetulo iquestRecuerdas coacutemo ejecutaste tu primerprograma en Java iexclQueacute tiempos aqueacutellos El programa HolaMundo se ejecutaba asiacute

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 164

$ java HolaMundo

Para probar los ejemplos que te presentamos maacutes adelante deberaacutes hacer lo mismo yademaacutes antildeadir a continuacioacuten y separados por espacios los argumentos que quieresque lea el programa Vamos a verlo en detalleEl siguiente programa de ejemplo simplemente muestra por pantalla los argumentosintroducidos Compila el programa y prueba a ejecutar lo siguiente

$ java EjemploArgumentos06 hola que tal 24 12 fin

con lo que obtendraacutes el siguiente resultado

Los argumentos introducidos son

hola

que

tal

24

12

fin

Los argumentos han pasado al programa en virtud del paraacutemetro que incluimos en laliacutenea del main

public static void main(String[] args)

Fiacutejate en lo que hay entre pareacutentesis String[] args Se trata de un array de cadenasde caracteres (String) donde cada uno de los elementos seraacute un argumento que se hapasado como paraacutemetro Si has ejecutado el ejemplo tal y como se ha indicado args[0]vale ldquoholardquo args[1] vale ldquoquerdquo args[2] vale ldquotalrdquo args[3] vale ldquo24rdquo args[4] vale ldquo12rdquo yargs[5] vale ldquofinrdquo

Paso de argumentos en la liacutenea de comandos author Luis Joseacute Saacutenchez

class EjemploArgumentos06

public static void main(String[] args)

Systemoutprintln(Los argumentos introducidos son )

for (int i = 0 i lt argslength i++)

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 165

Systemoutprintln(args[i])

Hagamos algo un poco maacutes uacutetil con los argumentos En el siguiente ejemplo se sumantodos los argumentos que se pasan como paraacutemetros y se muestra por pantalla elresultado de la sumaDespueacutes de compilar deberaacutes ejecutar desde una ventana de terminal lo siguiente(puedes cambiar los nuacutemeros si quieres)

$ java EjemploArgumentos07 10 36 44

con lo que obtendraacutes este resultado

90

es decir la suma de los nuacutemeros que has pasado como paraacutemetros

Paso de argumentos en la liacutenea de comandos author Luis Joseacute Saacutenchez

class EjemploArgumentos07

public static void main(String[] args)

int suma = 0

for (int i = 0 i lt argslength i++)

suma += IntegerparseInt(args[i])

Systemoutprintln(suma)

Observa que el programa convierte en nuacutemeros enteros todos y cada uno de losargumentos mediante el meacutetodo IntegerparseInt() para poder sumarlos

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 166

Los argumentos recogidos por liacutenea de comandos se guardan siempre enun array de String Cuando sea necesario realizar operaciones matemaacuteticascon esos argumentos habriacutea que convertirlos al tipo adecuado medianteIntegerparseInt() o DoubleparseDouble()

116 Combinacioacuten de ficheros y paso de argumentos

Llegoacute el momento de combinar las operaciones con ficheros con el paso de paraacutemetrospor liacutenea de comandos El ejemplo que mostramos a continuacioacuten es parecido al quehemos visto en el apartado anterior calcula la media de una serie de nuacutemeros peroesta vez esos nuacutemeros se leen desde un fichero y lo que se pasa como paraacutemetro por laliacutenea de comandos es precisamente el nombre del fichero donde estaacuten esos nuacutemerosCrea un fichero y noacutembralo numerostxt e introduce los siguientes nuacutemeros (es impor-tante que esteacuten separados por un salto de liacutena para que el programa funcione bien)

25

100

44

17

6

8

A continuacioacuten compila el programa de ejemplo EjemploFichero09java y teclea losiguiente en la ventana de terminal

$ java EjemploFichero09 numerostxt

Apareceraacute el siguiente resultado

La media es 33333333333333336

Ejemplo de uso de la clase File Calcula la media de los nuacutemeros que se encuentran en un fichero de texto El nombre del fichero se pasa como argumento en la liacutenea de comandos author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileReader

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 167

import javaioIOException

class EjemploFichero09

public static void main(String[] args)

if (argslength = 1)

Systemoutprintln(Este programa calcula la media de los nuacutemeros contenidos en un f

ichero)

Systemoutprintln(Uso del programa java EjemploFichero09 FICHERO)

Systemexit(-1) sale del programa

try

BufferedReader bf = new BufferedReader(new FileReader(args[0]))

String linea = 0

int i = 0

double suma = 0

while (linea = null)

i++

suma += DoubleparseDouble(linea)

linea = bfreadLine()

i--

bfclose()

Systemoutprintln(La media es + suma(double)i)

catch (IOException e)

Systemoutprintln(egetMessage())

Observa que el programa comprueba el nuacutemero de argumentos que se pasan por laliacutenea de comandos mediante if (argslength = 1) y si este nuacutemero es distinto de 1muestra este mensaje

Este programa calcula la media de los nuacutemeros contenidos en un fichero

Uso del programa java EjemploFichero09 FICHERO

y sale del programa De esta manera el usuario sabe exactamente coacutemo hay queutilizar el programa y coacutemo hay que pasarle la informacioacuten

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 168

117 Procesamiento de archivos de texto

La posibilidad de realizar desde Java operaciones con ficheros abre muchas posibili-dades a la hora de procesar archivos cambiar una palabra por otra eliminar ciertoscaracteres mover de sitio una liacutenea o una palabra borrar espacios o tabulaciones alfinal de las liacuteneas o cualquier otra cosa que se nos pueda ocurrirCuando se procesa un archivo de texto los pasos a seguir son los siguientes

1 Leer una liacutenea del fichero origen mientras quedan liacuteneas por leer2 Modificar la liacutenea (normalmente utilizando los meacutetodos que ofrece la clase String)3 Grabar la liacutenea modificada en el fichero destino4 Volver al paso 1

A continuacioacuten tienes algunos meacutetodos de la clase String que pueden resultar muyuacutetiles para procesar archivos de texto

bull charAt(int n) Devuelve el caraacutecter que estaacute en la posicioacuten n-eacutesima de la cadenaRecuerda que la primera posicioacuten es la nuacutemero 0

bull indexOf(String palabra) Devuelve un nuacutemero que indica la posicioacuten en la quecomienza una palabra determinada

bull length() Devuelve la longitud de la cadenabull replace(char c1 char c2) Devuelve una cadena en la que se han cambiado

todas las ocurrencias del caraacutecter c1 por el caraacutecter c2bull substring(int inicioint fin) Devuelve una subcadenabull toLowerCase() Convierte todas las letras en minuacutesculasbull toUpperCase() Convierte todas las letras en mayuacutesculas

Puedes consultar todos los meacutetodos de la clase String en la documentacioacuten oficial3A continuacioacuten tienes un ejemplo en el que se usan los meacutetodos descritos anterior-mente

Ejemplos de uso de String author Luis Joseacute Saacutenchez

public class EjemplosString

public static void main(String[] args)

Systemoutprintln(nEjemplo 1)

Systemoutprintln(En la posicioacuten 2 de berengena estaacute la letra

3httpdocsoraclecomjavase7docsapijavalangStringhtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 169

+ berengenacharAt(2))

Systemoutprintln(nEjemplo 2)

String frase = Hola caracola

char[] trozo = new char[10]trozo[0] = z trozo[1] = z trozo[2] = z

frasegetChars(2 7 trozo 1)

Systemoutprint(El array de caracteres vale )

Systemoutprintln(trozo)

Systemoutprintln(nEjemplo 3)

Systemoutprintln(La secuencia co aparece en la frase en la posicioacuten

+ fraseindexOf(co))

Systemoutprintln(nEjemplo 4)

Systemoutprintln(La palabra murcieacutelago tiene

+ murcieacutelagolength() + letras)

Systemoutprintln(nEjemplo 5)

String frase2 = frasereplace(o u)

Systemoutprintln(frase2)

Systemoutprintln(nEjemplo 6)

frase2 = frasesubstring(3 10)

Systemoutprintln(frase2)

Systemoutprintln(nEjemplo 7)

Systemoutprintln(frasetoLowerCase())

Systemoutprintln(nEjemplo 8)

Systemoutprintln(frasetoUpperCase())

A continuacioacuten se muestra un programa que procesa archivos de texto Lo que hacees cambiar cada tabulador por dos espacios en blanco Lo hice a propoacutesito cuandoestaba escribiendo este manual ya que el estaacutendar de Google para la codificacioacuten enJava4 especifica que la sangriacutea debe ser precisamente de dos espacios Teniacutea muchosprogramas escritos en Java (ejemplos y soluciones a ejercicios) que no cumpliacutean esterequisito porque la sangriacutea estaba aplicada con el caraacutecter de tabulacioacuten teniacutea dosposibilidades abrir todos y cada uno de los ficheros y cambiarlo a mano o escribir unprograma que lo hiciera Opteacute por la segunda opcioacuten y aquiacute tienes el programa iquestverdadque es muy sencillo

4httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 170

import javaioBufferedReaderimport javaioBufferedWriterimport javaioFileimport javaioFileReaderimport javaioFileWriterimport javaioIOException

Cambia los tabuladores por 2 espacios author Luis Joseacute Saacutenchez

public class EjemploProcesamiento10

public static void main(String[] args)

for (int i = 0 i lt argslength i++)

Systemoutprint(Procesando el archivo + args[i] + )

try

renombra el fichero antildeadiendo tmpFile ficheroOriginal = new File(args[i])

File ficheroTemporal = new File(args[i] + tmp)

ficheroOriginalrenameTo(ficheroTemporal)

lee los datos del archivo temporalBufferedReader bf = new BufferedReader(new FileReader(args[i] + tmp))

crea un fichero nuevo con el nombre originalBufferedWriter bw = new BufferedWriter(new FileWriter(args[i]))

String linea =

while ( linea = null )

linea = bfreadLine()

if (linea = null)

cambia el tabulador por 2 espacioslinea = lineareplace(t )

bwwrite(linea + n)

bfclose()

bwclose()

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 171

borra el fichero temporalficheroTemporaldelete()

catch (IOException ioe)

Systemoutprintln(Se ha producido un error de lecturaescritura)

Systemerrprintln(ioegetMessage())

Systemoutprintln(hecho)

118 Ejercicios

Ejercicio 1Escribe un programa que guarde en un fichero con nombre primosdat losnuacutemeros primos que hay entre 1 y 500

Ejercicio 2Realiza un programa que lea el fichero creado en el ejercicio anterior y quemuestre los nuacutemeros por pantalla

Ejercicio 3Escribe un programa que guarde en un fichero el contenido de otros dosficheros de tal forma que en el fichero resultante aparezcan las liacuteneas de losprimeros dos ficheros mezcladas es decir la primera liacutenea seraacute del primerfichero la segunda seraacute del segundo fichero la tercera seraacute la siguiente delprimer fichero etcLos nombres de los dos ficheros origen y el nombre del fichero destino se debenpasar como argumentos en la liacutenea de comandosHay que tener en cuenta que los ficheros de donde se van cogiendo las liacuteneaspueden tener tamantildeos diferentes

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 172

Ejercicio 4Realiza un programa que sea capaz de ordenar alfabeacuteticamente las palabrascontenidas en un fichero de texto El nombre del fichero que contiene laspalabras se debe pasar como argumento en la liacutenea de comandos El nombredel fichero resultado debe ser el mismo que el original antildeadiendo la coletillasort por ejemplo palabras_sorttxt Suponemos que cada palabra ocupa unaliacutenea

Ejercicio 5Escribe un programa capaz de quitar los comentarios de un programa de JavaSe utilizariacutea de la siguiente maneraquita_commentarios PROGRAMA_ORIGINAL PROGRAMA_LIMPIO

Por ejemploquita_comentarios holajava holav2java

crea un fichero con nombre holav2java que contiene el coacutedigo de holajava perosin los comentarios

Ejercicio 6Realiza un programa que diga cuaacutentas ocurrencias de una palabra hay en unfichero Tanto el nombre del fichero como la palabra se deben pasar comoargumentos en la liacutenea de comandos

12 Aplicaciones web en Java (JSP)Hasta el momento los programas realizados funcionan en una austera ventana determinal No se trata de algo casual hemos elegido esta manera de trabajar de formadeliberada para que el estudiante se centre en resolver el problema y no se distraigadaacutendole sombra a un botoacuten o escogiendo la mejor imagen de fondo para un listadoLlegamos no obstante a un punto en que algunos programas piden a gritos unaapariencia maacutes vistosaEn este capiacutetulo vamos a aprender coacutemo utilizar paacuteginas web como interfaz paraprogramas en Java Usaremos JSP (JavaServer Pages) que nos permitiraacute mezclar coacutedigoen Java con coacutedigo HTML El coacutedigo en Java que utilizaremos seraacute muy parecido alque hemos venido utilizando hasta ahora Cambiaraacute uacutenicamente lo relativo a mostrarinformacioacuten por pantalla (ahora se volcaraacute todo a HTML) y la manera en que seintroducen los datos que se realizaraacute mediante formularios

El lector deberaacute tener unos conocimientos baacutesicos de HTML para entender bieny sacar provecho de este capiacutetulo Una web excelente para aprender HTML esW3Schools1

El estaacutendar de programacioacuten de Google para el coacutedigo fuente escrito en Java2 noespecifica ninguna regla en cuanto a la manera de nombrar los ficheros correspon-dientes a las aplicaciones JSP Por tanto vamos a adoptar las convenciones de Oracle3

en esta materia Seguacuten estas convenciones los nombres de los ficheros JSP debenestar escritos en lowerCamelCase es decir la primera letra siempre es minuacutesculay en caso de utilizar varias palabras dentro del nombre eacutestas van seguidas unade otra empezando cada una por mayuacutescula Finalmente se antildeade la extensioacuten jspPor ejemplo listadoSociosjsp es un nombre correcto mientras que ListadoSociosjsplistado_sociosjsp o Listadosociosjsp son incorrectos

121 Hola Mundo en JSP

Para desarrollar aplicaciones en JSP utilizaremos el entorno de desarrollo NetbeansEste IDE se puede descargar de forma gratuita en httpsnetbeansorgdownloadsnota12_-14

Sigue estos pasos para crear una aplicacioacuten en JSP con Netbeans1httpw3schoolscom2httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml3httpwwworaclecomtechnetworkarticlesjavasecode-convention-138726html4ParamaacutesdetallessobrelainstalacioacutenyconfiguracioacutendeNetbeansverel[ApeacutendiceB](apendiceb)

173

Aplicaciones web en Java (JSP) 174

bull En el menuacute principal selecciona Archivo y a continuacioacuten Nuevo Proyecto Sepuede hacer maacutes raacutepido con la combinacioacuten Control + Mayuacutescula + N

bull Apareceraacute una ventana emergente para elegir el tipo de proyecto SeleccionaJava Web en el apartado ldquoCategoriacuteasrdquo y Aplicacioacuten Web en el apartadoldquoProyectosrdquo Haz clic en Siguiente

bull Ahora hay que darle el nombre al proyecto lo puedes llamar por ejemploSaludo1 Recuerda no utilizar caracteres especiales ni signos de puntuacioacuten Secrearaacute una carpeta con el mismo nombre que el proyecto que contendraacute todoslos ficheros necesarios Haz clic en Siguiente

bull En la siguiente ventana tendraacutes que elegir el servidor la versioacuten de Java y laruta Elige Glass Fish Server En caso de no haber ninguacuten servidor disponibleNetbeans permite antildeadir uno sobre la marcha (se lo descarga y lo instala) Hazclic en Finalizar

A la izquierda en la ventana de proyectos debe aparecer el que acabas de crearSaludo1 Navegando por la estructura del proyecto veraacutes que hay una carpeta connombre Web Pages en esta carpeta se deberaacuten guardar los archivos correspondien-tes a la aplicacioacuten archivos jsp html css imaacutegenes archivos de audio etc Para quelos archivos esteacuten ordenados se pueden organizar a su vez en subcarpetas dentrode Web PagesPor defecto cuando se crea un proyecto JSP se crea el archivo indexhtml Elimina estearchivo de tu proyecto y luego crea indexjsp haciendo clic con el botoacuten derecho enWeb Pages rarr Nuevo rarr JSP Al indicar el nombre no hay que poner la extensioacutenYa tienes un ldquoHola Mundordquo en ingleacutes Si lo quieres en espantildeol solo tienes que cambiarldquoHello Worldrdquo por ldquoHola Mundordquo con lo que la aplicacioacuten quedariacutea como sigue

lt-- saludo1jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Mundolth1gt

En esta paacutegina se usa uacutenicamente HTML

ltbodygt

lthtmlgt

Para ejecutar la aplicacioacuten hay que hacer clic en el botoacuten verde Ejecutar Proyecto opulsar F6 En ese momento Netbeans buscaraacute un fichero con el nombre indexjsp ylo lanzaraacute en el navegador

Aplicaciones web en Java (JSP) 175

Observa que el programa del ejemplo se llama saludo1jsp y no indexjsp En estecaso para ejecutar la aplicacioacuten hay que hacer clic con el botoacuten derecho encima desaludo1jsp y seleccionar EjecutarDe momento solo hemos visto coacutedigo HTML iquestdoacutende estaacute Java Bien vamos a verlopero antes hay entender bien coacutemo funciona JSPUna aplicacioacuten JSP consistiraacute en una o varias paacuteginas web que normalmente contendraacutecoacutedigo HTML y que llevaraacuten ldquoinsertadordquo coacutedigo en Java Este coacutedigo en Java puedecolocarse en cualquier parte del archivo y se delimita mediante las etiquetas lt y gtCuando se pulsa F6 para ejecutar la aplicacioacuten sucede lo siguiente

1 Todo el coacutedigo (tanto HTML como JAVA) se enviacutea al servidor (Glass Fish o ApacheTomcat por ejemplo)

2 El servidor deja intacto el coacutedigo HTML y compila y ejecuta el coacutedigo en JavaGeneralmente el coacutedigo Java genera coacutedigo HTML mediante las instruccionesoutprint y outprintln

3 Por uacuteltimo todo el coacutedigo (ya solo queda HTML) se enviacutea al navegador que es elque muestra la paacutegina Recuerda que el navegador no entiende Java (entiendeJavascript que es otro lenguaje diferente) y es imprescindible que todo el coacutedigoJava haya sido traducido previamente

122 Mezclando Java con HTML

A continuacioacuten se muestra un ejemplo que siacute tiene Java Como ves el coacutedigo Java estaacutedelimitado por los caracteres lt y gt

lt-- saludo2jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt outprintln(lth1gtiexclHola Mundolth1gt) gt

ltbodygt

lthtmlgt

Mediante Java se puede generar cualquier contenido HTML por ejemplo para modi-ficar estilos crear tablas mostrar imaacutegenes etc Trabajando en consola lo que seincluye en un print es exactamente lo que se muestra por pantalla Ahora con JSP loque se incluye dentro del print es ldquorenderizadordquo a posteriori por el navegador En elsiguiente ejemplo se puede ver claramente este comportamiento

Aplicaciones web en Java (JSP) 176

lt-- saludo3jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Caracolalth1gt

lt outprint(ltbgtltigt) gt

Esta liacutenea se ha puesto en negrita y cursiva mediante Java

lt outprint(ltigtltbgt) gt

ltbodygt

lthtmlgt

Es muy uacutetil ver el coacutedigo fuente que se ha generado una vez que se puede visualizarla aplicacioacuten en el navegador Para ver el coacutedigo fuente tanto en Firefox como enChrome hay que hacer clic con el botoacuten derecho en la paacutegina y seleccionar la opcioacutenldquoVer coacutedigo fuente de la paacuteginardquoCuando el contenido que se quiere volcar en HTML es el resultado de una expresioacutense pueden utilizar de forma opcional las etiquetas lt= y gt

lt-- saludo4jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Caracolalth1gt

lt= ltbgtltigt gt

Esta liacutenea se ha puesto en negrita y cursiva mediante Java

lt= ltigtltbgt gt

ltbodygt

lthtmlgt

En el coacutedigo Java que se inserta en las aplicaciones JSP se pueden utilizar todos loselemento del lenguaje vistos anteriormente bucles sentencias de control arraysdiccionarios etcEn el siguiente ejemplo se utiliza un bucle for para mostrar texto en diferentestamantildeos utilizando las etiquetas desde la lth6gt (cabecera pequentildea) hasta la lth1gt

(cabecera maacutes grande)

Aplicaciones web en Java (JSP) 177

lt-- pruebaVariable1 --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

for (int i = 1 i lt 7 i++)

outprintln(lth + (7-i) + gt+ i + lth + (7-i) + gt)

gt

ltbodygt

lthtmlgt

El coacutedigo en Java se puede insertar en cualquier parte dentro del coacutedigo HTML eincluso se pueden insertar varios trozos como se puede ver en el siguiente ejemploAunque una variable se haya definido en una determinada zona su aacutembito deactuacioacuten no se ve reducido a ese fragmento de coacutedigo sino que se puede utilizarposteriormente en otro lugar de la aplicacioacutenObserva que en el siguiente ejemplo la definicioacuten e inicializacioacuten de la variable x serealiza en un bloque de coacutedigo en Java y que luego esta variable se utiliza en otros dosbloques diferentes

lt-- pruebaVariable2 --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt int x = 3 gt

lthlt outprint(x) gtgtholalthlt outprint(x) gtgt

ltbodygt

lthtmlgt

En ocasiones puede ser uacutetil recabar informacioacuten del sistema versioacuten de Java en usosistema operativo nombre de usuario etc Estos datos se pueden obtener medianteSystemgetProperty(propiedad)

Aplicaciones web en Java (JSP) 178

lt-- muestraInfojsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtInformacioacuten del entorno de trabajolth1gt

lt

outprint(Fabricante de Java + SystemgetProperty(javavendor))

outprint(ltbrgtUrl del fabricante + SystemgetProperty(javavendorurl))

outprint(ltbrgtVersioacuten + SystemgetProperty(javaversion))

outprint(ltbrgtSistema operativo + SystemgetProperty(osname))

outprint(ltbrgtUsuario + SystemgetProperty(username))

gt

ltbodygt

lthtmlgt

Para mostrar informacioacuten en una paacutegina de forma ordenada es muy frecuente utilizartablas Las tablas son especialmente uacutetiles para mostrar listados obtenidos de unabase de datos como veremos en el siguiente capiacutetuloEn el siguiente ejemplo se muestra una tabla con dos columnas en la primera columnase muestran los nuacutemeros del 0 al 9 y en la segunda sus correspondientes cuadrados

lt-- tablajsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltbodygt

lth1gtEjemplo de tablalth1gt

lttable border=2gt

lttrgt

lttdgtNuacutemerolttdgtlttdgtCuadradolttdgt

lttrgt

lt

for(int i = 0 i lt 10 i++)

outprintln(lttrgt)

outprintln(lttdgt + i + lttdgt)

outprintln(lttdgt)

outprintln(i i)

outprintln(lttdgtlttrgt)

Aplicaciones web en Java (JSP) 179

gt

lttablegt

ltbodygt

lthtmlgt

123 Recogida de datos en JSP

En cualquier aplicacioacuten web la introduccioacuten de datos se realiza mediante formulariosAunque se puede hacer todo en la misma paacutegina de momento vamos a tener dos Laprimera paacutegina contendraacute un formulario y seraacute la encargada de recoger la informacioacuteny enviarla a una segunda paacutegina Esta uacuteltima paacutegina recibiraacute los datos realizaraacute unaserie de caacutelculos u operaciones si procede y por uacuteltimo mostraraacute un resultadoEn el primer ejemplo - un proyecto que llamaremos PasoDeCadena - tenemos una paacuteginacon nombre indexjsp que contiene un formulario HTML Este formulario contiene unaentrada de texto donde el usuario introduciraacute una cadena de caracteres Es muyimportante darle un valor a la etiqueta name En el caso que nos ocupa tenemosname=cadenaIntro por tanto el dato que recoge el formulario se llama de esa maneraseriacutea el equivalente al nombre de la variable en Java No menos importante es indicarla paacutegina que recibiraacute los datos que recoge el formulario Esta informacioacuten se indicacon la etiqueta action en nuestro ejemplo action=frasejsp indica que seraacute el ficherofrasejsp el que recibiraacute cadenaIntroEl fichero indexjsp uacutenicamente contiene coacutedigo HTML por tanto se podriacutea llamarindexhtml y la aplicacioacuten funcionariacutea exactamente igual

lt-- indexjsp (proyecto PasoDeCadena) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtPaso de cadenalttitlegt

ltheadgt

ltbodygt

lth1gtPasando una cadena de caractereslth1gt

ltform method=post action=frasejspgt

Introduzca el nombre de una fruta

ltinput type=text name=cadenaIntrogt

ltinput type=submit value=OKgt

ltformgt

ltbodygt

lthtmlgt

Para recoger los datos enviados por un formulario se utiliza requestgetParameter(nombreDeVariable)

donde nombreDeVariable es el dato que se enviacutea desde el formulario En caso de que el

Aplicaciones web en Java (JSP) 180

dato enviado sea un texto que pueda contener tildes o entildees hay que especificar lacodificacioacuten mediante requestsetCharacterEncoding(UTF-8) antes de recoger el dato

lt-- frasejsp (proyecto PasoDeCadena) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtPaso de cadenalttitlegt

ltheadgt

ltbodygt

lt requestsetCharacterEncoding(UTF-8) gt

Me gusta mucho comer

lt outprint(requestgetParameter(cadenaIntro))gt

ltbodygt

lthtmlgt

En el siguiente ejemplo llamado Incrementa5 se muestra coacutemo manipular en JSP un datonumeacuterico La aplicacioacuten recoge un nuacutemero y luego muestra ese nuacutemero incrementadoen 5 unidades

lt-- indexjsp (proyecto Incrementa5) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

ltform method=get action=incrementa5jspgt

Introduzca un nuacutemero (puede tener decimales)

ltinput type=text name=numeroIntrogt

ltinput type=submit value=OKgt

ltformgt

ltbodygt

lthtmlgt

Observa en el fichero incrementa5jsp coacutemo se transforma la cadena de caracteresque se recibe en numeroIntro en un dato numeacuterico con el meacutetodo DoubleparseDoubleexactamente igual que si estuvieacuteramos leyendo un nuacutemero desde teclado en laventana de terminal

Aplicaciones web en Java (JSP) 181

lt-- incrementa5jsp (proyecto Incrementa5) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

El nuacutemero introducido maacutes cinco es

lt

double resultado

resultado = DoubleparseDouble(requestgetParameter(numeroIntro)) + 5

outprint(resultado)

gt

ltbodygt

lthtmlgt

El siguiente ejemplo ilustra la recogida y enviacuteo de dos variables x e y Observa queahora el formulario contiene dos entradas de texto una para cada variable

lt-- indexjsp (proyecto Suma) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtSumalttitlegt

ltheadgt

ltbodygt

lth1gtSupercalculadoralth1gt

ltform method=get action=resultadojspgt

x ltinput type=text name=xgtltbrgt

y ltinput type=text name=ygtltbrgt

ltinput type=submitgt

ltformgt

ltbodygt

lthtmlgt

En el fichero resultadojsp se reciben las variables recogidas en indexjsp y se sumanRecuerda que por defecto la informacioacuten enviada por un formulario es una cadenade caracteres Si queremos sumar los valores introducidos debemos transformar lascadenas de caracteres a nuacutemeros enteros con el meacutetodo IntegervalueOf()

Aplicaciones web en Java (JSP) 182

lt-- resultadojsp (proyecto Suma) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtSumalttitlegt

ltheadgt

ltbodygt

La suma es

lt

int primerNumero = IntegervalueOf(requestgetParameter(x))

int segundoNumero = IntegervalueOf(requestgetParameter(y))

outprintln(primerNumero + segundoNumero)

gt

ltbodygt

lthtmlgt

El siguiente proyecto de ejemplo es Animales En la paacutegina principal (indexjsp) se puedeseleccionar un animal - gato o caracol - y un nuacutemero Una vez introducidos los datoseacutestos se enviacutean a animalesjsp

lt-- indexjsp (proyecto Animales) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtAnimaleslttitlegt

ltheadgt

ltbodygt

ltform method=post action=animalesjspgt

Seleccione animal a visualizar

ltselect name=animalgt

ltoptiongtGatoltoptiongt

ltoptiongtCaracolltoptiongt

ltselectgt

ltbrgt

Nuacutemero de animales ltinput type=text name=numero size=3gt

ltbrgt

ltinput type=submitgt

ltformgt

ltbodygt

lthtmlgt

Aplicaciones web en Java (JSP) 183

La paacutegina animalesjsp nos mostraraacute una imagen del animal elegido repetida el nuacutemerode veces que hemos indicado

lt-- animalesjsp (proyecto Animales) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtAnimaleslttitlegt

ltheadgt

ltbodygt

lt

String nombreAnimal = requestgetParameter(animal)

String nombreImagen

if (nombreAnimalequals(Gato))

nombreImagen = gatojpg

else

nombreImagen = caracoljpg

int veces = IntegerparseInt(requestgetParameter(numero))

for (int i = 0 i lt veces i++)

outprint(ltimg src= + nombreImagen + width=20gt)

gt

ltbodygt

lthtmlgt

124 POO en JSP

En las aplicaciones realizadas en JSP se puenden incluir clases definidas por el usuariopara posteriormente crear objetos de esas clases Lo habitual es que el fichero quecontiene la definicioacuten de la clase se encuentre separado del programa principalEn un nuevo proyecto con nombre GatosConClase vamos a crear la clase Gato paraello haz clic derecho sobre el icono del proyecto selecciona Nuevo y luego seleccionaClase de Java El nombre de la clase seraacute Gato y el nombre del paquete seraacute porejemplo daw1El fichero Gatojava quedariacutea como el que se muestra a continuacioacuten

Aplicaciones web en Java (JSP) 184

Gatojava (proyecto GatosConClase)

package daw1

public class Gato

private String nombre

private String imagen

public Gato(String nombre String imagen)

thisnombre = nombre

thisimagen = imagen

public String getNombre()

return nombre

public String getImagen()

return imagen

Override

public String toString()

return ltimg src= + imagen + width=80gtHola soy + nombre + ltbrgt

public String maulla()

return ltimg src= + imagen + width=80gtMiauuuuuuuultbrgt

public String come(String comida)

return ltimg src= + imagen + width=80gtEstoy comiendo + comida + ltbrgt

Hemos creado una clase Gato muy sencilla que uacutenicamente contiene dos atributosel nombre del gato y el nombre del fichero de su foto Como meacutetodos se hanimplementado toString() maulla() y come()

Aplicaciones web en Java (JSP) 185

lt-- indexjsp (proyecto GatosConClase) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltpage import=daw1Gatogt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtGatos con claselttitlegt

ltheadgt

ltbodygt

lth1gtGatos con claselth1gt

lthrgt

lt

Gato g1 = new Gato(Pepe gatojpg)

Gato g2 = new Gato(Garfield garfieldjpg)

Gato g3 = new Gato(Tom tompng)

outprintln(g1)

outprintln(g2)

outprintln(g3)

outprintln(g1maulla())

outprintln(g2come(sardinas))

gt

ltbodygt

lthtmlgt

El coacutedigo Java del programa principal es casi ideacutentico al que tendriacuteamos en unprograma para consolaEl siguiente ejemplo - GatosConClaseYBocadillos - es una mejora del anterior Seantildeaden estilos5 para mostrar lo que dicen los gatos igual que en un coacutemic

Gatojava (proyecto GatosConClaseYBocadillos)

package daw1

public class Gato

private String nombre

private String imagen

public Gato(String nombre String imagen)

thisnombre = nombre

thisimagen = imagen

5httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos12_JSPGatosConClaseYBocadillosestiloscss

Aplicaciones web en Java (JSP) 186

public String getNombre()

return nombre

public String getImagen()

return imagen

Override

public String toString()

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspHola soy + nombre + ampnbspltdivgtltdivgt

public String maulla()

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspMiauuuuuuuuampnbspltdivgtltdivgt

public String come(String comida)

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspEstoy comiendo + comida + ampnbspltdivgtltdivgt

El uacutenico antildeadido al programa principal es una liacutenea situada en la cabecera de la paacuteginaque carga la hoja de estilos estiloscss

lt-- indexjsp (proyecto GatosConClaseYBocadillos) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltpage import=daw1Gatogt

ltDOCTYPE htmlgtlthtmlgt

ltheadgtltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gtlttitlegtGatos con clase y bocadilloslttitlegt

ltlink rel=stylesheet type=textcss href=estiloscss gtltheadgtltbodygtlth1gtGatos con claselth1gtlthrgtlt

Gato g1 = new Gato(Pepe gatojpg)

Aplicaciones web en Java (JSP) 187

Gato g2 = new Gato(Garfield garfieldjpg)

Gato g3 = new Gato(Tom tompng)

outprintln(g1)

outprintln(g2)

outprintln(g3)

outprintln(g1maulla())

outprintln(g2come(sardinas))

gt

ltbodygtlthtmlgt

Aplicaciones web en Java (JSP) 188

125 Ejercicios

Ejercicio 1Crea una aplicacioacuten web en Java que muestre tu nombre y tus datos personalespor pantalla La paacutegina principal debe ser un archivo con la extensioacuten jspComprueba que se lanzan bien el servidor y el navegador web Observa losmensajes que da el servidor Fiacutejate en la direccioacuten que aparece en la barra dedirecciones del navegador

Ejercicio 2Mejora el programa anterior de tal forma que la apariencia de la paacuteginaweb que muestra el navegador luzca maacutes bonita mediante la utilizacioacuten deCSS (utiliza siempre ficheros independientes para CSS para no mezclarlo conHTML)

Ejercicio 3Escribe una aplicacioacuten que pida tu nombre A continuacioacuten mostraraacute ldquoHolardquoseguido del nombre introducido El nombre se deberaacute recoger mediante unformulario

Ejercicio 4Realiza una aplicacioacuten que calcule la media de tres notas

Ejercicio 5Realiza un conversor de euros a pesetas

Ejercicio 6Realiza un conversor de pesetas a euros

Ejercicio 7Combina las dos aplicaciones anteriores en una sola de tal forma que en lapaacutegina principal se pueda elegir pasar de euros a pesetas o de pesetas a eurosAdorna la paacutegina con alguna foto o dibujo

Aplicaciones web en Java (JSP) 189

Ejercicio 8Realiza una aplicacioacuten que pida un nuacutemero y que luego muestre la tabla demultiplicar de ese nuacutemero El resultado se debe mostrar en una tabla (lttablegten HTML)

Ejercicio 9Realiza una aplicacioacuten que pinte una piraacutemide La altura se pediraacute en unformulario La piraacutemide estaraacute hecha de bolitas ladrillos o cualquier otraimagen

Ejercicio 10Realiza un cuestionario con 10 preguntas tipo test sobre las asignaturasque se imparten en el curso Cada pregunta acertada sumaraacute un punto Elprograma mostraraacute al final la calificacioacuten obtenida Paacutesale el cuestionario a tuscompantildeeros y piacutedeles que lo hagan para ver queacute tal andan de conocimientosen las diferentes asignaturas del curso Utiliza radio buttons en las preguntasdel cuestionario

Ejercicio 11Escribe una aplicacioacuten que genere el calendario de un mes Se pediraacute elnombre del mes el antildeo el texto que queremos que aparezca sobre elcalendario el diacutea de la semana en que cae el diacutea 1 y el nuacutemero de diacuteas quetiene el mes

Ejercicio 12Mejora la aplicacioacuten anterior de tal forma que no haga falta introducir el diacuteade la semana en que cae el diacutea 1 y el nuacutemero de diacuteas que tiene el mes Elprograma debe deducir estos datos del mes y el antildeo Pista puedes usar laclase Calendar (javautilCalendar)

Ejercicio 13Transforma el test de infidelidad realizado anteriormente para consola en unaaplicacioacuten web

Aplicaciones web en Java (JSP) 190

Ejercicio 14Escribe un programa que muestre los n primeros teacuterminos de la serie deFibonacci El primer teacutermino de la serie de Fibonacci es 0 el segundo es 1y el resto se calcula sumando los dos anteriores por lo que tendriacuteamos quelos teacuterminos son 0 1 1 2 3 5 8 13 21 34 55 89 144hellip El nuacutemero n sedebe introducir por teclado

Ejercicio 15Realiza una aplicacioacuten que genere 100 nuacutemeros aleatorios del 1 al 200 Losprimos deberaacuten aparecer en un color diferente al resto

Ejercicio 16Realiza una aplicacioacuten que muestre la tirada aleatoria de tres dados de poacutekerUtiliza imaacutegenes de dados reales

Ejercicio 17Realiza un configurador del interior de un vehiacuteculo El usuario puede elegirmediante un formulario el color de la tapiceriacutea ndash blanco negro o berengena -y el material de las molduras ndash madera o carbono Se debe mostrar el interiordel coche tal y como lo quiere el usuario

Ejercicio 18Crea la aplicacioacuten ldquoEl Trilerdquo Deben aparecer tres cubiletes por pantalla y elusuario deberaacute seleccionar uno de ellos Para dicha seleccioacuten se puede usar unformulario con radio-button una lista desplegable hacer clic en el cubilete o loque resulte maacutes faacutecil Se levantaraacuten los tres cubiletes y se veraacute si estaba o nola bolita dentro del que el usuario indicoacute asiacute mismo se mostraraacute un mensajediciendo ldquoLo siento no has acertadordquo o ldquoiexclEnhorabuena has encontrado labolitardquo La probabilidad de encontrar la bolita es de 13

Ejercicio 19Crea el juego ldquoApuesta y ganardquo El usuario debe introducir inicialmente unacantidad de dinero A continuacioacuten apareceraacute por pantalla una imagen deforma aleatoria Si sale una calavera el usuario pierde todo su dinero y terminael juego Si sale medio limoacuten el usuario pierde la mitad del dinero y puedeseguir jugando con esa cantidad o puede dejar de jugar Si sale el gato chinode la suerte el usuario multiplica por dos su dinero y puede seguir jugandocon esa cantidad o puede dejar de jugar

Aplicaciones web en Java (JSP) 191

Ejercicio 20Crea una aplicacioacuten que dibuje un tablero de ajedrez mediante una tabla HTMLgenerada con bucles usando JSP y que situacutee dentro del tablero un alfil y uncaballo en posiciones aleatorias Las dos figuras no pueden estar colocadas enla misma casilla Las filas y las columnas del tablero deben estar etiquetadascorrectamente

13 Acceso a bases de datosEn el capiacutetulo 11 vimos coacutemo almacenar informacion en ficheros de texto de tal formaque esta informacioacuten no se pierde cuando el programa se cierra Normalmente losficheros de texto se usan en casos concretos como archivos de configuracioacuten o archivosde registro (log)Las bases de datos relacionales entran en juego cuando se necesita almacenar muchainformacioacuten y ademaacutes esta informacioacuten es homogeacutenea y se puede representarmediante tablas Por ejemplo una aplicacioacuten que permita gestionar la matriculacioacutende los alumnos de un centro educativo deberaacute ser capaz de almacenar los datos degran cantidad de alumnos (puede que miles) En este caso concreto cada alumno serepresenta mediante un registro que contiene determinados datos como el nuacutemerode expediente el nombre los apellidos la nota media etc A estos datos se les llamacamposEn este capiacutetulo vamos a ver coacutemo se puede acceder mediante Java a una basede datos relacional MySQL para hacer listados insertar nuevos elementos y borrarelementos existentesLos programas de ejemplo que se muestran en este capiacutetulo son aplicaciones JSPaprovechando lo visto en el capiacutetulo anterior aunque tambieacuten se puede acceder auna base de datos desde un programa en Java escrito para la consola

131 Socios de un club de baloncesto

Para ilustrar el acceso a una base de datos mediante Java vamos a utilizar comoejemplo un club de baloncesto Nuestro club necesita tener almacenada la informacioacutende todos los socios Sobre cada socio se necesita saber su nombre completo suestatura su edad y su localidad de residencia Cada socio tendraacute ademaacutes un nuacutemerode identificacioacuten uacutenico que seraacute el nuacutemero de socioNuestra aplicacioacuten consistiraacute en varias paacuteginas JSP que van a permitir ver un listadocon los datos de todos los socios dar de alta un nuevo miembro en el club y tambieacutenborrar o modificar los datos de un determinado socioSi todaviacutea no tienes instalado en tu equipo el gestor de bases de datosMySQL deberaacutesinstalarlo Tambieacuten es recomendable instalar PHPMyAdmin que es una aplicacioacuten quepermite crear y manejar bases de datos MySQL de una forma muy sencilla medianteuna interfaz web

192

Acceso a bases de datos 193

Instalacioacuten de MySQL

sudo apt-get install mysql-server

sudo apt-get install mysql-client

Para el usuario root de MySQL deberaacutes establecer la contrasentildea root para quete funcionen correctamente los ejemplos

Instalacioacuten de PHPMyAdmin

sudo apt-get install phpmyadmin

Para acceder a PHPMyAdmin debes escribir httplocalhostphpmyadmin en labarra de direcciones del navegador

Deberaacutes crear la base de datos MySQL a la que llamaraacutes baloncesto que contendraacuteuna tabla de nombre socio con los campos socioID nombre estatura edad y localidad yluego deberaacutes antildeadir los datos de los socios Todo esto lo tienes ya preparado en unfichero con nombre baloncestosql que estaacute en GitHub en la direccioacuten httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDbaloncestosql Descaacutergate este fichero lo utilizaremos en seguidaA continuacioacuten mostramos un fragmento del fichero baloncestosql para que veas coacutemose crea la base de datos la tabla socio y coacutemo se introducen los datos de muestra

---- Base de datos `baloncesto`--CREATE DATABASE IF NOT EXISTS `baloncesto` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

USE `baloncesto`

-- --------------------------------------------------------

---- Estructura de tabla para la tabla `socio`--

CREATE TABLE IF NOT EXISTS `socio` (

`socioID` int(11) NOT NULL`nombre` varchar(40) COLLATE utf8_spanish2_ci DEFAULT NULL`estatura` int(11) DEFAULT NULL`edad` int(11) DEFAULT NULL`localidad` varchar(30) COLLATE utf8_spanish2_ci DEFAULT NULLPRIMARY KEY (`socioID`)

Acceso a bases de datos 194

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci

---- Volcado de datos para la tabla `socio`--

INSERT INTO `socio` (`socioID` `nombre` `estatura` `edad` `localidad`) VALUES(1235 Bermuacutedez Espada Ana Mariacutea 186 46 Maacutelaga)

(1236 Cano Cuenca Margarita 161 48 Maacutelaga)

En dos sencillos pasos tendraacutes preparada y lista para usar la base de datos de ejemploPara acceder a PHPMyAdmin debes escribir httplocalhostphpmyadmin en la barrade direcciones de tu navegador A continuacioacuten teclea el nombre de usuario y lacontrasentildea Si has instalado MySQL como te hemos indicado tanto el nombre deusuario como la contrasentildea deberiacutean ser root

A continuacioacuten haz clic en la pestantildea Importar y seguidamente en el botoacuten Exami-nar Selecciona el fichero baloncestosql que descargaste antes

Acceso a bases de datos 195

Si has seguido correctamente los pasos ya tienes la base de datos lista para usardesde un programa escrito en Java

132 Preparacioacuten del proyecto de ejemplo

1321 Activar la conexioacuten a MySQL

Abre el entorno Netbeans y crea un nuevo proyecto del tipo Java Web - como vimosen el capiacutetulo 12 - y noacutembralo BaloncestoAhora es necesario activar el servicio de bases de datos Haz clic en la pestantildeaServicios (estaacute junto a la pestantildea Proyectos) Haz clic con el botoacuten derecho enBasesde datos y luego selecciona Nueva conexioacuten A continuacioacuten aparece una ventanapara seleccionar el driver debes seleccionar MySQL (ConnectorJdriver)

Acceso a bases de datos 196

Una vez se haya establecido el servicio veraacutes las bases de datos disponibles en unaestructura de aacuterbol Puedes ir desplegando hasta encontrar la base de datos baloncesto

y la tabla socio que contiene los campos socioID nombre estatura edad y localidad

Una vez activada la conexioacuten a MySQL no es necesario realizarla de nuevo para cada

Acceso a bases de datos 197

proyecto

1322 Incluir la libreriacutea MySQL JDBC

Cada proyecto de aplicacioacuten en Java que haga uso de una base de datos MySQLdeberaacute incluir la libreriacutea MySQL JDBC Para incluir esta libreriacutea despliega el proyectoBaloncesto haz clic con el botoacuten derecho en Libreriacuteas selecciona Antildeadir libreriacuteay por uacuteltimo selecciona MySQL JDBC Driver

133 Listado de socios

El primer ejemplo de acceso a una base de datos mediante Java que veremos seraacute unlistado Si echas un vistazo desde PHPMyAdmin a la tabla socio de la base de datosbaloncesto veraacutes que ya contiene informacioacuten sobre maacutes de 20 socios Nuestro primerejemplo seraacute una aplicacioacuten en Java que mueste todos esos datos en una paacuteginaweb Copia el archivo listadoSociosjsp1 a la carpeta principal del proyecto (donde estaacuteindexhtml) Para ejecutarlo haz clic con el botoacuten derecho y selecciona EjecutarA continuacioacuten tienes el coacutedigo JSP del listado de socios

1httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDBaloncestolistadoSociosjsp

Acceso a bases de datos 198

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtListado Socioslttitlegt

ltheadgt

ltbodygt

lth1gtListado de Socioslth1gt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balonce

storoot root)

Statement s = conexioncreateStatement()

ResultSet listado = sexecuteQuery (SELECT FROM socio)

while (listadonext())

outprintln(listadogetString(socioID) + + listadogetString(nombre) + ltbrgt

)

conexionclose()

gt

ltbodygt

lthtmlgt

Si todo ha salido bien al ejecutar el archivo - haciendo clic con el botoacuten derecho sobreel archivo y seleccionando Ejecutar - veraacutes por pantalla un listado como el siguientecon el nuacutemero y el nombre de cada socio

Acceso a bases de datos 199

Vamos a ldquodiseccionarrdquo el coacutedigo Las siguientes tres liacuteneas son obligatorias y deberaacutescopiarlas en todas las paacuteginas JSP que accedan a una base de datos Lo uacutenico quetendraacutes que cambiar es el nombre de la base de datos - la de nuestro ejemplo sellama baloncesto - seguacuten el caso

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306baloncesto

root root)

Statement s = conexioncreateStatement()

La siguiente liacutenea ejecuta la consulta

SELECT FROM socio

sobre la base de datos y guarda el resultado en el objeto listado Esta consulta extraetodos los datos () de la tabla socio Si quisieacuteramos obtener esos datos ordenados pornombre la consulta seriacutea

SELECT FROM socio ORDER BY nombre

Aquiacute estaacute la liacutenea en cuestioacuten

Acceso a bases de datos 200

ResultSet listado = sexecuteQuery (SELECT FROM socio)

Una vez extraiacutedos los datos en bruto hace falta ir sacando cada uno de los registroses decir cada una de las liacuteneas En cada liacutenea se van a mostrar los datos de un socioPara ello usamos un while que va extrayendo liacuteneas mientras quede alguna en el objetolistado

while (listadonext())

outprintln(listadogetString(socioID) + + listadogetString(nombre) + ltbrgt)

Observa que el meacutetodo getString toma como paraacutemetro el nombre de un campoEn este ejemplo estamos mostrando uacutenicamente los nuacutemeros de socio con suscorrespondientes nombres Si quisieacuteramos mostrar tambieacuten la altura de cada sociola podemos extraer mediante listadogetString(altura)

134 Alta

Para dar de alta un nuevo socio necesitamos recoger los datos mediante un formularioque puede ser un programa JSP o simplemente una paacutegina HTML Estos datos recogidospor el formulario seraacuten enviados a otra paacutegina encargada de grabarlos en la tabla socio

de la base de datos baloncesto mediante el comando INSERT de SQLA continuacioacuten se muestra el coacutedigo de formularioSociojsp que recoge los datos delnuevo socio Como puedes comprobar es un simple formulario HTML y no contienecoacutedigo en Java

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgtlthtmlgtltheadgtltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgtltbodygtlth2gtIntroduzca los datos del nuevo sociolth2gtltform method=get action=grabaSociojspgtNordm socio ltinput type=text name=numerogtltbrgtNombre ltinput type=text name=nombregtltbrgtEstatura ltinput type=text name=estaturagtltbrgtEdad ltinput type=text name=edadgtltbrgtLocalidad ltinput type=text name=localidadgtltbrgtltinput type=submit value=Aceptargt

ltformgtltbodygt

lthtmlgt

Acceso a bases de datos 201

El siguiente programa - grabaSociojsp - se encarga de tomar los datos que enviacuteaformularioSociojsp y grabarlos en la base de datosIgual que en los programas del capiacutetulo 12 incluimos esta liacutenea para poder recogercorrectamente cadenas de caracteres que contienen tildes la letra ntilde etc

requestsetCharacterEncoding(UTF-8)

La variable insercion es una cadena de caracteres en la que se va componiendo a basede ir juntando trozos la sentencia SQL correspondiente a la insercioacuten

String insercion = INSERT INTO socio VALUES (

+ IntegervalueOf(requestgetParameter(numero))

+ + requestgetParameter(nombre)

+ + IntegervalueOf(requestgetParameter(estatura))

+ + IntegervalueOf(requestgetParameter(edad))

+ + requestgetParameter(localidad) + )

Una vez que se han recogido los datos del formulario y se ha creado la cadena en lavariable insercion deberiacutea quedar algo como esto

INSERT INTO socio VALUES (6789 Brito Fino Alan 180 40 Benalmaacutedena)

Por uacuteltimo se ejecuta la sentencia de insercioacuten mediante sexecute(insercion)A continuacioacuten tienes el coacutedigo completo de grabaSociojsp

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

requestsetCharacterEncoding(UTF-8)

Acceso a bases de datos 202

String insercion = INSERT INTO socio VALUES (

+ IntegervalueOf(requestgetParameter(numero))

+ + requestgetParameter(nombre)

+ + IntegervalueOf(requestgetParameter(estatura))

+ + IntegervalueOf(requestgetParameter(edad))

+ + requestgetParameter(localidad) + )

sexecute(insercion)

conexionclose()

gt

Socio dado de alta

ltbodygt

lthtmlgt

Al componer una sentencia SQL concatenando trozos es frecuente que seproduzcan errores porque faltan o sobran comillas pareacutentesis comas etc Sise produce un error al ejecutar la sentencia la manera maacutes faacutecil de detectarloes mostrar por pantalla la sentencia Por ejemplo si la sentencia es unainsercioacuten de datos y la cadena de caracteres que la contiene se llama insercioncomo en el ejemplo que acabamos de ver simplemente tendriacuteamos queescribir outprintln(insercion)

135 Borrado

El borrado al igual que el alta se realiza en dos pasos En el primer paso se carga lapaacutegina pideNumeroSociojsp que muestra en una tabla todos los socios cada uno en unafila Junto a cada socio se coloca un botoacuten borrar que al ser pulsado enviacutea el nuacutemerode socio a la paacutegina borraSociojsp que se encarga de ejecutar la sentencia SQL deborradoLa tabla con los socios y los botones de borrado quedariacutea como se muestra acontinuacioacuten

Acceso a bases de datos 203

A continucacioacuten se muestra el coacutedigo de pideNumeroSociojsp El fichero estiloscss2 seencuentra disponible en GitHub igual que el resto de archivos

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltlink rel=stylesheet type=textcss href=estiloscss gt

ltheadgt

ltbodygt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

2httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDBaloncestoestiloscss

Acceso a bases de datos 204

ResultSet listado = sexecuteQuery (SELECT FROM socio)

gt

lttablegt

lttrgtltthgtCoacutedigoltthgtltthgtNombreltthgtltthgtEstaturaltthgtltthgtEdadltthgtltthgtLocalidadltthgtlt

trgt

lt

while (listadonext())

outprintln(lttrgtlttdgt)

outprintln(listadogetString(socioID) + lttdgt)

outprintln(lttdgt + listadogetString(nombre) + lttdgt)

outprintln(lttdgt + listadogetString(estatura) + lttdgt)

outprintln(lttdgt + listadogetString(edad) + lttdgt)

outprintln(lttdgt + listadogetString(localidad) + lttdgt)

gt

lttdgt

ltform method=get action=borraSociojspgt

ltinput type=hidden name=codigo value=lt=listadogetString(socioID) gtgt

ltinput type=submit value=borrargt

ltformgt

lttdgtlttrgt

lt

whileconexionclose()

gt

lttablegt

ltbodygt

lthtmlgt

A continuacioacuten se muestra el coacutedigo de borraSociojsp Como puedes comprobar lasentencia SQL que borra el registro deseado es un DELETE que toma como referencia elnuacutemero de socio para realizar el borrado

ltpage import=javasqlResultSetgt

ltpage import=javasqlStatementgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

Acceso a bases de datos 205

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

sexecute (DELETE FROM socio WHERE socioID= + requestgetParameter(codigo))

gt

ltscriptgtdocumentlocation = pideNumeroSociojspltscriptgt

ltbodygt

lthtmlgt

136 CRUD completo con Bootstrap

Los programas que ofrecen la posibilidad de hacer listados y de realizar modificacionesy borrado sobre los registros de una tabla se denominan CRUD que son las siglas eningleacutes de Create Read Update y Delete en espantildeol se diriacutea que es un programa dealta listado modificacioacuten y borrado El coacutedigo fuente completo estaacute disponible en lacarpeta BaloncestoMejorado de nuestro repositorio en GitHub3

Para dar de alta un nuevo socio simplemente habriacutea que rellenar los campos delformulario que aparecen en la primera liacutenea y hacer clic en el botoacuten Antildeadir Laaplicacioacuten comprueba si el nuacutemero de socio introducido ya existe en la base de datosy en tal caso muestra un mensaje de error recuerda que el nuacutemero de socio es uacutenico

3httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciostreemasterejemplos13_JSP_y_BBDDBaloncestoMejorado

Acceso a bases de datos 206

El borrado se lleva a cabo de la misma manera que en el ejemplo del apartado anteriorEl botoacuten Modificar nos lleva a otra paacutegina que contiene un formulario con todos losdatos del socio donde podemos modificar la informacioacuten necesaria A continuacioacuten semuestra una captura

Para los estilos - colores botones iconos etc - hemos utilizado Boostrap4 Boostrapes un framework que incluye unos estilos predefinidos para que con solo incluirloen nuestro proyecto la aplicacioacuten tenga una apariencia bonita y homogeacutenea Puedesencontrar maacutes informacioacuten de coacutemo utilizar este framework en la paacutegina oficial deBoostrap5

4httpgetbootstrapcom5httpgetbootstrapcom

Acceso a bases de datos 207

137 Ejercicios

Ejercicio 1Establece un control de acceso mediante nombre de usuario y contrasentildeapara alguno de los programas de la relacioacuten anterior (por ejemplo el quepinta una piraacutemide) Lo primero que apareceraacute por pantalla seraacute un formulariopidiendo el nombre de usuario y la contrasentildea Si el usuario y la contrasentildea soncorrectos se podraacute acceder al ejercicio en caso contrario volveraacute a aparecerel formulario pidiendo los datos de acceso y no se nos dejaraacute ejecutar laaplicacioacuten hasta que iniciemos sesioacuten con un nombre de usuario y contrasentildeacorrectos Los nombres de usuario y contrasentildeas deben estar almacenados enla tabla de una base de datos

Acceso a bases de datos 208

Ejercicio 2Mejora el programa anterior de tal forma que se puedan dar de alta nuevosusuarios para acceder a la aplicacioacuten Si se introduce un nombre de usuarioque no sea el administrador (admin) y una contrasentildea correcta la aplicacioacutenfuncionaraacute exactamente igual que el ejercicio anterior Si se introduce elusuario admin y la contrasentildea correcta la aplicacioacuten entra en la gestioacuten deusuarios donde se podraacuten dar de alta nuevos usuarios indicando nombre deusuario y contrasentildea No puede haber dos nombres de usuario iguales aunquesiacute puede haber claves repetidas

Acceso a bases de datos 209

Ejercicio 3Ampliacutea el programa anterior para que se pueda asignar o quitar permiso paraejecutar las aplicaciones de la relacioacuten anterior a los distintos usuarios Porejemplo que se pueda especificar que el usuario ldquojaimitordquo pueda ejecutar losejercicios 2 3 y 5 Para ello en la base de datos deberaacute existir una tabla con lasparejas (usuario nordm ejercicio) Por ejemplo si el usuario ldquojaimitordquo tiene accesoa los ejercicios 2 3 y 5 en la tabla correspondiente estaraacuten las parejas (jaimito2) (jaimito 3) y (jaimito 5) Lo ideal es que la asignacioacuten de permisos se hagamediante el marcado de muacuteltiples ldquocheckboxrdquo

Acceso a bases de datos 210

Ejercicio 4Crea una aplicacioacuten web que permita hacer listado alta baja y modificacioacutensobre la tabla cliente de la base de datos banco Un cliente tiene su identifica-dor nombre completo direccioacuten teleacutefono y fecha de nacimiento

Acceso a bases de datos 211

Ejercicio 5Ampliacutea el programa anterior para que se pueda hacer una buacutesqueda por nom-bre El programa buscaraacute la cadena introducida dentro del campo ldquonombrerdquoy si hay varias coincidencias se mostraraacute una lista de clientes para poderseleccionar uno de ellos y ver todos los datos Si solo hay una coincidencia semostraraacuten directamente los datos del cliente en cuestioacuten

Acceso a bases de datos 212

Ejercicio 6Crea una versioacuten web del programa GESTISIMAL (GESTIoacuten SIMplifcada deAlmaceacuten) para llevar el control de los artiacuteculos de un almaceacuten De cada artiacuteculose debe saber el coacutedigo la descripcioacuten el precio de compra el precio de ventay el stock (nuacutemero de unidades) La entrada y salida de mercanciacutea suponerespectivamente el incremento y decremento de stock de un determinadoartiacuteculo Hay que controlar que no se pueda sacar maacutes mercanciacutea de la que hayen el almaceacuten Aprovecha las opciones que puede ofrecer una interfaz webpor ejemplo para eliminar un artiacuteculo ya no seraacute necesario pedir el coacutedigo sinoque se puede mostrar un listado de todos los artiacuteculos de tal forma que sepuedan borrar un artiacuteculo directamente pulsando un botoacuten

213

Apeacutendice A Ejercicios de ampliacioacuten 214

Apeacutendice A Ejercicios de ampliacioacuten

Ejercicio 1 Transcomunicacioacuten instrumental mediante ficherosde texto digitalesSe conoce la transcomunicacioacuten instrumental (TCI) como la teacutecnica decomunicacioacuten que utiliza aparatos electroacutenicos para establecer comunicacioacutencon los espiacuteritus El caso de TCI maacutes conocido es el de la psicofoniacuteaPara realizar una psicofoniacutea se pone a grabar al aire un dispositivo en unlugar donde previamente hayan ocurrido fenoacutemenos extrantildeos o simplementese invoca la entidad que queremos que se comunique mediante el ritualadecuado Posteriormente se escucha la grabacioacuten para comprobar si se hagrabado algo un mensaje una palabra un grito un lamentohellipLos sonidos extrantildeos se graban gracias a lo que se llama en teacuterminosparapsicoloacutegicos una sentildeal portadora puede ser el chasquido de una ramauna racha de viento un golpe La entidad comunicante aprovecha ese sonidopara supuestamente moldearlo y convertirlo en un mensaje inteligible Muchasde las psicofoniacuteas se realizan utilizando como portadora el ruido que produceuna radio que no estaacute sintonizadaEl ejercicio que se propone es la realizacioacuten de un programa que permitarealizar la TCI mediante la creacioacuten y el posterior anaacutelisis de ficherosde textoEn primer lugar el programa deberaacute generar la portadora que seraacute un ficherode texto creado con caracteres producidos de forma aleatoria Se podraacutenespecificar varios paraacutemetros como el nuacutemero de liacuteneas o paacuteginas que sequieren generar si se incluyen letras uacutenicamente o bien letras y nuacutemerosfrecuencia aproximada de espacios saltos de liacutenea y signos de puntuacioacutenetc Se obtienen portadoras de calidad - con maacutes probabilidad de contenermensajes - cuando la proporcioacuten de las letras que contienen eacutestas coincidecon las del idioma espantildeolFrecuencia de aparicioacuten de letrashttpeswikipediaorgwikiFrecuencia_de_apariciC3B3n_de_letras

Una vez creado el fichero de texto el programa deberaacute ser capaz de analizarloal menos de una forma superficial de modo que nos resulte faacutecil encontrar losposibles mensajes Para realizar este anaacutelisis el programa iraacute comparandouna a una todas las palabras que aparecen en el texto con las que hay enel diccionario de espantildeol En caso de coincidencia la palabra o palabrasencontradas deben aparecer resaltadas con un color diferente al resto deltexto o bien en viacutedeo inverso Opcionalmente se pueden mostrar estadiacutesticascon el nuacutemero total de palabras encontradas distancia media entre esaspalabras palabras reales por cada mil palabras generadas etcEl alumno puede encontrar ficheros con las palabras que tiene el idiomaespantildeol en formato digital en la siguiente direccioacuten Se trata de una muestrahay otros muchos diccionarios disponibles en internethttplasrcsuclaedugeoffispell-dictionarieshtmlSpanish-dicts

Apeacutendice A Ejercicios de ampliacioacuten 215

Ejercicio 2 Coleccioacuten de discos ampliado (con canciones)Este ejercicio consiste en realizar una mejora del ejercicio del capiacutetulo 10que permite gestionar una coleccioacuten de discos Ahora cada disco contienecanciones Deberaacutes crear la clase Cancion con los atributos y meacutetodos queestimes oportunos Antildeade el atributo canciones a la clase Disco Este atributocanciones debe ser un array de objetos de la clase CancionFiacutejate bien que Cancion NO ES una subclase de Disco sino que ahora cadadisco puede tener muchas canciones que estaacuten almacenadas en el atributocancionesModifica convenientemente el meacutetodo toString para que al mostrarse los datosde un disco se muestre tambieacuten la informacioacuten sobre las canciones quecontieneLa aplicacioacuten debe permitir antildeadir borrar y modificar las canciones de losdiscos

Apeacutendice B Entorno de Desarrollo IntegradoNetbeansNetbeans es un IDE (Integrated Development Environment) es decir un Entornode Desarrollo Integrado Consta de un potente editor y de todas las herramientasnecesarias para codificar compilar depurar y ejecutar una aplicacioacutenEste IDE tiene algunas caracteriacutesticas que lo hacen muy atractivo para los programa-dores

bull Es el IDE oficial para desarrollar en Java6bull Chequea errores de sintaxis y da advertencias al mismo tiempo que se escribe el

coacutedigobull Tiene autocompletado inteligente de palabras clave clases meacutetodos paraacuteme-

troshellipbull Permite depurar una aplicacioacuten ejecutaacutendola paso a paso y ver el contendido de

todas las variables en tiempo realbull Soporta muchos lenguajes de programacioacuten ademaacutes de Java PHP Groovy HTML

XML Javascript JSPhellipbull Existe una gran variedad de plugins que ampliacutean las funcionalidades del entorno

Descarga e instalacioacuten

Netbeans se puede descargar de forma gratuita y para cualquier plataforma desdehttpsnetbeansorgdownloads

6Esto no es casualidad ya que es la misma empresa - Oracle - la que estaacute detraacutes del desarrollo de Java y tambieacuten la quesoporta Netbeans

216

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 217

Figura B1 Descarga de Netbeans

El programa de instalacioacuten de Netbeans estaacute disponible en varios paquetes seguacutenel lenguaje de programacioacuten y las tecnologiacuteas que se incluyen En el momento deescribir este libro los paquetes disponibles son Java SE Java EE HTML5JavaScriptPHP CC++ All Este uacuteltimo paquete (All) instala todos los lenguajes y tecnologiacuteasdisponibles para el IDE (sin contar los plugins) Para seguir este libro es suficientecon la versioacuten Java EE sin embargo animo al lector a descargar la versioacuten completa yexperimentar con otros lenguajes diferentes a Java por ejemplo con PHP7

Configuracioacuten

En los ejemplos y soluciones a los ejercicios de este libro nos centildeimos al los estaacuten-dares de programacioacuten de Google para el coacutedigo fuente escrito en el lenguaje deprogramacioacuten Java8 Por tanto despueacutes de la instalacioacuten de Netbeans es necesariorealizar algunso ajustes en la configuracioacuten del editor para cumplir con las siguientescondiciones

7httpsleanpubcomaprendephpconejercicios8httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 218

bull La tecla TAB debe insertar espacios no debe insertar el caraacutecter de tabulacioacutenbull La indentacioacuten debe ser de 2 caracteres (por defecto suele estar a 4)bull La condificacioacuten de caracteres debe ser UTF-8

Para ello selecciona Herramientas rarr Opciones rarr Editor A continuacioacuten seleccionala pestantildea Formato y en el menuacute desplegable correspondiente al lenguaje deprogramacioacuten selecciona Java La configuracioacuten deberiacutea quedar como se indica enla imagen

Figura B2 Configuracioacuten de Netbeans

Creacioacuten de un proyecto

Sigue los pasos que damos a continuacioacuten para crear un nuevo proyecto de Java enNetbeansEn primer lugar desde el menuacute principal selecciona Archivo y a continuacioacuten NuevoProyecto Se puede hacer maacutes raacutepido con la combinacioacuten Control + Mayuacutescula + NVeraacutes que aparece una ventana emergente para elegir el tipo de proyecto SeleccionaJava en el apartado ldquoCategoriacuteasrdquo y Aplicacioacuten Java en el apartado ldquoProyectosrdquo Hazclic en Siguiente

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 219

Figura B3 Nuevo proyecto en Java

Ahora es necesario darle el nombre al proyecto lo puedes llamar por ejemplo SaludoRecuerda no utilizar caracteres especiales ni signos de puntuacioacuten Se crearaacute unacarpeta con el mismo nombre que el proyecto que contendraacute todos los ficherosnecesarios Aseguacuterate de que la casilla Crear la clase principal estaacute marcada Hazclic en Terminar

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 220

Figura B4 Proyecto ldquoSaludordquo

Veraacutes que se ha creado el ldquoesqueletordquo de la aplicacioacuten La clase principal se llamaSaludo y contiene el main que seraacute el cuerpo principal del programa Observa que en laparte de la izquierda donde estaacuten todos los proyectos que se van realizando puedesver la estructura de carpetas y ficheros El coacutedigo fuente de nuestra aplicacioacuten estaacuteen el fichero Saludojava Escribe dentro del main la siguiente liacutenea

Systemoutprintln(iexclHola mundo)

Para guardar compilar y ejecutar basta con hacer clic en el botoacuten verde con el iconode Play o bien pulsar la tecla F6

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 221

Figura B5 Ejecucioacuten del proyecto

Si todo ha salido bien veraacutes el mensaje iexclHola mundo en la ventana de terminal integradade Netbeans que hay justo debajo del editor

Depuracioacuten

El entornoNetbeans permite la depuracioacuten paso a paso de un programa En ocasioneses complicado encontrar y corregir los fallos de una aplicacioacuten y ayuda mucho tenerla posibilidad de ir ejecutando un programa liacutenea a liacutenea y ver coacutemo van cambiandolas variablesPara ilustrar la depuracioacuten paso a paso vamos a utilizar un programa de ejemplo delCapiacutetulo 7 Arrays en concreto usaremos el coacutedigo de Array03javaCrea un nuevo proyecto de Java como se ha indicado en el apartado anterior y llaacutemaloArray03 A continuacioacuten copia el contenido del main del fichero Array03java en tuproyecto Ten cuidado de no borrar la liacutenea package array03Comenzaremos la ejecucioacuten paso a paso del programa pulsando de manera sucesivala tecla F7

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 222

Figura B6 Ejecucioacuten paso a paso

Observa coacutemo Netbeans resalta una liacutenea la ejecuta se detiene y espera quesigamos pulsando F7 En la parte de abajo ha aparecido una nueva ventana que resultatremendamente uacutetil Se trata de una zona donde puedes ver en tiempo real el valorque tiene cada variable (por supuesto se incluyen los arrays)Ve pulsando F7 hasta colocarte en la liacutenea siguiente

num[2] = 200

En la ventana inferior donde aparecen todos los datos despliega el array num veraacutesque los elementos 0 y 1 ya tienen los valores 8 y 33 respectivamente Si vuelves apulsar F7 veraacutes que ahora en la posicioacuten 2 se ha almacenado el 200Para salir del modo ldquopaso a pasordquo y terminar de ejecutar el programa pulsa F5Ademaacutes de la ejecucioacuten ldquopaso a pasordquo tambieacuten resultan muy uacutetiles los puntos deruptura o breakpoints Se trata de marcas a modo de sentildeales de STOP dondeindicamos pausas en la ejecucioacuten del programa La depuracioacuten de un programa devarios cientos o miles de liacuteneas puede ser muy tediosa si se ejecuta cada liacutenea paso a

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 223

paso con F7 Los breakpoints permiten parar la ejecucioacuten en liacuteneas concretas dondequeremos ver con maacutes detalle queacute estaacute sucediendo en nuestro programaVamos a colocar varios breakpoints en nuestro coacutedigo Haz clic sobre las liacuteneas 15 20y 24 (justo encima del nuacutemero de liacutenea) Observa que estas liacuteneas quedan marcadascon un pequentildeo cuadradito

Figura B7 Breakpoints

Pulsa la combinacioacuten de teclas Control + F5 Observa coacutemo el programa empiezaa ejecutarse con normalidad y se para justo en la liacutenea 15 donde estaacute el primerbreakpoint Pulsando ahora F5 el programa continuacutea ejecutaacutendose hasta que se paraen la liacutenea 20 donde estaacute el segundo breakpoint Otra pulsacioacuten de F5 hace quecontinuacutee la ejecucioacuten hasta la liacutenea 24 Una uacuteltima pulsacioacuten de esta tecla hace que elprograma continuacutee la ejecucioacuten hasta el final

Apeacutendice C Caracteres especialesLiacuteneas para tablas

Bloques

⊞ ⊟ ⊠ ⊡

Figuras de ajedrez

Ciacuterculos

oplus ⊖ otimes ⊘ ⊙ ⊛ ⊜ ⊝ ⴱ ⴲ ⵀ ⵁ ⵔ ⵕ ⵙ ⵚ

Flechas

larr uarr rarr darr harr ↚ ↛ ↠ ↣ ↦ ↮ crarr ⇎ ⇏ lArr uArr rArr dArr hArr ⇴ ⇵ ⇶ ⇷ ⇸ ⇹ ⇺ ⇻ ⇼ ⇽ ⇾ ⇿

Nuacutemeros en ciacuterculos

❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓

Dados

Fichas de dominoacute

127024 127025 127026 127027 127028 127029 127030 127031 127032 127033 127034 127035 127036 127037 127038 127039 127040 127041 127042 127043 127044 127045 127046 127047 127048 127049127050 127051 127052 127053 127054 127055 127056 127057 127058 127059 127060 127061 127062 127063 127064 127065 127066 127067 127068 127069 127070 127071 127072 127073 127074 127075127076 127077 127078 127079 127080 127081 127082 127083 127084 127085 127086 127087 127088 127089 127090 127091 127092 127093 127094 127095 127096 127097 127098 127099 127100 127101 127102 127103 127104 127105 127106 127107 127108 127109 127110 127111 127112 127113127114 127115 127116 127117 127118 127119 127120 127121 127122 127123

224

Apeacutendice C Caracteres especiales 225

Cartas

127136 127137 127138 127139 127140 127141 127142 127143 127144 127145 127146 127147 127148 127149 127150 127153 127154 127155 127156 127157 127158 127159 127160 127161 127162 127163 127164 127165 127166 127169 127170 127171127172 127173 127174 127175 127176 127177 127178 127179 127180 127181 127182 127183 127185 127186 127187 127188 127189 127190 127191 127192 127193 127194 127195 127196 127197 127198 127199

Caras

128045 128046 128049 128053 128512 128513 128514 128515 128516 128517 128518 128519 128520 128521 128522 128523 128524 128525 128526 128527 128528 128529 128530 128531 128532 128533 128534 128535 128536128537 128538 128539 128540 128541 128542 128543 128544 128545 128546 128547 128549 128550 128551 128552 128553 128554 128555 128557 128558 128559 128560 128561 128562 128563 128564 128565 128566 128567 128568 128569128570 128571 128572 128573 128574 128575 128576

Horoacutescopo

Miscelaacutenea

Ω ꙮ

  • Tabla de contenidos
  • Sobre este libro
  • Sobre el autor
  • Centros en los que se usa este libro
  • Introduccioacuten
  • Instalacioacuten y configuracioacuten del entorno de programacioacuten Java
  • iexclHola mundo - Salida de datos por pantalla
    • iexclHola mundo - Mi primer programa
    • Coloreado de texto
    • Ejercicios
      • Variables
        • Definicioacuten y tipos de variables
          • Enteros (int y long)
          • Nuacutemeros decimales (double y float)
          • Cadenas de caracteres (String)
            • Operadores artimeacuteticos
            • Asignacioacuten de valores a variables
            • Conversioacuten de tipos (casting)
            • Ejercicios
              • Lectura de datos desde teclado
                • Lectura de texto
                • Lectura de nuacutemeros
                • La clase Scanner
                • Ejercicios
                  • Sentencia condicional (if y switch)
                    • Sentencia if
                    • Operadores de comparacioacuten
                    • Operadores loacutegicos
                    • Sentencia switch (seleccioacuten muacuteltiple)
                    • Ejercicios
                      • Bucles
                        • Bucle for
                        • Bucle while
                        • Bucle do-while
                        • Ejercicios
                          • Nuacutemeros aleatorios
                            • Generacioacuten de nuacutemeros aleatorios con y sin decimales
                            • Generacioacuten de palabras de forma aleatoria de un conjunto dado
                            • Ejercicios
                              • Arrays
                                • Arrays de una dimensioacuten
                                • Arrays bidimensionales
                                • Recorrer arrays con for al estilo foreach
                                • Ejercicios
                                  • Arrays de una dimensioacuten
                                  • Arrays bidimensionales
                                      • Funciones
                                        • Implementando funciones para reutilizar coacutedigo
                                        • Comentarios de funciones
                                        • Creacioacuten de bibliotecas de rutinas mediante paquetes
                                        • Aacutembito de las variables
                                        • Paso de paraacutemetros por valor y por referencia
                                        • Ejercicios
                                          • Programacioacuten orientada a objetos
                                            • Clases y objetos
                                            • Encapsulamiento y ocultacioacuten
                                            • Meacutetodos
                                              • Creiacute haber visto un lindo gatito
                                              • Meacutetodos getter y setter
                                              • Meacutetodo toString
                                                • Aacutembitovisibilidad de los elementos de una clase - public protected y private
                                                • Herencia
                                                  • Sobrecarga de meacutetodos
                                                    • Atributos y meacutetodos de clase (static)
                                                    • Interfaces
                                                    • Arrays de objetos
                                                    • Ejercicios
                                                      • Conceptos de POO
                                                      • POO en Java
                                                      • Arrays de objetos
                                                          • Colecciones y diccionarios
                                                            • Colecciones la clase ArrayList
                                                              • Principales meacutetodos de ArrayList
                                                              • Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de sus elementos
                                                              • ArrayList de objetos
                                                              • Ordenacioacuten de un ArrayList
                                                                • Diccionarios la clase HashMap
                                                                  • Principales meacutetodos de HashMap
                                                                  • Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas
                                                                    • Ejercicios
                                                                      • Ficheros de texto y paso de paraacutemetros por liacutenea de comandos
                                                                        • Lectura de un fichero de texto
                                                                        • Escritura sobre un fichero de texto
                                                                        • Lectura y escritura combinadas
                                                                        • Otras operaciones sobre ficheros
                                                                        • Paso de argumentos por liacutenea de comandos
                                                                        • Combinacioacuten de ficheros y paso de argumentos
                                                                        • Procesamiento de archivos de texto
                                                                        • Ejercicios
                                                                          • Aplicaciones web en Java (JSP)
                                                                            • Hola Mundo en JSP
                                                                            • Mezclando Java con HTML
                                                                            • Recogida de datos en JSP
                                                                            • POO en JSP
                                                                            • Ejercicios
                                                                              • Acceso a bases de datos
                                                                                • Socios de un club de baloncesto
                                                                                • Preparacioacuten del proyecto de ejemplo
                                                                                  • Activar la conexioacuten a MySQL
                                                                                  • Incluir la libreriacutea MySQL JDBC
                                                                                    • Listado de socios
                                                                                    • Alta
                                                                                    • Borrado
                                                                                    • CRUD completo con Bootstrap
                                                                                    • Ejercicios
                                                                                      • Apeacutendice A Ejercicios de ampliacioacuten
                                                                                      • Apeacutendice B Entorno de Desarrollo Integrado Netbeans
                                                                                        • Descarga e instalacioacuten
                                                                                        • Configuracioacuten
                                                                                        • Creacioacuten de un proyecto
                                                                                        • Depuracioacuten
                                                                                          • Apeacutendice C Caracteres especiales
                                                                                            • Liacuteneas para tablas
                                                                                            • Bloques
                                                                                            • Figuras de ajedrez
                                                                                            • Ciacuterculos
                                                                                            • Flechas
                                                                                            • Nuacutemeros en ciacuterculos
                                                                                            • Dados
                                                                                            • Fichas de dominoacute
                                                                                            • Cartas
                                                                                            • Caras
                                                                                            • Horoacutescopo
                                                                                            • Miscelaacutenea
Page 4: Aprende Java con Ejercicios - DAM

IacuteNDICE GENERAL

101 Colecciones la clase ArrayList 1331011Principales meacutetodos de ArrayList 1331012Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de sus

elementos 1351013ArrayList de objetos 1411014Ordenacioacuten de un ArrayList 142

102 Diccionarios la clase HashMap 1461021Principales meacutetodos de HashMap 1461022Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas 147

103 Ejercicios 152

11Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 155111 Lectura de un fichero de texto 156112 Escritura sobre un fichero de texto 159113 Lectura y escritura combinadas 160114 Otras operaciones sobre ficheros 162115 Paso de argumentos por liacutenea de comandos 163116 Combinacioacuten de ficheros y paso de argumentos 166117 Procesamiento de archivos de texto 168118 Ejercicios 171

12Aplicaciones web en Java (JSP) 173121 Hola Mundo en JSP 173122 Mezclando Java con HTML 175123 Recogida de datos en JSP 179124 POO en JSP 183125 Ejercicios 188

13Acceso a bases de datos 192131 Socios de un club de baloncesto 192132 Preparacioacuten del proyecto de ejemplo 195

1321Activar la conexioacuten a MySQL 1951322Incluir la libreriacutea MySQL JDBC 197

133 Listado de socios 197134 Alta 200135 Borrado 202136 CRUD completo con Bootstrap 205137 Ejercicios 207

Apeacutendice A Ejercicios de ampliacioacuten 213

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 216Descarga e instalacioacuten 216Configuracioacuten 217Creacioacuten de un proyecto 218Depuracioacuten 221

IacuteNDICE GENERAL

Apeacutendice C Caracteres especiales 224Liacuteneas para tablas 224Bloques 224Figuras de ajedrez 224Ciacuterculos 224Flechas 224Nuacutemeros en ciacuterculos 224Dados 224Fichas de dominoacute 224Cartas 225Caras 225Horoacutescopo 225Miscelaacutenea 225

Sobre este libroldquoAprende Java con Ejerciciosrdquo es un manual praacutectico para aprender a programar enJava desde ceroNo es necesario tener conocimientos previos de programacioacuten La dificultad del libroes gradual empieza con conceptos muy baacutesicos y ejercicios muy sencillos y vaaumentando en complejidad y dificultad a medida que avanzan los capiacutetulosLa praacutectica hace al maestro Como de verdad se aprende a programar es programandodesde el principio y esa es la filosofiacutea que sigue este libro En cada capiacutetulo se explicanuna serie de conceptos de programacioacuten y se ilustran con ejemplos Al final de cadauno de los capiacutetulos se plantean ejercicios de diferente dificultadEste libro contiene maacutes de 200 ejercicios Tanto las soluciones a los ejercicios como losejemplos estaacuten disponibles en GitHub httpsgithubcomLuisJoseSanchezaprende-java-con-ejercicios y tanto los unos como los otros siguen los estaacutendares de programacioacutende Google para el coacutedigo fuente escrito en el lenguaje de programacioacuten Java1ldquoAprende Java con Ejerciciosrdquo es un libro hecho casi a medida de la asignatura ldquoProgra-macioacutenrdquo que forma parte del curriacuteculo del primer curso de los ciclos formativos DAW(Desarrollo de Aplicaciones Web) y DAM (Desarrollo de Aplicaciones Multiplataforma)pero igualmente puede ser utilizado por estudiantes de Ingenieriacutea Informaacutetica Ingenie-riacutea de Telecomunicaciones o Ciencias Matemaacuteticas en la asignatura de ldquoProgramacioacutenrdquode los primeros cursosSi tienes alguna duda o quieres hacer alguacuten comentario en relacioacuten a este libro tienesa tu disposicioacuten el grupo de Google httpsgroupsgooglecomdforumaprende-java-con-ejercicios Cualquier sugerencia para mejorar este manual seraacute bienvenida

1httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

i

Sobre el autorLuis Joseacute Saacutenchez Gonzaacutelez es Ingeniero Teacutecnico en Informaacutetica de Gestioacuten por laUniversidad de Maacutelaga (Espantildea) y funcionario de carrera de la Junta de Andaluciacuteadesde 1998 En su trabajo de profesor de Informaacutetica combina sus dos pasiones laensentildeanza y la programacioacutenEn el momento de publicar este libro es profesor del IES Campanillas (Maacutelaga) eimparte clases en el Ciclo Superior de Desarrollo de Aplicaciones WebPuedes ponerte en contacto con el autor mediante la direccioacuten de correo electroacute-nico luisjoseprofegmailcom o mediante LinkedIn (httpseslinkedincompubluis-joseacute-saacutenchez86b0834)

ii

Centros en los que se usa este librobull IES Campanillas Maacutelaga (Espantildea)bull IES Poliacutegono Sur Sevilla (Espantildea)bull IES Murgi El Ejido - Almeriacutea (Espantildea)bull IES Punta del Verde Sevilla (Espantildea)

Si eres profesor y utilizas este libro para ensentildear Java piacutedele al autor que antildeada enesta seccioacuten el nombre de tu centro educativo o empresa escribiendo un correo a ladireccioacuten luisjoseprofegmailcom indicando la localidad y el paiacutes del centro

iii

IntroduccioacutenJava es un lenguaje de programacioacuten es de hecho desde hace maacutes de 10 antildeos ellenguaje de programacioacuten maacutes utilizado en el mundo seguacuten el iacutendice PYPL2(PopularitYof Programming Language index)Los ordenadores no entienden - por ahora - el espantildeol ni el ingleacutes ni ninguacuten otroidioma natural De una forma muy simplificada podriacuteamos decir que un lenguaje deprogramacioacuten es un idioma que entiende el ordenador3 Cualquier aplicacioacuten - proce-sador de textos navegador programa de retoque fotograacutefico etc - estaacute compuesta deuna serie de instrucciones convenientemente empaquetadas en ficheros que le dicenal ordenador de una manera muy precisa queacute tiene que hacer en cada momentoJava es un lenguaje de programacioacuten estructurado y como tal hace uso de variablessentencias condicionales bucles funcioneshellip Java es tambieacuten un lenguaje de progra-macioacuten orientado a objetos y por consiguiente permite definir clases con sus meacutetodoscorrespondientes y crear instancias de esas clases Java no es un lenguaje de marcascomo HTML o XML aunque puede interactuar muy bien con ellos4Las aplicaciones Java se suelen compilar a bytecode que es independiente del sistemaoperativo no a binario que siacute depende del sistema operativo De esta forma elbytecode generado al compilar un programa escrito en Java deberiacutea funcionar encualquier sistema operativo que tenga instalada una maacutequina virtual de java (JVM)Cualquier editor simple como Nano o GEdit es suficiente para escribir coacutedigo enJava aunque se recomiendan IDEs5 como NetBeans o Eclipse ya que tienen algunascaracteriacutesticas que facilitan mucho la programacioacuten como el chequeo de erroresmientras se escribe el autocompletado de nombres de variables y funciones y muchomaacutes

2httppyplgithubioPYPLhtml3En realidad un ordenador no entiende directamente los lenguajes de programacioacuten como Java C Ruby etc Mediante una

herramienta que se llama compilador o traductor seguacuten el caso lo que hay escrito en cualquiera de estos lenguajes se convierteen coacutedigo maacutequina - secuencias de unos y ceros - que es el uacutenico lenguaje que de verdad entiende el ordenador

4El lector deberaacute tener unos conocimientos baacutesicos de HTML para entender bien y sacar provecho del capiacutetulo relativo a JSPde este mismo libro Una web excelente para aprender HTML es httpw3schoolscom

5IDE Integrated Development Enviroment (Entorno de Desarrollo Integrado)

iv

Instalacioacuten y configuracioacuten del entorno deprogramacioacuten JavaTodos los ejemplos que contiene este libro asiacute como las soluciones a los ejerciciosse han escrito sobre Linux en concreto sobre Ubuntu (httpwwwubuntucom) Noobstante todo el coacutedigo deberiacutea compilar y funcionar sin ninguacuten problema en cualquierotra plataformaEl software necesario para seguir este manual es el siguiente6

OpenJDKEl Open Java Development Kit (OpenJDK) contiene una serie de componentesque permiten desarrollar y ejecutar aplicaciones escritas en Java Incluye la maacute-quina virtual de Java (JVM) que permite ejecutar bytecode Como mencionamosen el apartado Introduccioacuten el bytecode es el ejecutable en Java El OpenJDKtambieacuten incluye el compilador javac que permite compilar el coacutedigo fuente paragenerar el bytecode En Ubuntu basta ejecutar una liacutenea en la ventana determinal para instalar el OpenJDK

$ sudo apt-get install openjdk-8-jdk

Para los sitemas operativos Mac OS X y Windows se encuentran disponiblespara su descarga los archivos de instalacioacuten del OpenJDK en la paacutegina UnofficialOpenJDK installers for Windows Linux and Mac OS X7 Otra opcioacuten consiste enutilizar el JDK oficial de Oracle que se puede descargar en el apartado Java SEDevelopment Kit 8 - Downloads8 de la web de esta misma empresa No vamos aexplicar las diferencias entre el OpenJDK y el JDK ya que se escapa al aacutembitode este libro A efectos praacutecticos todos los ejemplos contenidos en este manualfuncionan tanto con en el OpenJDK como con el JDK y los ejercicios se puedenrealizar sin problema sea cual sea el kit de desarrollo instalado

Editor de textos simplePara seguir este manual recomendamos utilizar al principio un editor de textossencillo para probar los primeros programas y realizar los primeros ejercicioscompilando en liacutenea de comandos De esta manera el lector se va familiarizandocon el proceso de edicioacuten de coacutedigo compilacioacuten y ejecucioacuten y va entendiendo loque sucede en cada paso En Ubuntu viene instalado por defecto el editor GEditel sistema operativo Mac OS X viene con TextEdit y en Windows podemos usarel programa Bloc de notas

6En la paacutegina httphelloworldcollectionde se muestra el programa Hola mundo escrito en maacutes de 400 lenguajes deprogramacioacuten

7httpsgithubcomalexkaskoopenjdk-unofficial-builds8httpwwworaclecomtechnetworkjavajavasedownloadsjdk8-downloads-2133151html

v

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java vi

GeanyUna vez que el lector ha superado la barrera de escribir sus primeros programasrecomendamos utilizar el entorno de programacioacuten Geany (por ejemplo a partirdel capiacutetulo 2) Se trata de un IDE muy ligero que permite realizar aplicacionessencillas con rapidez Mediante Geany se puede escribir el coacutedigo chequearsi contiene errores compilar y ejecutar el bytecode generado Para programaspequentildeos - por ej calcular la media de varios nuacutemeros - es recomendable utilizarGeany en lugar de un IDE maacutes complejo como Netbeans Mientras con Geanyda tiempo a escribir el coacutedigo compilar y ejecutar Netbeans todaviacutea estariacuteaarrancandoInstalacioacuten de Geany (y los plugins adicionales) en Ubuntu

$ sudo apt-get install geany

$ sudo apt-get install geany-plugins

En la seccioacuten de descargas de la paacutegina oficial de Geany9 se encuentran losficheros de instalacioacuten de este programa tanto para Mac OS X como paraWindowsUna vez instalado Geany es conveniente realizar algunos ajustes en la configu-racioacuten Presiona Control + Alt + P para abrir la ventana de preferencias Hazclic en la pestantildea Editor y luego en la pestantildea Sangriacutea Establece las opcionestal y como se indican a continuacioacuten

9httpwwwgeanyorgDownloadReleases

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java vii

Figura 01 Configuracioacuten de Geany (sangriacutea)

Tambieacuten es recomendable marcar las casillas Mostrar guiacuteas de sangriacutea y Mostrarnuacutemeros de liacutenea Estas opciones se activan en la pestantildea Mostrar

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java viii

Figura 02 Configuracioacuten de Geany (guiacuteas de sangriacutea y nuacutemeros de liacutenea)

NetbeansCuando las aplicaciones a desarrollar son maacutes complejas y sobre todo cuandoeacutestas constan de varios ficheros se recomienda utilizar Netbeans de la empresaOracle En el capiacutetulo 9 el lector ya podriacutea sacarle mucho partido al uso de esteIDE Se trata de un entorno integrado muy potente y muy usado a nivel profesionalque incluye el autocompletado de sintaxis y permite una depuracioacuten avanzadapaso a paso Netbeans se puede descargar de forma gratuita y para cualquierplataforma desde httpsnetbeansorgdownloadsDespueacutes de la instalacioacuten de Netbeans procedemos a configurar el editorPara ello seleccionamos Herramientas rarr Opciones rarr Editor A continuacioacutenseleccionamos la pestantildea Formato y en el menuacute desplegable correspondiente allenguaje de programacioacuten seleccionamos Java La configuracioacuten deberiacutea quedarcomo se indica en la imagen

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java ix

Figura 03 Configuracioacuten de Netbeans

Es muy importante que los editoresIDEs que se utilicen para esribir coacutedigoen Java se configuren adecuadamente Hemos visto coacutemo configurar Geanyy Netbeans pero si el lector decide utilizar otras herramientas deberaacuteconfigurarlas igualmente En definitiva la configuracioacutenpreferencias de lasherramientas que se utilicen deben establecerse de tal forma que se cumplanestos requisitos

bull La tecla TAB debe insertar espacios no debe insertar el caraacutecter detabulacioacuten

bull La indentacioacuten debe ser de 2 caracteres (por defecto suele estar a 4)bull La condificacioacuten de caracteres debe ser UTF-8

1 iexclHola mundo - Salida de datos por pantalla

11 iexclHola mundo - Mi primer programa

El primer programa que aprende a hacer cualquier aspirante a programador es unHolamundo 1 Es seguramente el programa maacutes sencillo que se puede escribir Se trata deun programa muestra el mensaje ldquoHola mundordquo por pantalla Abre el programa GEditque como hemos comentado en la seccioacuten Instalacioacuten y configuracioacuten del entorno deprogramacioacuten Java viene instalado por defecto en Ubuntu y teclea el siguiente coacutedigo

Muestra por pantalla la frase iexclHola mundo author Luis J Saacutenchez

public class HolaMundo Clase principalpublic static void main(String[] args)

Systemoutprintln(iexclHola mundo)

Veraacutes que en principio el texto del coacutedigo no aparece en colores El coloreado desintaxis es muy uacutetil como comprobaraacutes maacutes adelante sobre todo para detectar erroresGraba el programa como HolaMundojava Al grabar con la extensioacuten java ahora elprograma GEdit siacute sabe que se trata de un programa escrito en Java y reconoce lasintaxis de este lenguaje de forma que puede colorear los distintos elementos queaparecen en el coacutedigo

1En la paacutegina httphelloworldcollectionde se muestra el programa Hola mundo escrito en maacutes de 400 lenguajes deprogramacioacuten

1

iexclHola mundo - Salida de datos por pantalla 2

Figura 11 Programa Hola mundo escrito en el editor GEdit

Fiacutejate que el nombre que le damos al fichero es exactamente igual que la clase principalseguido de la extensioacuten java Abre una ventana de terminal entra en el directoriodonde se encuentra el fichero y teclea lo siguiente

$ javac HolaMundojava

Este comando crea HolaMundoclass que es el bytecode Para ejecutar el programateclea

$ java HolaMundo

iexclEnhorabuena Acabas de realizar tu primer programa en JavaEn la siguiente captura de pantalla puedes ver la ventana de terminal y los comandosque acabamos de describir

iexclHola mundo - Salida de datos por pantalla 3

Figura 12 HolaMundoclass es el bytecode generado (1) El resultado del programa es una liacutenea de textoescrita en pantalla (2)

La instruccioacuten que hemos utilizado para mostrar una frase por pantalla es Sys-

temoutprintln() colocando la frase entre pareacutentesis Tambieacuten se puede volcar textopor pantalla mediante Systemoutprint() La uacutenica diferencia radica en que esta uacuteltimano antildeade un salto de liacutenea al final prueacutebalo en HolaMundojava y comprueacutebalo por timismo Si lo que quieres mostrar es una palabra o una frase como en este ejemploes importante que el texto esteacute entrecomillado

bull El programa propiamente dicho estaacute dentro de lo que llamamos ldquoclaseprincipalrdquo

bull El fichero debe tener el mismo nombre que la clase principal seguido porla extensioacuten java

bull Los comentarios de varias liacuteneas se colocan entre y

bull Los comentarios de liacutenea se indican mediante

bull Para mostrar informacioacuten por pantalla se utilizan Systemoutprintln() ySystemoutprint()

iexclHola mundo - Salida de datos por pantalla 4

12 Coloreado de texto

Mostrar siempre texto blanco sobre fondo negro puede resultar muy aburrido El textoque se muestra por pantalla se puede colorear para ello es necesario insertar unassecuencias de caracteres - que indican el color con el que se quiere escribir - justoantes del propio textoPrueba el siguiente programa y no te preocupes si todaviacutea no lo entiendes del todoen el proacuteximo capiacutetulo se explican los diferentes tipos de datos que se pueden utilizaren Java entre estos tipos estaacute la cadena de caracteres o String

Coloreado de texto Muestra varias palabras en el color que corresponde author Luis Joseacute Saacutenchez

public class Colores

public static void main(String[] args)

String rojo = 033[31m

String verde = 033[32m

String naranja = 033[33m

String azul = 033[34m

String morado = 033[35m

String blanco = 033[37m

Systemoutprint(naranja + mandarina + verde + hierba)

Systemoutprint(naranja + saltamontes + rojo + tomate)

Systemoutprint(blanco + saacutebanas + azul + cielo)

Systemoutprint(morado + nazareno + azul + mar)

Como puedes ver en los dos ejemplos que hemos mostrado algunas liacuteneas estaacutenligeramente desplazadas hacia la derecha es lo que se llama sangriacutea o indentacioacutenEn programacioacuten es muy importante sangrar (indentar) bien porque da una idea de queacutepartes del coacutedigo son las que contienen a otras En este uacuteltimo ejemplo tenemos unprograma que tiene unos comentarios al principio y luego la clase principal marcadapor la liacutenea public class Colores Dentro de la clase Colores estaacute el main o bloque delprograma principal que tiene sangriacutea por estar dentro de la definicioacuten de la claseColores A su vez dentro del main hay una serie de liacuteneas de coacutedigo que igualmentetienen sangriacutea

iexclHola mundo - Salida de datos por pantalla 5

En este libro tanto el coacutedigo de los ejemplos como el de las soluciones a losejercicios siguen el estaacutendar de Google para el coacutedigo fuente escrito en el lenguaje deprogramacioacuten Java2 por tanto cada vez que se aplique la sangriacutea seraacute exactamentede dos espacios

2httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

iexclHola mundo - Salida de datos por pantalla 6

13 Ejercicios

Ejercicio 1Escribe una programa que muestre tu nombre por pantalla

Ejercicio 2Modifica el programa anterior para que ademaacutes se muestre tu direccioacuten ytu nuacutemero de teleacutefono Aseguacuterate de que los datos se muestran en liacuteneasseparadas

Ejercicio 3Escribe un programa que muestre por pantalla 10 palabras en ingleacutes juntoa su correspondiente traduccioacuten al castellano Las palabras deben estardistribuidas en dos columnas y alineadas a la izquierda Pista Se puedeinsertar un tabulador mediante t

Ejercicio 4Escribe un programa que muestre tu horario de clase Puedes usar espacios otabuladores para alinear el texto

Ejercicio 5Modifica el programa anterior antildeadiendo colores Puedes mostrar cada asig-natura de un color diferente

Ejercicio 6Escribe un programa que pinte por pantalla una piraacutemide rellena a base deasteriscos La base de la piraacutemide debe estar formada por 9 asteriscos

Ejercicio 7Igual que el programa anterior pero esta vez la piraacutemide estaraacute hueca (sedebe ver uacutenicamente el contorno hecho con asteriscos)

iexclHola mundo - Salida de datos por pantalla 7

Ejercicio 8Igual que el programa anterior pero esta vez la piraacutemide debe aparecerinvertida con el veacutertice hacia abajo

Ejercicio 9Escribe un programa que pinte por pantalla alguna escena - el campo lahabitacioacuten de una casa un aula etc - o alguacuten objeto animado o inanimado- un coche un gato una taza de cafeacute etc Ten en cuenta que puedes utilizarcaracteres como + lt etc iexclEacutechale imaginacioacuten

2 Variables

21 Definicioacuten y tipos de variables

Una variable es un contenedor de informacioacuten Imagina una variable como una cajitacon una etiqueta que indica su nombre una cajita en la que se puede introducir un va-lor Las variables pueden almacenar valores enteros nuacutemeros decimales caracterescadenas de caracteres (palabras o frases) etc El contenido de las variables puedecambiar durante la ejecucioacuten del programa de ahiacute viene el nombre de ldquovariablerdquoJava es un lenguaje fuertemente tipado es decir es necesario declarar todas lasvariables que utilizaraacute el programa indicando siempre el nombre y el tipo de cadaunaEl nombre que se le da a una variable es muy importante intenta usar siemprenombres significativos que de alguna forma identifiquen el contenido Por ejemplosi usas una variable para almacenar el volumen de una figura una buena opcioacuten seriacuteallamarla volumen si tienes una variable que almacena la edad de una persona lo mejores llamarla edad y asiacute sucesivamenteUn programa se lee y se depura mucho mejor si los nombres de las variables se hanelegido de forma inteligenteiquestPodriacuteas averiguar queacute hace la siguiente liacutenea de coacutedigo

x = vIp3 Weerty - zxc

Ahora observa el mismo coacutedigo pero con otros nombres de variables

precioTotal = cantidad precio - descuento

Se entiende mucho mejor iquestverdadEscribiremos los nombres de variables en formato lowerCamelCase La primera letrase escribe en minuacutescula y a continuacioacuten si se utiliza maacutes de una palabra cada unade ellas empezariacutea con mayuacutescula Por ejemplo edadMin es un buen nombre para unavariable que almacena la edad miacutenima a la que se puede acceder a un sitio webObserva que hemos usado una mayuacutescula para diferenciar dos partes (edad y Min)Puede que en alguacuten libro tambieacuten encuentres nombres de variables con el caraacutecterde subrayado ( _ ) de tal forma que el nombre de la variable seriacutea edad_min pero comohemos comentado anteriormente en este libro nos centildeimos al estaacutendar de Google1que exige el formato lowerCamelCase

1httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

8

Variables 9

No se permiten siacutembolos como $ + - etc Puedes usar nuacutemeros en los nombresde variables pero nunca justo al principio 5x no es un nombre vaacutelido pero x5 siacute lo esNo se debe poner una letra mayuacutescula al comienzo del nombre de una variable parano confundirla con una clase (los nombres de las clases comienzan por mayuacutescula)

211 Enteros (int y long)

Las variables que van a contener nuacutemeros enteros se declaran con int Veamos unejemplo

Uso de variables enteras author Luis J Saacutenchez

public class VariablesEnteras

public static void main(String[] args)

int x Se declara la variable x como entera

x = 5 Se asigna el valor 5 a la variable xSystemoutprintln(El valor actual de mi variable es + x)

x = 7 Se asigna el valor 7 a la variable xSystemoutprintln(y ahora es + x)

Si pretendemos almacenar valores muy grandes en una variable usaremos el tipo long

en lugar de int

212 Nuacutemeros decimales (double y float)

Usamos los tipos double o float cuando queremos (o esperamos) almacenar nuacutemeroscon decimales en las variablesCintildeeacutendonos al estaacutendar de Google no daremos por vaacutelidas definiciones de variablescomo la siguiente (aunque funcionariacutea sin ninguacuten problema)

double x y

Cada variable se debe definir en una liacutenea diferente Lo siguiente siacute seriacutea correcto

Variables 10

double x

double y

A continuacioacuten tienes un ejemplo completo

Uso de variables que contienen nuacutemeros decimales author Luis J Saacutenchez

public class VariablesConDecimales

public static void main(String[] args)

double x Se declaran las variables x e ydouble y de tal forma que puedan almacenar decimales

x = 7

y = 2501

Systemoutprintln( x vale + x)

Systemoutprintln( y vale + y)

Como puedes ver tambieacuten se pueden almacenar nuacutemeros enteros en variables de tipodouble

213 Cadenas de caracteres (String)

Las cadenas de caracteres se utilizan para almacenar palabras y frases Todas lascadenas de caracteres deben ir entrecomilladas

Uso del tipo String author Luis J Saacutenchez

public class UsoDeStrings

public static void main(String[] args)

String miPalabra = cerveza

String miFrase = iquestdoacutende estaacute mi cerveza

Systemoutprintln(Una palabra que uso con frecuencia + miPalabra)

Variables 11

Systemoutprintln(Una frase que uso a veces + miFrase)

Como puedes ver en una cadena de caracteres se pueden almacenar signos depuntuacioacuten espacios y letras con tildes

Variables 12

22 Operadores artimeacuteticos

En Java se puede operar con las variables de una forma muy parecida a como se haceen matemaacuteticas Los operadores aritmeacuteticos de Java son los siguientes

OPERADOR NOMBRE EJEMPLO DESCRIPCIOacuteN+ suma 20 + x suma dos nuacutemeros- resta a - b resta dos nuacutemeros multiplicacioacuten 10 7 multiplica dos nuacutemeros divisioacuten altura 2 divide dos nuacutemeros resto (moacutedulo) 5 2 resto de la divisioacuten entera

++ incremento a++ incrementa en 1 elvalor de la variable

- - decremento a- - decrementa en 1 elvalor de la variable

A continuacioacuten tienes un programa que ilustra el uso de los operadores aritmeacuteticos

Uso de los operadores aritmeacuteticos author Luis J Saacutenchez

public class UsoDeOperadoresAritmeticos

public static void main(String[] args)

int x

x = 100

Systemoutprintln(x + + (x + 5) + + (x - 5))

Systemoutprintln((x 5) + + (x 5) + + (x 5))

23 Asignacioacuten de valores a variables

La sentencia de asignacioacuten se utiliza para dar un valor a una variable En Java (y enla mayoriacutea de lenguajes de programacioacuten) se utiliza el siacutembolo igual ( = ) para estecometido Es importante recalcar que una asignacioacuten no es una ecuacioacuten Por ejemplox = 7 + 1 es una asignacioacuten en la cual se evaluacutea la parte derecha 7 + 1 y el resultadode esa evaluacioacuten se almacena en la variable que se coloque a la izquierda del iguales decir en la x o lo que es lo mismo el nuacutemero 8 se almacena en x La sentenciax + 1 = 23 2 no es una asignacioacuten vaacutelida ya que en el lado izquierdo debemos teneruacutenicamente un nombre de variableVeamos un ejemplo con algunas operaciones y asignaciones

Variables 13

Operaciones y asignaciones author Luis J Saacutenchez

public class Asignaciones

public static void main(String[] args)

int x = 2

int y = 9

int sum = x + y

Systemoutprintln(La suma de mis variables es + sum)

int mul = x y

Systemoutprintln(La multiplicacioacuten de mis variables es + mul)

24 Conversioacuten de tipos (casting)

En ocasiones es necesario convertir una variable (o una expresioacuten en general) de untipo a otro Simplemente hay que escribir entre pareacutentesis el tipo que se quiere obtenerExperimenta con el siguiente programa y observa los diferentes resultados que seobtienen

Conversioacuten de tipos author Luis J Saacutenchez

public class ConversionDeTipos

public static void main(String[] args)

int x = 2

int y = 9

double division

division = (double)y (double)xdivision = y x Comenta esta liacutenea y

observa la diferencia

Variables 14

Systemoutprintln(El resultado de la divisioacuten es + division)

Variables 15

25 Ejercicios

Ejercicio 1Escribe un programa en el que se declaren las variables enteras x e y Asignaleslos valores 144 y 999 respectivamente A continuacioacuten muestra por pantallael valor de cada variable la suma la resta la divisioacuten y la multiplicacioacuten

Ejercicio 2Crea la variable nombre y asiacutegnale tu nombre completo Muestra su valor porpantalla de tal forma que el resultado del programa sea el mismo que en elejercicio 1 del capiacutetulo 1

Ejercicio 3Crea las variables nombre direccion y telefono y asiacutegnale los valores corres-pondientes Muestra los valores de esas variables por pantalla de tal formaque el resultado del programa sea el mismo que en el ejercicio 2

Ejercicio 4Realiza un conversor de euros a pesetas La cantidad en euros que se quiereconvertir deberaacute estar almacenada en una variable

Ejercicio 5Realiza un conversor de pesetas a euros La cantidad en pesetas que se quiereconvertir deberaacute estar almacenada en una variable

Ejercicio 6Escribe un programa que calcule el total de una factura a partir de la baseimponible (precio sin IVA) La base imponible estaraacute almacenada en unavariable

3 Lectura de datos desde tecladoHemos visto en los capiacutetulos anteriores coacutemo mostrar informacioacuten por pantalla ycoacutemo usar variables Veremos ahora algo muy importante que te permitiraacute realizarprogramas algo maacutes funcionales que tengan una utilidad real aprenderaacutes a leer lainformacioacuten que introduce un usuario mediante el tecladoEl funcionamiento de casi todos los programas se podriacutea resumir en los siguientespuntos

1 Entrada de datos desde teclado (o desde cualquier otro dispositivo de entrada)2 Procesamiento de los datos de entrada para producir un resultado3 Visualizacioacuten de los resultados por pantalla

De momento hemos visto coacutemo realizar los puntos 2 y 3 Vamos a ver a continuacioacutencoacutemo se recoge la informacioacuten desde el teclado

31 Lectura de texto

Para recoger datos por teclado usamos Systemconsole()readLine() Cuando llegamos aesta sentencia el programa se detiene y espera que el usuario introduzca informacioacutenmediante el teclado La introduccioacuten de datos termina con la pulsacioacuten de la teclaINTRO Una vez que el usuario presiona INTRO todo lo que se ha tecleado se almacenaen una variable en el siguiente ejemplo esa variable es nombre

Lectura de datos desde teclado author Luis J Sanchez

public class DimeTuNombre

public static void main(String[] args)

String nombre

Systemoutprint(Por favor dime coacutemo te llamas )

nombre = Systemconsole()readLine()

Systemoutprintln(Hola + nombre + iexclencantado de conocerte)

16

Lectura de datos desde teclado 17

Mediante Systemconsole()readLine() se recoge una liacutenea de texto introducidapor teclado

Cuando se piden datos por teclado es importante que el programa especifiqueclaramente cuaacutel es exactamente la informacioacuten que requiere por parte del usuarioDate cuenta que este programa muestra el mensaje ldquoPor favor dime coacutemo te llamasrdquoImagina que se omite este mensaje en la pantalla apareceriacutea uacutenicamente un cursorparpadeando y el usuario no sabriacutea queacute tiene que hacer o queacute dato introducirTambieacuten es importante resentildear que los datos introducidos por teclado se recogen comouna cadena de caracteres (un String)

32 Lectura de nuacutemeros

Si en lugar de texto necesitamos datos numeacutericos deberemos convertir la cadenaintroducida en un nuacutemero con el meacutetodo adecuado Como se muestra en el ejemploIntegerparseInt() convierte el texto introducido por teclado en un dato numeacutericoconcretamente en un nuacutemero entero

Lectura de datos desde teclado author Luis J Saacutenchez

public class LeeNumeros

public static void main(String[] args)

String linea

Systemoutprint(Por favor introduce un nuacutemero )

linea = Systemconsole()readLine()

int primerNumero

primerNumero = IntegerparseInt( linea )

Systemoutprint(introduce otro por favor )

linea = Systemconsole()readLine()

int segundoNumero

segundoNumero = IntegerparseInt( linea )

int total

total = (2 primerNumero) + segundoNumero

Systemoutprint(El primer nuacutemero introducido es + primerNumero)

Lectura de datos desde teclado 18

Systemoutprintln( y el segundo es + segundoNumero)

Systemoutprint(El doble del primer nuacutemero maacutes el segundo es )

Systemoutprint(total)

Este uacuteltimo programa se podriacutea acortar un poco Por ejemplo estas dos liacuteneas

int total

total = (2 primerNumero) + segundoNumero

se podriacutean quedar en una sola liacutenea

int total = (2 primerNumero) + segundoNumero

De igual modo estas tres liacuteneas

linea = Systemconsole()readLine()

int primerNumero

primerNumero = IntegerparseInt( linea )

tambieacuten se podriacutean reducir a una sola tal que asiacute

int primerNumero = IntegerparseInt( Systemconsole()readLine() )

Es muy importante que el coacutedigo de nuestros programas sea limpio y legible A vecesabreviando demasiado el coacutedigo se hace maacutes difiacutecil de leer es preferible tener unasliacuteneas de maacutes y que el coacutedigo se entienda bien a tener un coacutedigo muy compacto peromenos legible

33 La clase Scanner

El meacutetodo Systemconsole()readLine() funciona bien en modo consola (en una ventana determinal) pero puede provocar problemas cuando se trabaja con IDEs como EclipseNetbeans JavaEdit etc Para evitar estos problemas puedes usar la clase Scanner

cuando necesites recoger datos desde teclado La clase Scanner funciona tanto enentornos integrados como en una ventana de terminal

Lectura de datos desde teclado 19

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScanner01

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tu nombre )

String nombre = snextLine()

Systemoutprint(Introduce tu edad )

int edad = IntegerparseInt(snextLine())

Systemoutprintln(Tu nombre es + nombre + y tu edad es + edad)

Fiacutejate que en el programa anterior la sentencia

snextLine()

seriacutea el equivalente a

Systemconsole()readLine()`

Mediante el uso de la clase Scanner es posible leer varios datos en una misma liacutenea Enel programa anterior se pediacutea un nombre y una edad en total dos datos que habiacutea queintroducir en liacuteneas separadas Observa coacutemo en el siguiente ejemplo se piden esosdos datos en una sola liacutenea y separados por un espacio

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScanner02

Lectura de datos desde teclado 20

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tu nombre y tu edad separados por un espacio )

String nombre = snext()

int edad = snextInt()

Systemoutprintln(Tu nombre es + nombre + y tu edad es + edad)

Fiacutejate coacutemo se ha utilizado snext() para leer una cadena de caracteres y snextInt()

para leer un nuacutemero entero todo ello en la misma liacuteneaEl siguiente programa de ejemplo calcula la media de tres nuacutemeros decimales Paraleer cada uno de los nuacutemeros en la misma liacutenea se utiliza snextDouble

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScannerMedia

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tres nuacutemeros (pueden contener decimales) separados por esp

acios )

double x1 = snextDouble()

double x2 = snextDouble()

double x3 = snextDouble()

double media = (x1 + x2 + x3) 3

Systemoutprintln(La media de esos tres nuacutemeros es + media)

Lectura de datos desde teclado 21

Recuerda que iexcla programar se aprende programando Es muy importanteque pruebes los ejemplos - si los modificas y experimentas todaviacutea mejor - yque realices los ejercicios Para aprender a programar no basta con leer el libroy entenderlo es una condicioacuten necesaria pero no suficiente Igual que paraser piloto hacen falta muchas horas de vuelo para ser programador hacenfalta muchas horas picando coacutedigo probando corrigiendo erroreshellip iexclAacutenimoiexclEl esfuerzo merece la pena

Lectura de datos desde teclado 22

34 Ejercicios

Ejercicio 1Realiza un programa que pida dos nuacutemeros y que luego muestre el resultadode su multiplicacioacuten

Ejercicio 2Realiza un conversor de euros a pesetas La cantidad de euros que se quiereconvertir debe ser introducida por teclado

Ejercicio 3Realiza un conversor de pesetas a euros La cantidad de pesetas que se quiereconvertir debe ser introducida por teclado

Ejercicio 4Escribe un programa que sume reste multiplique y divida dos nuacutemerosintroducidos por teclado

Ejercicio 5Escribe un programa que calcule el aacuterea de un rectaacutengulo

Ejercicio 6Escribe un programa que calcule el aacuterea de un triaacutengulo

Ejercicio 7Escribe un programa que calcule el total de una factura a partir de la baseimponible

Ejercicio 8Escribe un programa que calcule el salario semanal de un empleado en basea las horas trabajadas a razoacuten de 12 euros la hora

Lectura de datos desde teclado 23

Ejercicio 9Escribe un programa que calcule el volumen de un cono seguacuten la foacutermula V =13πr

2h

Ejercicio 10Realiza un conversor de Mb a Kb

Ejercicio 11Realiza un conversor de Kb a Mb

Ejercicio 12Escribe un programa que calcule el precio final de un producto seguacuten subase imponible (precio antes de impuestos) el tipo de IVA aplicado (generalreducido o superreducido) y el coacutedigo promocional Los tipos de IVA generalreducido y superreducido son del 21 10 y 4 respectivamente Los coacutedi-gos promocionales pueden ser nopro mitad meno5 o 5porc que significanrespectivamente que no se aplica promocioacuten el precio se reduce a la mitadse descuentan 5 euros o se descuenta el 5 El ejercicio se da por bueno si semuestran los valores correctos aunque los nuacutemeros no esteacuten tabuladosEjemplo

Introduzca la base imponible 25

Introduzca el tipo de IVA (general reducido o superreducido) reducido

Introduzca el coacutedigo promocional (nopro mitad meno5 o 5porc) mitad

Base imponible 2500

IVA (10) 250

Precio con IVA 2750

Coacuted promo (mitad) -1375

TOTAL 1375

Lectura de datos desde teclado 24

Ejercicio 13Realiza un programa que calcule la nota que hace falta sacar en el segundoexamen de la asignatura Programacioacuten para obtener la media deseada Hayque tener en cuenta que la nota del primer examen cuenta el 40 y la delsegundo examen un 60Ejemplo 1

Introduce la nota del primer examen 7

iquestQueacute nota quieres sacar en el trimestre 85

Para tener un 85 en el trimestre necesitas sacar un 95 en el segundo examen

Ejemplo 2

Introduce la nota del primer examen 8

iquestQueacute nota quieres sacar en el trimestre 7

Para tener un 7 en el trimestre necesitas sacar un 633 en el segundo examen

4 Sentencia condicional (if y switch)Una sentencia condicional permite al programa bifurcar el flujo de ejecucioacuten deinstrucciones dependiendo del valor de una expresioacuten

41 Sentencia if

La sentencia if permite la ejecucioacuten de una serie de instrucciones en funcioacuten delresultado de una expresioacuten loacutegica El resultado de evaluar una expresioacuten loacutegica essiempre verdadero (true) o falso (false) Es muy simple en lenguaje natural seriacutea algocomo rdquosi esta condicioacuten es verdadera entonces haz esto sino haz esto otrordquoEl formato de la sentencia if es el siguiente

if (condicioacuten)

instrucciones a ejecutar si la condicioacuten es verdadera

else

instrucciones a ejecutar si la condicioacuten es falsa

A continuacioacuten se muestra un ejempo del uso de la sentencia if

Sentencia if author Luis J Saacutenchez

public class SentenciaIf01

public static void main(String[] args)

Systemoutprint(iquestCuaacutel es la capital de Kiribati )

String respuesta = Systemconsole()readLine()

if (respuestaequals(Tarawa))

Systemoutprintln(iexclLa respuesta es correcta)

else

Systemoutprintln(Lo siento la respuesta es incorrecta)

25

Sentencia condicional (if y switch) 26

En el programa se le pregunta al usuario cuaacutel es la capital de Kiriwati La respuestaintroducida por el usuario se almacena en la variable respuesta A continuacioacuten vienela sentencia condicional if

if (respuestaequals(Tarawa))

Llegado a este punto el programa evaluacutea la expresioacuten respuestaequals(Tarawa)Observa que para comparar dos cadenas de caracteres se utiliza equals() Ima-ginemos que el usuario ha introducido por teclado Madrid entonces la expresioacutenMadridequals(Tarawa) dariacutea como resultado false (falso)Si la expresioacuten hubiera dado como resultado true (verdadero) se ejecutaria la liacutenea

Systemoutprintln(iexclLa respuesta es correcta)

pero no es el caso el resultado de la expresioacuten ha sido false (falso) todo el mundosabe que la capital de Kiriwati no es Madrid por tanto se ejecutariacutea la liacutenea

Systemoutprintln(Lo siento la respuesta es incorrecta)

Vamos a ver otro ejemplo esta vez con nuacutemeros El usuario introduciraacute un nuacutemero porteclado y el programa diraacute si se trata de un nuacutemero positivo o negativo

Sentencia if author Luis J Saacutenchez

public class SentenciaIf02

public static void main(String[] args)

Systemoutprint(Por favor introduce un nuacutemero entero )

String linea = Systemconsole()readLine()

int x = IntegerparseInt( linea )

if (x lt 0)

Systemoutprintln(El nuacutemero introducido es negativo)

else

Systemoutprintln(El nuacutemero introducido es positivo)

El siguiente bloque de coacutedigo

Sentencia condicional (if y switch) 27

if (x lt 0)

Systemoutprintln(El nuacutemero introducido es negativo)

elseSystemoutprintln(El nuacutemero introducido es positivo)

compilariacutea y funcionariacutea sin problemas - fiacutejate que hemos quitado las llaves - ya queantes y despueacutes del else hay una sola sentencia y en estos casos no es obligatorioponer llaves Sin embargo nosotros siempre usaremos llaves es una exigencia delestaacutendar de Google al que nos centildeimos en este manual

Llaves egipcias (egyptian brackets)Fiacutejate en la manera de colocar las llaves dentro del coacutedigo de un programaen Java La llave de apertura de bloque se coloca justo al final de la liacutenea y lallave de cierre va justo al principio de la liacutenea Se llaman llaves egipcias1 porla similitud entre las llaves y las manos de los egipcios que aparecen en lospapiros

1httpblogcodinghorrorcomnew-programming-jargon

Sentencia condicional (if y switch) 28

42 Operadores de comparacioacuten

En el ejemplo anterior usamos el operador lt en la comparacioacuten if (x lt 0) para saber sila variable x es menor que cero Hay maacutes operadores de comparacioacuten en la siguientetabla se muestran todos

OPERADOR NOMBRE EJEMPLO DESCRIPCIOacuteN== igual a == b a es igual a b= distinto a = b a es distinto de blt menor que a lt b a es menor que bgt mayor que a gt b a es mayor que b

lt= mayor o igual que a gt = b a es mayor o igual que b

El siguiente ejemplo muestra el uso de uno de estos operadores concretamente de gt=

(mayor o igual) El usuario introduce una nota si esta nota es mayor o igual a 5 sele mostraraacute un mensaje diciendo que ha aprobado y en caso de que no se cumpla lacondicioacuten se mostraraacute un mensaje diciendo que estaacute suspenso

Sentencia if author Luis J Saacutenchez

public class SentenciaIf03

public static void main(String[] args)

Systemoutprint(iquestQueacute nota has sacado en el uacuteltimo examen )

String line = Systemconsole()readLine()

double nota = DoubleparseDouble( line )

if (nota gt= 5)

Systemoutprintln(iexclEnhorabuena iexclhas aprobado)

else

Systemoutprintln(Lo siento has suspendido)

Sentencia condicional (if y switch) 29

43 Operadores loacutegicos

Los operadores de comparacioacuten se pueden combinar con los operadores loacutegicos Porejemplo si queremos saber si la variable a es mayor que b y ademaacutes es menor que cescribiriacuteamos if ((a gt b) ampamp (a lt c)) En la siguiente tabla se muestran los operadoresloacutegicos de Java

OPERADOR NOMBRE EJEMPLO DEVUELVEVERDADEROCUANDOhellip

ampamp y (7 gt 2) ampamp (2 lt 4) las dos condicionesson verdaderas

|| o (7 gt 2) || (2 lt 4) al menos una de lascondiciones es

verdadera no (7 gt 2) la condicioacuten es falsa

Vamos a ver coacutemo funcionan los operadores loacutegicos con un ejemplo Mediante if ((n lt

1) || (n gt 100)) se pueden detectar los nuacutemeros que no estaacuten en el rango de 1 a 100literalmente seriacutea ldquosi n es menor que 1 o n es mayor que 100rdquo

Operadores loacutegicos author Luis J Saacutenchez

public class OperadoresLogicos01

public static void main(String[] args)

Systemoutprintln(Adivina el nuacutemero que estoy pensando)

Systemoutprint(Introduce un nuacutemero entre el 1 y el 100 )

String linea = Systemconsole()readLine()

int n = IntegerparseInt( linea )

if ((n lt 1) || (n gt 100))

Systemoutprintln(El nuacutemero introducido debe estar en el intervalo 1 - 100)

Systemoutprint(Tienes otra oportunidad introduce un nuacutemero )

linea = Systemconsole()readLine()

n = IntegerparseInt( linea )

if (n == 24)

Systemoutprintln(iexclEnhorabuena iexclhas acertado)

else

Systemoutprintln(Lo siento ese no es el nuacutemero que estoy pensando)

Sentencia condicional (if y switch) 30

En el siguiente programa puedes ver el uso de operadores loacutegicos combinado conoperadores relacionales (operadores de comparacioacuten) Intenta adivinar cuaacutel seraacute elresultado mirando el coacutedigo

Operadores loacutegicos y relacionales author Luis J Saacutenchez

public class OperadoresLogicos02

public static void main(String[] args)

boolean a = trueboolean b = falseSystemoutprintln(a = + a)

Systemoutprintln(b = + b)

Systemoutprintln(a ampamp b = + (a ampamp b))

Systemoutprintln(a || b = + (a || b))

Systemoutprintln(a = + a)

Systemoutprintln(a || (6 gt 10) = + (a || (6 gt 10)))

Systemoutprintln(((4 lt= 4) || false) ampamp (a) = + (((4 lt= 4) || false) ampamp (a)))

Sentencia condicional (if y switch) 31

44 Sentencia switch (seleccioacuten muacuteltiple)

A veces es necesario comparar el valor de una variable con una serie de valoresconcretos La seleccioacuten muacuteltiple es muy parecida (aunque no es exactamente igual) auna secuencia de varias sentencias ifEl formato de switch es el que se muestra a continuacioacuten En legunaje natural seriacutea algoasiacute como ldquoSi variable vale valor1 entonces entra por case valor1 si variable vale valor2

entonces entra por case valor2hellip si variable no vale ninguno de los valores que hay enlos distintos case entonces entra por default

switch(variable)

case valor1

sentencias

break

case valor2

sentencias

break

default

sentencias

A continuacioacuten tienes un ejemplo completo en Java Se pide al usuario un nuacutemero demes y el programa da el nombre del mes que corresponde a ese nuacutemero

Sentencia muacuteltiple (switch) author Luis Joseacute Saacutenchez

public class SentenciaSwitch

public static void main(String[] args)

Systemoutprint(Por favor introduzca un numero de mes )

int mes = IntegerparseInt(Systemconsole()readLine())

String nombreDelMes

switch (mes)

Sentencia condicional (if y switch) 32

case 1

nombreDelMes = enero

breakcase 2

nombreDelMes = febrero

breakcase 3

nombreDelMes = marzo

breakcase 4

nombreDelMes = abril

breakcase 5

nombreDelMes = mayo

breakcase 6

nombreDelMes = junio

breakcase 7

nombreDelMes = julio

breakcase 8

nombreDelMes = agosto

breakcase 9

nombreDelMes = septiembre

breakcase 10

nombreDelMes = octubre

breakcase 11

nombreDelMes = noviembre

breakcase 12

nombreDelMes = diciembre

breakdefault

nombreDelMes = no existe ese mes

Systemoutprintln(Mes + mes + + nombreDelMes)

Observa que es necesario introducir un break despueacutes de la asignacioacuten de la variable

Sentencia condicional (if y switch) 33

nombreDelMes En caso de no encontrarse el break el programa continuacutea la ejecucioacuten enla liacutenea siguienteEl bloque que corresponde al default se ejecuta cuando la variable no coincide conninguno de los valores de los case Escribiremos siempre el default al final de lasentencia switch aunque no sea necesarioLa sentencia switch se utiliza con frecuencia para crear menuacutes

Ejemplo de un menuacute con switch author Luis Joseacute Saacutenchez

public class MenuConSwitch

public static void main(String[] args)

Systemoutprintln( CAacuteLCULO DE AacuteREAS)

Systemoutprintln( ----------------)

Systemoutprintln( 1 Cuadrado)

Systemoutprintln( 2 Rectaacutengulo)

Systemoutprintln( 3 Triaacutengulo)

Systemoutprint(n Elija una opcioacuten (1-3) )

int opcion = IntegerparseInt(Systemconsole()readLine())

double lado

double base

double altura

switch (opcion)

case 1

Systemoutprint(nIntroduzca el lado del cuadrado en cm )

lado = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(nEl aacuterea del cuadrado es + (lado lado) + cm2)

break

case 2

Systemoutprint(nIntroduzca la base del rectaacutengulo en cm )

base = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura del rectaacutengulo en cm )

altura = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El aacuterea del rectaacutengulo es + (base altura) + cm2)

break

Sentencia condicional (if y switch) 34

case 3

Systemoutprint(nIntroduzca la base del triaacutengulo en cm )

base = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura del triaacutengulo en cm )

altura = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El aacuterea del triaacutengulo es + ((base altura) 2) + cm2)

break

default

Systemoutprint(nLo siento la opcioacuten elegida no es correcta)

Sentencia condicional (if y switch) 35

45 Ejercicios

Ejercicio 1Escribe un programa que pida por teclado un diacutea de la semana y que diga queacuteasignatura toca a primera hora ese diacutea

Ejercicio 2Realiza un programa que pida una hora por teclado y que muestre luegobuenos diacuteas buenas tardes o buenas noches seguacuten la hora Se utilizaraacuten lostramos de 6 a 12 de 13 a 20 y de 21 a 5 respectivamente Soacutelo se tienen encuenta las horas los minutos no se deben introducir por teclado

Ejercicio 3Escribe un programa en que dado un nuacutemero del 1 a 7 escriba el correspon-diente nombre del diacutea de la semana

Ejercicio 4Vamos a ampliar uno de los ejercicios de la relacioacuten anterior para considerarlas horas extras Escribe un programa que calcule el salario semanal de untrabajador teniendo en cuenta que las horas ordinarias (40 primeras horas detrabajo) se pagan a 12 euros la hora A partir de la hora 41 se pagan a 16euros la hora

Ejercicio 5Realiza un programa que resuelva una ecuacioacuten de primer grado (del tipo ax+b = 0)

Ejercicio 6Realiza un programa que calcule el tiempo que tardaraacute en caer un objeto desdeuna altura h Aplica la foacutermula t =

radic2hg siendo g = 981ms2

Ejercicio 7Realiza un programa que calcule la media de tres notas

Sentencia condicional (if y switch) 36

Ejercicio 8Ampliacutea el programa anterior para que diga la nota del boletiacuten (insuficientesuficiente bien notable o sobresaliente)

Ejercicio 9Realiza un programa que resuelva una ecuacioacuten de segundo grado (del tipoax2 + bx+ c = 0)

Ejercicio 10Escribe un programa que nos diga el horoacutescopo a partir del diacutea y el mes denacimiento

Ejercicio 11Escribe un programa que dada una hora determinada (horas y minutos)calcule los segundos que faltan para llegar a la medianoche

Ejercicio 12Realiza un minicuestionario con 10 preguntas tipo test sobre las asignaturasque se imparten en el curso Cada pregunta acertada sumaraacute un punto Elprograma mostraraacute al final la calificacioacuten obtenida Paacutesale el minicuestionarioa tus compantildeeros y piacutedeles que lo hagan para ver queacute tal andan de conoci-mientos en las diferentes asignaturas del curso

Ejercicio 13Escribe un programa que ordene tres nuacutemeros enteros introducidos porteclado

Ejercicio 14Realiza un programa que diga si un nuacutemero introducido por teclado es par yodivisible entre 5

Ejercicio 15Escribe un programa que pinte una piraacutemide rellena con un caraacutecter introdu-cido por teclado que podraacute ser una letra un nuacutemero o un siacutembolo como +- $ amp etc El programa debe permitir al usuario mediante un menuacute elegir siel veacutertice de la piraacutemide estaacute apuntando hacia arriba hacia abajo hacia laizquierda o hacia la derecha

Sentencia condicional (if y switch) 37

Ejercicio 16Realiza un programa que nos diga si hay probabilidad de que nuestra parejanos estaacute siendo infiel El programa iraacute haciendo preguntas que el usuariocontestaraacute con verdadero o falso Cada pregunta contestada como verdaderosumaraacute 3 puntos Las preguntas contestadas con falso no suman puntos Utili-za el fichero test_infidelidadtxt para obtener las preguntas y las conclusionesdel programa

Ejercicio 17Escribe un programa que diga cuaacutel es la uacuteltima cifra de un nuacutemero enterointroducido por teclado

Ejercicio 18Escribe un programa que diga cuaacutel es la primera cifra de un nuacutemero enterointroducido por teclado Se permiten nuacutemeros de hasta 5 cifras

Ejercicio 19Realiza un programa que nos diga cuaacutentos diacutegitos tiene un nuacutemero entero quepuede ser positivo o negativo Se permiten nuacutemeros de hasta 5 diacutegitos

Ejercicio 20Realiza un programa que diga si un nuacutemero entero positivo introducido porteclado es capicuacutea Se permiten nuacutemeros de hasta 5 cifras

Sentencia condicional (if y switch) 38

Ejercicio 21Calcula la nota de un trimestre de la asignatura Programacioacuten El programapediraacute las dos notas que ha sacado el alumno en los dos primeros controlesSi la media de los dos controles da un nuacutemero mayor o igual a 5 el alumnoestaacute aprobado y se mostraraacute la media En caso de que la media sea un nuacutemeromenor que 5 el alumno habraacute tenido que hacer el examen de recuperacioacutenque se califica como apto o no apto por tanto se debe preguntar al usuarioiquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) Si elresultado de la recuperacioacuten es apto la nota seraacute un 5 en caso contrario semantiene la nota media anteriorEjemplo 1

Nota del primer control 7

Nota del segundo control 10

Tu nota de Programacioacuten es 85

Ejemplo 2

Nota del primer control 6

Nota del segundo control 3

iquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) apto

Tu nota de Programacioacuten es 5

Ejemplo 3

Nota del primer control 6

Nota del segundo control 3

iquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) no apto

Tu nota de Programacioacuten es 45

Ejercicio 22Realiza un programa que dado un diacutea de la semana (de lunes a viernes) y unahora (horas y minutos) calcule cuaacutentos minutos faltan para el fin de semanaSe consideraraacute que el fin de semana comienza el viernes a las 1500h Se dapor hecho que el usuario introduciraacute un diacutea y hora correctos anterior al viernesa las 1500h

5 BuclesLos bucles se utilizan para repetir un conjunto de sentencias Por ejemplo imagina quees necesario introducir la notas de 40 alumnos con el fin de calcular la media la notamaacutexima y la nota miacutenima Podriacuteamos escribir 40 veces la intruccioacuten que pide un datopor teclado Systemconsole()readLine() y convertir cada uno de esos datos a un nuacutemerocon decimales con 40 instrucciones DoubleparseDouble() no parece algo muy eficienteEs mucho maacutes praacutectico meter dentro de un bucle aquellas sentencias que queremosque se repitanNormalmente existe una condicioacuten de salida que hace que el flujo del programaabandone el bucle y continuacutee justo en la siguiente sentencia Si no existe condicioacuten desalida o si esta condicioacuten no se cumple nunca se produciriacutea lo que se llama un bucleinfinito y el programa no terminariacutea nunca

51 Bucle for

Se suele utilizar cuando se conoce previamente el nuacutemero exacto de iteraciones(repeticiones) que se van a realizar La sintaxis es la siguiente

for (expresion1 expresion2 expresion3)

sentencias

Justo al principio se ejecuta expresion1 normalmente se usa para inicializar una variableEl bucle se repite mientras se cumple expresion2 y en cada iteraccioacuten del bucle seejecuta expresion3 que suele ser el incremento o decremento de una variable Conun ejemplo se veraacute mucho maacutes claro

Bucle for author Luis Joseacute Saacutenchez

public class EjemploFor

public static void main(String[] args)

for (int i = 1 i lt 11 i++)

Systemoutprintln(i)

39

Bucles 40

En este ejemplo int i = 1 se ejecuta solo una vez antes que cualquier otra cosa comoves esta expresioacuten se utiliza para inicializar la variable i a 1 Mientra se cumpla lacondicioacuten i lt 11 el contenido del bucle o sea Systemoutprintln(i) se va a ejecutarEn cada iteracioacuten del bucle i++ hace que la variable i se incremente en 1 El resultadodel ejemplo es la impresioacuten en pantalla de los nuacutemeros del 1 al 10Intenta seguir mentalmente el flujo del programa Experimenta inicializando la variablei con otros valores cambia la condicioacuten con gt o lt= y observa lo que sucede Pruebatambieacuten a cambiar el incremento de la variable i por ejemplo con i = i + 2

52 Bucle while

El bucle while se utiliza para repetir un conjunto de sentencias siempre que se cumplauna determinada condicioacuten Es importante resentildear que la condicioacuten se comprueba alcomienzo del bucle por lo que se podriacutea dar el caso de que dicho bucle no se ejecutasenunca La sintaxis es la siguiente

while (expresion)

sentencias

Las sentencias se ejecutan una y otra vez mientras expresion sea verdadera El siguienteejemplo produce la misma salida que el ejemplo anterior muestra coacutemo cambian losvalores de i del 1 al 10

Bucle while author Luis Joseacute Saacutenchez

public class EjemploWhile

public static void main(String[] args)

int i = 1

while (i lt 11)

Systemoutprintln(i)

Bucles 41

i++

En el siguiente ejemplo se cuentan y se suman los nuacutemeros que se van introduciendopor teclado Para indicarle al programa que debe dejar de pedir nuacutemeros el usuariodebe introducir un nuacutemero negativo esa seraacute la condicioacuten de salida del bucle Observaque el bucle se repite mientras el nuacutemero introducido sea mayor o igual que cero

Bucle while que termina cuando se introduce por teclado un nuacutemero negativo author Luis Joseacute Saacutenchez

public class CuentaPositivos

public static void main(String[] args)

Systemoutprintln(Por favor vaya introduciendo nuacutemeros y pulsando INTRO)

Systemoutprintln(Para terminar introduzca un nuacutemero negativo)

int numeroIntroducido = 0

int cuentaNumeros = 0

int suma = 0

while (numeroIntroducido gt= 0)

numeroIntroducido = IntegerparseInt(Systemconsole()readLine())

cuentaNumeros++ Incrementa en uno la variablesuma += numeroIntroducido Equivale a suma = suma + NumeroIntroducido

Systemoutprintln(Has introducido + (cuentaNumeros - 1) + nuacutemeros positivos)

Systemoutprintln(La suma total de ellos es + (suma - numeroIntroducido))

53 Bucle do-while

El bucle do-while funciona de la misma manera que el bucle while con la salvedad deque expresion se evaluacutea al final de la iteraccioacuten Las sentencias que encierran el bucledo-while por tanto se ejecutan como miacutenimo una vez La sintaxis es la siguiente

Bucles 42

do

sentencias

while (expresion)

El siguiente ejemplo es el equivalente do-while a los dos ejemplos anteriores quecuentan del 1 al 10

Bucle do-while author Luis Joseacute Saacutenchez

public class EjemploDoWhile

public static void main(String[] args)

int i = 1

do

Systemoutprintln(i)

i++

while (i lt 11)

Veamos otro ejemplo En este caso se van a ir leyendo nuacutemeros de teclado mientrasel nuacutemero introducido sea par el programa pararaacute por tanto cuando se introduzcaun nuacutemero impar

Bucle do-while que termina cuando se introduce por teclado un nuacutemero impar author Luis Joseacute Saacutenchez

public class TerminaCuandoEsImpar

public static void main(String[] args)

int numero

Bucles 43

do

Systemoutprint(Dime un nuacutemero )

numero = IntegerparseInt(Systemconsole()readLine())

if (numero 2 == 0) comprueba si el nuacutemero introducido es parSystemoutprintln(Queacute bonito es el + numero)

else

Systemoutprintln(No me gustan los nuacutemeros impares adioacutes)

while (numero 2 == 0)

Te invito a que realices una modificacioacuten sobre este uacuteltimo ejemplo Despueacutes de pedirun nuacutemero haz que el programa diga iquestQuiere continuar (sn) Si el usuario introduceuna s o una S el programa deberaacute continuar pidiendo nuacutemerosCualquier bucle que un programador quiera realizar en Java lo puede implementar confor while o do-while por tanto con una sola de estas tres opciones tendriacutea suficienteNo obstante seguacuten el programa en cuestioacuten una u otra posibilidad se adapta mejorque las otras y resulta maacutes elegante Con la experiencia te iraacutes dando cuenta cuaacutendoes mejor utilizar cada una

Bucles 44

54 Ejercicios

Ejercicio 1Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle for

Ejercicio 2Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle while

Ejercicio 3Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle do-while

Ejercicio 4Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 hacia atraacutesutilizando un bucle for

Ejercicio 5Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 hacia atraacutesutilizando un bucle while

Ejercicio 6Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 utilizando un bucledo-while

Ejercicio 7Realiza el control de acceso a una caja fuerte La combinacioacuten seraacute unnuacutemero de 4 cifras El programa nos pediraacute la combinacioacuten para abrirla Si noacertamos se nos mostraraacute el mensaje ldquoLo siento esa no es la combinacioacutenrdquoy si acertamos se nos diraacute ldquoLa caja fuerte se ha abierto satisfactoriamenterdquoTendremos cuatro oportunidades para abrir la caja fuerte

Ejercicio 8Muestra la tabla de multiplicar de un nuacutemero introducido por teclado

Bucles 45

Ejercicio 9Realiza un programa que nos diga cuaacutentos diacutegitos tiene un nuacutemero introducidopor teclado

Ejercicio 10Escribe un programa que calcule la media de un conjunto de nuacutemeros positivosintroducidos por teclado A priori el programa no sabe cuaacutentos nuacutemeros seintroduciraacuten El usuario indicaraacute que ha terminado de introducir los datoscuando meta un nuacutemero negativo

Ejercicio 11Escribe un programa que muestre en tres columnas el cuadrado y el cubo delos 5 primeros nuacutemeros enteros a partir de uno que se introduce por teclado

Ejercicio 12Escribe un programa que muestre los n primeros teacuterminos de la serie deFibonacci El primer teacutermino de la serie de Fibonacci es 0 el segundo es 1y el resto se calcula sumando los dos anteriores por lo que tendriacuteamos quelos teacuterminos son 0 1 1 2 3 5 8 13 21 34 55 89 144hellip El nuacutemero n sedebe introducir por teclado

Ejercicio 13Escribe un programa que lea una lista de diez nuacutemeros y determine cuaacutentosson positivos y cuaacutentos son negativos

Ejercicio 14Escribe un programa que pida una base y un exponente (entero positivo) yque calcule la potencia

Ejercicio 15Escribe un programa que dados dos nuacutemeros uno real (base) y un enteropositivo (exponente) saque por pantalla todas las potencias con base elnumero dado y exponentes entre uno y el exponente introducido No se debenutilizar funciones de exponenciacioacuten Por ejemplo si introducimos el 2 y el 5se deberaacuten mostrar 21 22 23 24 y 25

Bucles 46

Ejercicio 16Escribe un programa que diga si un nuacutemero introducido por teclado es o noprimo Un nuacutemero primo es aquel que soacutelo es divisible entre eacutel mismo y launidad

Ejercicio 17Realiza un programa que sume los 100 nuacutemeros siguientes a un nuacutemero enteroy positivo introducido por teclado Se debe comprobar que el dato introducidoes correcto (que es un nuacutemero positivo)

Ejercicio 18Escribe un programa que obtenga los nuacutemeros enteros comprendidos entredos nuacutemeros introducidos por teclado y validados como distintos el programadebe empezar por el menor de los enteros introducidos e ir incrementando de7 en 7

Ejercicio 19Realiza un programa que pinte una piraacutemide por pantalla La altura se debepedir por teclado El caraacutecter con el que se pinta la piraacutemide tambieacuten se debepedir por teclado

Ejercicio 20Igual que el ejercicio anterior pero esta vez se debe pintar una piraacutemide hueca

Ejercicio 21Realiza un programa que vaya pidiendo nuacutemeros hasta que se introduzca unnumero negativo y nos diga cuantos nuacutemeros se han introducido la media delos impares y el mayor de los pares El nuacutemero negativo soacutelo se utiliza paraindicar el final de la introduccioacuten de datos pero no se incluye en el coacutemputo

Ejercicio 22Muestra por pantalla todos los nuacutemeros primos entre 2 y 100 ambos incluidos

Bucles 47

Ejercicio 23Escribe un programa que permita ir introduciendo una serie indeterminadade nuacutemeros mientras su suma no supere el valor 10000 Cuando esto uacuteltimoocurra se debe mostrar el total acumulado el contador de los nuacutemerosintroducidos y la media

Ejercicio 24Escribe un programa que lea un nuacutemero n e imprima una piraacutemide de nuacutemeroscon n filas como en la siguiente figura

1

121

12321

1234321

Ejercicio 25Realiza un programa que pida un nuacutemero por teclado y que luego muestre esenuacutemero al reveacutes

Ejercicio 26Realiza un programa que pida primero un nuacutemero y a continuacioacuten un diacutegitoEl programa nos debe dar la posicioacuten (o posiciones) contando de izquierda aderecha que ocupa ese diacutegito en el nuacutemero introducido

Ejercicio 27Escribe un programa que muestre cuente y sume los muacuteltiplos de 3 que hayentre 1 y un nuacutemero leiacutedo por teclado

Ejercicio 28Escribe un programa que calcule el factorial de un nuacutemero entero leiacutedo porteclado

Ejercicio 29Escribe un programa que muestre por pantalla todos los nuacutemeros enterospositivos menores a uno leiacutedo por teclado que no sean divisibles entre otrotambieacuten leiacutedo de igual forma

Bucles 48

Ejercicio 30Realiza una programa que calcule las horas transcurridas entre dos horas dedos diacuteas de la semana No se tendraacuten en cuenta los minutos ni los segundosEl diacutea de la semana se puede pedir como un nuacutemero (del 1 al 7) o comouna cadena (de ldquolunesrdquo a ldquodomingordquo) Se debe comprobar que el usuariointroduce los datos correctamente y que el segundo diacutea es posterior al primeroA continuacioacuten se muestra un ejemplo

Por favor introduzca la primera hora

Diacutea lunes

Hora 18

Por favor introduzca la segunda hora

Diacutea martes

Hora 20

Entre las 1800h del lunes y las 2000h del martes hay 26 horas

Ejercicio 31Realiza un programa que pinte la letra L por pantalla hecha con asteriscos Elprograma pediraacute la altura El palo horizontal de la L tendraacute una longitud de lamitad (divisioacuten entera entre 2) de la altura maacutes unoEjemplo

Introduzca la altura de la L 5

Bucles 49

Ejercicio 32Escribe un programa que dado un nuacutemero entero diga cuaacuteles son y cuaacutentosuman los diacutegitos pares Los diacutegitos pares se deben mostrar en orden deizquierda a derecha Usa long en lugar de int donde sea necesario para admitirnuacutemeros largosEjemplo 1

Por favor introduzca un nuacutemero entero positivo 94026782

Diacutegitos pares 4 0 2 6 8 2

Suma de los diacutegitos pares 22

Ejemplo 2

Por favor introduzca un nuacutemero entero positivo 31779

Diacutegitos pares

Suma de los diacutegitos pares 0

Ejemplo 3

Por favor introduzca un nuacutemero entero positivo 2404

Diacutegitos pares 2 4 0 4

Suma de los diacutegitos pares 10

Ejercicio 33Realiza un programa que pinte la letra U por pantalla hecha con asteriscos Elprograma pediraacute la altura Fiacutejate que el programa inserta un espacio y pintados asteriscos menos en la base para simular la curvatura de las esquinasinferioresEjemplo

Introduzca la altura de la U 5

Bucles 50

Ejercicio 34Escribe un programa que pida dos nuacutemeros por teclado y que luego mezcle endos nuacutemeros diferentes los diacutegitos pares y los impares Se van comprobandolos diacutegitos de la siguiente manera primer diacutegito del primer nuacutemero primerdiacutegito del segundo nuacutemero segundo diacutegito del primer nuacutemero segundodiacutegito del segundo nuacutemero tercer diacutegito del primer nuacutemerohellip Para facilitarel ejercicio podemos suponer que el usuario introduciraacute dos nuacutemeros de lamisma longitud y que siempre habraacute al menos un diacutegito par y uno impar Usalong en lugar de int donde sea necesario para admitir nuacutemeros largosEjemplo 1

Por favor introduzca un nuacutemero 9402

Introduzca otro nuacutemero 6782

El nuacutemero formado por los diacutegitos pares es 640822

El nuacutemero formado por los diacutegitos impares es 97

Ejemplo 2

Por favor introduzca un nuacutemero 137

Introduzca otro nuacutemero 909

El nuacutemero formado por los diacutegitos pares es 0

El nuacutemero formado por los diacutegitos impares es 19379

6 Nuacutemeros aleatoriosLos nuacutemeros aleatorios se utilizan con frecuencia en programacioacuten para emular elcomportamiento de alguacuten fenoacutemeno natural el resultado de un juego de azar o engeneral para generar cualquier valor impredecible a prioriPor ejemplo se pueden utilizar nuacutemeros aleatorios para generar tiradas de dados detal forma que de antemano no se puede saber el resultado Antes de tirar un dado nosabemos si saldraacute un 3 o un 5 se trataraacute pues de un nuacutemero impredecible lo que siacutesabemos es que saldraacute un nuacutemero entre el 1 y el 6 es decir podemos acotar el rangode los valores que vamos a obtener de forma aleatoria

61 Generacioacuten de nuacutemeros aleatorios con y sin decimales

Para generar valores aleatorios utilizaremos Mathrandom() Esta funcioacuten genera unnuacutemero con decimales (de tipo double) en el intervalo [0 - 1) es decir genera un nuacutemeromayor o igual que 0 y menor que 1El siguiente programa genera diez nuacutemeros aleatorios

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio01

public static void main(String[] args)

Systemoutprintln(Diez nuacutemeros aleatoriosn)

for (int i = 1 i lt 11 i++)

Systemoutprintln(Mathrandom())

La salida del programa puede ser algo como esto

51

Nuacutemeros aleatorios 52

030830376099567813

08330493363981046

02322483682676435

03130746053770094

034192944433558736

09636470440975567

03398896383918959

079825461825305

09868509622870223

09967893773101499

Te invito a que ejecutes varias veces el programa Podraacutes observar que cada vez salennuacutemeros diferentes aunque siempre estaacuten comprendidos entre 0 y 1 (incluyendo el0)Pensaraacutes que no es muy uacutetil generar nuacutemeros aleatorios entre 0 y 1 si lo que queremoses por ejemplo sacar una carta al azar de la baraja espantildeola pero en realidad unnuacutemero decimal entre 0 y 1 es lo uacutenico que nos hace falta para generar cualquier tipode valor aleatorio siempre y cuando se manipule ese nuacutemero de la forma adecuadaPor ejemplo si queremos generar valores aleatorios entre 0 y 10 (incluyendo el 0 y sinllegar a 10) simplemente tendremos que correr la coma un lugar o lo que es lo mismomultiplicar por 10

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio02

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 0 y 10)

Systemoutprintln( sin llegar a 10 (con decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprintln( Mathrandom()10 + )

El programa anterior genera una salida como eacutesta

Nuacutemeros aleatorios 53

007637674702636321

1025787417143682

1854993461897163

5690351111720931

382310645589797

5518007662236258

923529380254256

39201032643833376

5836554253122096

6224559064261578

7652976185871555

49922807025365135

7498156441347868

8743251697509109

9727764845406675

2929766691797686

005801413446517634

21575652936687284

Si queremos generar nuacutemeros enteros en lugar de nuacutemeros con decimales basta conhacer un casting para convertir los nuacutemeros de tipo double en nuacutemeros de tipo intRecuerda que (int)x transforma x en una variable de tipo entero si x era de tipo float

o double perderiacutea todos los decimales

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio03

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 0 y 9 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint((int)(Mathrandom()10) + )

Systemoutprintln()

La salida del programa debe ser algo muy parecido a esto

Nuacutemeros aleatorios 54

20 nuacutemeros aleatorios entre 0 y 9 (sin decimales)

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

iquestY si en lugar de generar nuacutemeros enteros entre 0 y 9 queremos generar nuacutemeros entre1 y 10 Como habraacutes podido adivinar simplemente habriacutea que sumar 1 al nuacutemerogenerado de esta forma se ldquodesplazan un pasordquo los valores generados al azar de talforma que el miacutenimo valor que se produce seriacutea el 0 + 1 = 1 y el maacuteximo seriacutea 9 + 1= 10

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio04

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 1 y 10 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint( (int)(Mathrandom()10 + 1) + )

Systemoutprintln()

Vamos a ponerlo un poco maacutes difiacutecil Ahora vamos a generar nuacutemeros enteros entre50 y 60 ambos incluidos Primero multiplicamos Mathrandom() por 11 con lo queobtenemos nuacutemeros decimales entre 0 y 109999hellip (sin llegar nunca hasta 11) Luegodesplazamos ese intervalo sumando 50 por lo que obtenemos nuacutemeros decimalesentre 50 y 609999hellip Por uacuteltimo quitamos los decimales haciendo casting y voilagraveya tenemos nuacutemeros enteros aleatorios entre 50 y 60 ambos incluidos

Nuacutemeros aleatorios 55

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio05

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 50 y 60 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint(((int)(Mathrandom()11) + 50 ) + )

Systemoutprintln()

62 Generacioacuten de palabras de forma aleatoria de un conjuntodado

Hemos visto coacutemo generar nuacutemeros aleatorios con y sin decimales y en diferentesintervalos Vamos a producir ahora de forma aleatoria una palabra - piedra papel otijera - generando primero un nuacutemero entero entre 0 y 2 y posteriormente haciendocorresponder una palabra a cada nuacutemero

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio06

public static void main(String[] args)

Systemoutprintln(Genera al azar piedra papel o tijera)

int mano = (int)(Mathrandom()3) genera un nuacutemero al azar entre 0 y 2 ambos incluidos

switch(mano)

case 0

Systemoutprintln(piedra)

Nuacutemeros aleatorios 56

breakcase 1

Systemoutprintln(papel)

breakcase 2

Systemoutprintln(tijera)

breakdefault

iquestCoacutemo podriacuteamos generar un diacutea de la semana de forma aleatoria En efecto primerogeneramos un nuacutemero entre 1 y 7 ambos inclusive y luego hacemos corresponder undiacutea de la semana a cada uno de los nuacutemeros

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio07

public static void main(String[] args)

Systemoutprintln(Muestra un diacutea de la semana al azar)

int dia = (int)(Mathrandom()7) + 1 genera un nuacutemero aleatorio entre el 1 y el 7

switch(dia)

case 1

Systemoutprintln(lunes)

breakcase 2

Systemoutprintln(martes)

breakcase 3

Systemoutprintln(mieacutercoles) breakcase 4

Systemoutprintln(jueves)

breakcase 5

Systemoutprintln(viernes)

breakcase 6

Nuacutemeros aleatorios 57

Systemoutprintln(saacutebado)

breakcase 7

Systemoutprintln(domingo)

breakdefault

Nuacutemeros aleatorios 58

63 Ejercicios

Ejercicio 1Escribe un programa que muestre la tirada de tres dados Se debe mostrartambieacuten la suma total (los puntos que suman entre los tres dados)

Ejercicio 2Realiza un programa que muestre al azar el nombre de una carta de labaraja francesa Esta baraja estaacute dividida en cuatro palos picas corazonesdiamantes y treacuteboles Cada palo estaacute formado por 13 cartas de las cuales 9cartas son numerales y 4 literales 2 3 4 5 6 7 8 9 10 J Q K y A (queseriacutea el 1) Para convertir un nuacutemero en una cadena de caracteres podemosusar StringvalueOf(n)

Ejercicio 3Igual que el ejercicio anterior pero con la baraja espantildeola Se utilizaraacute la barajade 40 cartas 2 3 4 5 6 7 sota caballo rey y as

Ejercicio 4Muestra 20 nuacutemeros enteros aleatorios entre 0 y 10 (ambos incluidos) sepa-rados por espacios

Ejercicio 5Muestra 50 nuacutemeros enteros aleatorios entre 100 y 199 (ambos incluidos)separados por espacios Muestra tambieacuten el maacuteximo el miacutenimo y la mediade esos nuacutemeros

Ejercicio 6Escribe un programa que piense un nuacutemero al azar entre 0 y 100 El usuariodebe adivinarlo y tiene para ello 5 oportunidades Despueacutes de cada intentofallido el programa diraacute cuaacutentas oportunidades quedan y si el nuacutemero intro-ducido es menor o mayor que el nuacutemero secreto

Ejercicio 7Escribe un programa que muestre tres apuestas de la quiniela en tres colum-nas para los 14 partidos y el pleno al quince (15 filas)

Nuacutemeros aleatorios 59

Ejercicio 8Modifica el programa anterior para que la probabilidad de que salga un 1 seade 12 la probabilidad de que salga x sea de 13 y la probabilidad de que salga2 sea de 16 Pista 12 = 36 y 13 = 26

Ejercicio 9Realiza un programa que vaya generando nuacutemeros aleatorios pares entre 0y 100 y que no termine de generar nuacutemeros hasta que no saque el 24 Elprograma deberaacute decir al final cuaacutentos nuacutemeros se han generado

Ejercicio 10Realiza un programa que pinte por pantalla diez liacuteneas formadas por carac-teres El caraacutecter con el que se pinta cada liacutenea se elige de forma aleatoriaentre uno de los siguientes - = | Las liacuteneas deben tener una longitudaleatoria entre 1 y 40 caracteres

Ejercicio 11Escribe un programa que muestre 20 notas generadas al azar Las notas debenaparecer de la forma suspenso suficiente bien notable o sobresaliente Alfinal apareceraacute el nuacutemero de suspensos el nuacutemero de suficientes el nuacutemerode bienes etc

Ejercicio 12Realiza un programa que llene la pantalla de caracteres aleatorios (a lo Matrix)con el coacutedigo ascii entre el 32 y el 126 Puedes hacer casting con (char) paraconvertir un entero en un caraacutecter

Ejercicio 13Escribe un programa que simule la tirada de dos dados El programa deberaacutecontinuar tirando los dados una y otra vez hasta que en alguna tirada los dosdados tengan el mismo valor

Ejercicio 14Realiza un programa que haga justo lo contrario a lo que hace el ejercicio 6El programa intentaraacute adivinar el nuacutemero que estaacutes pensando - un nuacutemeroentre 0 y 100 - teniendo para ello 5 oportunidades En cada intento fallido elprograma debe preguntar si el nuacutemero que estaacutes pensando es mayor o menorque el que te acaba de decir

Nuacutemeros aleatorios 60

Ejercicio 15Realiza un generador de melodiacutea con las siguientes condicionesa) Las notas deben estar generadas al azar Las 7 notas son do re mi fasol la y sib) Una melodiacutea estaacute formada por un nuacutemero aleatorio de notas mayor o iguala 4 menor o igual a 28 y siempre muacuteltiplo de 4 (4 8 12hellip)c) Cada grupo de 4 notas seraacute un compaacutes y estaraacute separado del siguientecompaacutes mediante la barra vertical ldquo|rdquo (Alt + 1) El final de la melodiacutea se marcacon dos barrasd) La uacuteltima nota de la melodiacutea debe coincidir con la primeraEjemplo 1

do mi fa mi | si do sol fa | fa re si do | sol mi re do ||

Ejemplo 2

la re mi sol | fa mi mi si | do la sol fa | fa re si sol | do sol mi re | fa la do la ||

Nuacutemeros aleatorios 61

Ejercicio 16Realiza un simulador de maacutequina tragaperras simplificada que cumpla lossiguientes requisitosa) El ordenador mostraraacute una tirada que consiste en mostrar 3 figuras Hay 5figuras posibles corazoacuten diamante herradura campana y limoacutenb) Si las tres figuras son diferentes se debe mostrar el mensaje ldquoLo sientoha perdidordquoc) Si hay dos figuras iguales y una diferente se debe mostrar el mensaje ldquoBienha recuperado su monedardquod) Si las tres figuras son iguales se debe mostrar ldquoEnhorabuena ha ganado10 monedasrdquoEjemplo 1

diamante diamante limoacuten

Bien ha recuperado su moneda

Ejemplo 2

herradura campana diamante

Lo siento ha perdido

Ejemplo 3

corazoacuten corazoacuten corazoacuten

Enhorabuena ha ganado 10 monedas

7 Arrays

71 Arrays de una dimensioacuten

Un array es un tipo de dato capaz de almacenar muacuteltiples valores Se utiliza paraagrupar datos muy parecidos por ejemplo si se necesita almacenar la temperaturamedia diaria en Maacutelaga durante el uacuteltimo antildeo se pueden utilizar las variables temp0temp1 temp2 temp3 temp4 hellip y asiacute hasta 365 variables distintas pero seriacutea poco praacutectico esmejor utilizar un array de nombre temp y usar un iacutendice para referanciar la temperaturade un diacutea concreto del antildeoEn matemaacuteticas un array de una dimensioacuten se llama vector En este libro noutilizaremos este teacutermino para no confundirlo con la clase Vector de JavaVeamos con un ejemplo coacutemo se crea y se utiliza un array

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array01

public static void main(String[] args)

int[] n se define n como un array de enterosn = new int[4] se reserva espacio para 4 enteros

n[0] = 26

n[1] = -30

n[2] = 0

n[3] = 100

Systemoutprint(Los valores del array n son los siguientes )

Systemoutprint(n[0] + + n[1] + + n[2] + + n[3])

int suma = n[0] + n[3]

Systemoutprintln(nEl primer elemento del array maacutes el uacuteltimo suman + suma)

Observa que el iacutendice de cada elemento de un array se indica entre corchetes de talforma que n[3] es el cuarto elemento ya que el primer iacutendice es el 0

62

Arrays 63

Array n

Iacutendice Valor0 261 -302 03 11

Fiacutejate que la definicioacuten del array y la reserva de memoria para los cuatro elementosque la componen se ha realizado en dos liacuteneas diferentes Se pueden hacer ambascosas en una sola liacutenea como veremos en el siguiente ejemplo

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array02

public static void main(String[] args)

definicioacuten del array y reserva de memoria en la misma liacuteneaint[] x = new int[5]

x[0] = 8

x[1] = 33

x[2] = 200

x[3] = 150

x[4] = 11

Systemoutprintln(El array x tiene 5 elementos iquestcuaacutel de ellos quiere ver)

Systemoutprint(Introduzca un nuacutemero del 0 al 4 )

int indice = IntegerparseInt(Systemconsole()readLine())

Systemoutprint(El elemento que se encuentra en la posicioacuten + indice)

Systemoutprintln( es el + x[indice])

El array x del ejemplo anterior se ha ido rellenando elemento a elemento Si se conocenpreviamente todos los valores iniciales del array se puede crear e inicializar en unasola liacutenea de la siguiente forma

int[] x = 8 33 200 150 11

Cada elemento del array se puede utilizar exactamente igual que cualquier otravariable es decir se le puede asignar un valor o se puede usar dentro de una

Arrays 64

expresioacuten En el siguiente ejemplo se muestran varias operaciones en las que losoperandos son elementos del array numPara recorrer todos los elementos de un array se suele utilizar un bucle for junto conun iacutendice que va desde 0 hasta el tamantildeo del array menos 1

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array03

public static void main(String[] args)

int[] num = new int[10]

num[0] = 8

num[1] = 33

num[2] = 200

num[3] = 150

num[4] = 11

num[5] = 88

num[6] = num[2] 10

num[7] = num[2] 10

num[8] = num[0] + num[1] + num[2]

num[9] = num[8]

Systemoutprintln(El array num contiene los siguientes elementos)

for (int i = 0 i lt 10 i++)

Systemoutprintln(num[i])

En Java a diferencia de otros lenguajes como Ruby o PHP todos los elementos de unarray deben ser del mismo tipo por ejemplo no puede haber un entero en la posicioacuten2 y una cadena de caracteres en la posicioacuten 7 del mismo array En el siguiente ejemplose muestra un array de caracteres

Arrays 65

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array04

public static void main(String[] args)

char[] caracter = new char[6]

caracter[0] = R

caracter[1] =

caracter[2] = amp

caracter[3] = +

caracter[4] = A

caracter[5] = 2

Systemoutprintln(El array caracter contiene los siguientes elementos)

for (int i = 0 i lt 6 i++)

Systemoutprintln(caracter[i])

En el siguiente ejemplo se muestra un array de nuacutemeros de tipo double que almacenanotas de alumnos

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array05

public static void main(String[] args)

double[] nota = new double[4]

Systemoutprintln(Para calcular la nota media necesito saber la )

Systemoutprintln(nota de cada uno de tus exaacutemenes)

for (int i = 0 i lt 4 i++)

Arrays 66

Systemoutprint(Nota del examen nordm + (i + 1) + )

nota[i] = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(Tus notas son )

double suma = 0

for (int i = 0 i lt 4 i++)

Systemoutprint(nota[i] + )

suma += nota[i]

Systemoutprintln(nLa media es + suma 4)

72 Arrays bidimensionales

Un array bidimensional utiliza dos iacutendices para localizar cada elemento Podemos vereste tipo de dato como un array que a su vez contiene otros arrays Tambieacuten se puedever como una cuadriacutecula en la que los datos quedan distribuidos en filas y columnasEn el siguiente ejemplo se muestra la definicioacuten y el uso de un array de dosdimensiones

author Luis Joseacute Saacutenchez Ejemplo de uso de arrays bidimensionales

public class ArrayBi01

public static void main(String[] args)

throws InterruptedException Se antildeade esta liacutenea para poder usar sleep

int[][] n = new int[3][2] array de 3 filas por 2 columnas

n[0][0]=20

n[1][0]=67

n[1][1]=33

n[2][1]=7

int fila columna

Arrays 67

for(fila = 0 fila lt 3 fila++)

Systemoutprint(Fila + fila)

for(columna = 0 columna lt 2 columna++)

Systemoutprintf(10d n[fila][columna])

Threadsleep(1000) retardo de un segundo

Systemoutprintln()

Mediante la liacutenea int[][] n = new int[3][2] se define un array bidimensional de 3 filaspor 2 columnas pero bien podriacutean ser 2 filas por 3 columnas seguacuten el objetivo y eluso que del array haga el programadorLos valores del array bidimensional se pueden proporcionar en la misma liacutenea de ladefinicioacuten como se muestra en el siguiente ejemplo

author Luis Joseacute Saacutenchez Ejemplo de uso de arrays bidimensionales

public class ArrayBi02

public static void main(String[] args)

throws InterruptedException Se antildeade esta liacutenea para poder usar sleep

int fila columna

int[][] n = 20 4 67 33 07

for(fila = 0 fila lt 3 fila++)

Systemoutprint(Fila + fila)

for(columna = 0 columna lt 2 columna++)

Systemoutprintf(10d n[fila][columna])

Threadsleep(1000) retardo de un segundo

Systemoutprintln()

Arrays 68

Los arrays bidimensionales se utilizan con frecuencia para situar objetos en un planocomo por ejemplo las piezas de ajedrez en un tablero o un personaje de video-juegoen un laberintoEn el siguiente programa se colocan una mina y un tesoro de forma aleatoria en uncuadrante de cuatro filas por cinco columnas El usuario intentaraacute averiguar doacutendeestaacute el tesoro indicando las coordenadas (x y)

Minijuego Busca el tesoro Se colocan una mina y un tesoro de forma aleatoria en un cuadrante de cuatro filas por cinco columnas El usuario intentaraacute averiguar doacutende estaacute el tesoro author Luis Joseacute Saacutenchez

public class BuscaTesoro

se definen constantes para representar el contenido de las celdasstatic final int VACIO = 0

static final int MINA = 1

static final int TESORO = 2

static final int INTENTO = 3

public static void main(String[] args)

int x

int y

int[][] cuadrante = new int[5][4]

inicializa el arrayfor(x = 0 x lt 4 x++)

for(y = 0 y lt 3 y++)

cuadrante[x][y] = VACIO

coloca la minaint minaX = (int)(Mathrandom()4)int minaY = (int)(Mathrandom()3)cuadrante[minaX][minaY] = MINA

coloca el tesoroint tesoroX

Arrays 69

int tesoroY

do

tesoroX = (int)(Mathrandom()4)tesoroY = (int)(Mathrandom()3)

while ((minaX == tesoroX) ampamp (minaY == tesoroY))

cuadrante[tesoroX][tesoroY] = TESORO

juegoSystemoutprintln(iexclBUSCA EL TESORO)

boolean salir = falseString c =

do

pinta el cuadrantefor(y = 3 y gt= 0 y--)

Systemoutprint(y + |)

for(x = 0 x lt 5 x++)

if (cuadrante[x][y] == INTENTO)

Systemoutprint(X )

elseSystemoutprint( )

Systemoutprintln()

Systemoutprintln( ----------n 0 1 2 3 4n)

pide las coordenadasSystemoutprint(Coordenada x )

x = IntegerparseInt(Systemconsole()readLine())

Systemoutprint(Coordenada y )

y = IntegerparseInt(Systemconsole()readLine())

mira lo que hay en las coordenadas indicadas por el usuarioswitch(cuadrante[x][y])

case VACIO

cuadrante[x][y] = INTENTO

breakcase MINA

Systemoutprintln(Lo siento has perdido)

salir = truebreak

case TESOROSystemoutprintln(Enhorabuena has encontrado el tesoro)

salir = truebreak

default

Arrays 70

while (salir)

pinta el cuadrantefor(y = 3 y gt= 0 y--)

Systemoutprint(y + )

for(x = 0 x lt 5 x++)

switch(cuadrante[x][y])

case VACIO

c =

breakcase MINA

c =

breakcase TESORO

c = euro

breakcase INTENTO

c = x

breakdefault

Systemoutprint(c)

Systemoutprintln()

Systemoutprintln( ----------n 0 1 2 3 4n)

73 Recorrer arrays con for al estilo foreach

Al trabajar con arrays es muy frecuente cometer errores utilizando los iacutendices El errormaacutes tiacutepico consiste en intentar acceder a un elemento mediante un iacutendice que se salede los liacutemites Por ejemplo si tenemos el array n definido de la siguiente forma int[] n =

new int[10] cuando intentamos acceder a n[-1] o a n[10] obtenemos un error en tiempode ejecucioacutenPara recorrer un array de un modo maacutes praacutectico y sencillo sin que tengamos quepreocuparnos de los liacutemites podemos utilizar el bucle for con el formato foreach Deesta forma indicamos simplemente el nombre del array que queremos recorrer y enqueacute variable se va a ir colocando cada elemento con cada iteraccioacuten del bucle No hayque especificar con queacute iacutendice comienza y termina el bucle de eso se encarga JavaA continuacioacuten se muestra el ejemplo Array05java visto anteriormente pero esta vezutilizando el for a la manera foreach

Arrays 71

Recorre un array con un for al estilo foreach author Luis Joseacute Saacutenchez

public class ArrayForEach

public static void main(String[] args)

double[] nota = new double[4]

Systemoutprintln(Para calcular la nota media necesito saber la )

Systemoutprintln(nota de cada uno de tus exaacutemenes)

for (int i = 0 i lt 4 i++)

Systemoutprint(Nota del examen nordm + (i + 1) + )

nota[i] = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(Tus notas son )

double suma = 0

for (double n nota) for al estilo foreachSystemoutprint(n + )

suma += n

Systemoutprintln(nLa media es + suma 4)

Fiacutejate en el segundo for en este caso no se utiliza ninguacuten iacutendice simplemente decimosldquove sacando uno a uno los elementos del array nota y deposita cada uno de esoselementos en la variable n que es de tipo doublerdquo

Arrays 72

74 Ejercicios

741 Arrays de una dimensioacuten

Ejercicio 1Define un array de 12 nuacutemeros enteros con nombre num y asigna los valoresseguacuten la tabla que se muestra a continuacioacuten Muestra el contenido de todoslos elementos del array iquestQueacute sucede con los valores de los elementos que nohan sido inicializados

Ejercicio 2Define un array de 10 caracteres con nombre simbolo y asigna valores a loselementos seguacuten la tabla que se muestra a continuacioacuten Muestra el contenidode todos los elementos del array iquestQueacute sucede con los valores de los elementosque no han sido inicializados

Ejercicio 3Escribe un programa que lea 10 nuacutemeros por teclado y que luego los muestreen orden inverso es decir el primero que se introduce es el uacuteltimo enmostrarse y viceversa

Ejercicio 4Define tres arrays de 20 nuacutemeros enteros cada una con nombres numerocuadrado y cubo Carga el array numero con valores aleatorios entre 0 y 100 En elarray cuadrado se deben almacenar los cuadrados de los valores que hay en elarray numero En el array cubo se deben almacenar los cubos de los valores quehay en numero A continuacioacuten muestra el contenido de los tres arrays dispuestoen tres columnas

Arrays 73

Ejercicio 5Escribe un programa que pida 10 nuacutemeros por teclado y que luego muestrelos nuacutemeros introducidos junto con las palabras ldquomaacuteximordquo y ldquomiacutenimordquo al ladodel maacuteximo y del miacutenimo respectivamente

Ejercicio 6Escribe un programa que lea 15 nuacutemeros por teclado y que los almacene en unarray Rota los elementos de ese array es decir el elemento de la posicioacuten 0debe pasar a la posicioacuten 1 el de la 1 a la 2 etc El nuacutemero que se encuentra enla uacuteltima posicioacuten debe pasar a la posicioacuten 0 Finalmente muestra el contenidodel array

Ejercicio 7Escribe un programa que genere 100 nuacutemeros aleatorios del 0 al 20 y que losmuestre por pantalla separados por espacios El programa pediraacute entoncespor teclado dos valores y a continuacioacuten cambiaraacute todas las ocurrencias delprimer valor por el segundo en la lista generada anteriormente Los nuacutemerosque se han cambiado deben aparecer entrecomillados

Ejercicio 8Realiza un programa que pida la temperatura media que ha hecho en cada mesde un determinado antildeo y que muestre a continuacioacuten un diagrama de barrashorizontales con esos datos Las barras del diagrama se pueden dibujar a basede asteriscos o cualquier otro caraacutecter

Ejercicio 9Realiza un programa que pida 8 nuacutemeros enteros y que luego muestre esosnuacutemeros junto con la palabra ldquoparrdquo o ldquoimparrdquo seguacuten proceda

Ejercicio 10Escribe un programa que genere 20 nuacutemeros enteros aleatorios entre 0 y 100y que los almacene en un array El programa debe ser capaz de pasar todoslos nuacutemeros pares a las primeras posiciones del array (del 0 en adelante) ytodos los nuacutemeros impares a las celdas restantes Utiliza arrays auxiliares sies necesario

Arrays 74

Ejercicio 11Realiza un programa que pida 10 nuacutemeros por teclado y que los almacene enun array A continuacioacuten se mostraraacute el contenido de ese array junto al iacutendice(0 ndash 9) utilizando para ello una tabla Seguidamente el programa pasaraacute losprimos a las primeras posiciones desplazando el resto de nuacutemeros (los queno son primos) de tal forma que no se pierda ninguno Al final se debe mostrarel array resultantePor ejemplo

Array inicial

Array final

Ejercicio 12Realiza un programa que pida 10 nuacutemeros por teclado y que los almacene enun array A continuacioacuten se mostraraacute el contenido de ese array junto al iacutendice(0 ndash 9) Seguidamente el programa pediraacute dos posiciones a las que llamaremosldquoinicialrdquo y ldquofinalrdquo Se debe comprobar que inicial es menor que final y queambos nuacutemeros estaacuten entre 0 y 9 El programa deberaacute colocar el nuacutemero dela posicioacuten inicial en la posicioacuten final rotando el resto de nuacutemeros para que nose pierda ninguno Al final se debe mostrar el array resultantePor ejemplo para inicial = 3 y final = 7

Array inicial

Array final

Arrays 75

Ejercicio 13Escribe un programa que rellene un array de 100 elementos con nuacutemeros ente-ros aleatorios comprendidos entre 0 y 500 (ambos incluidos) A continuacioacutenel programa mostraraacute el array y preguntaraacute si el usuario quiere destacar elmaacuteximo o el miacutenimo Seguidamente se volveraacute a mostrar el array escribiendoel nuacutemero destacado entre dobles asteriscosEjemplo

459 204 20 250 178 90 353 32 229 357 224 454 260 310 140 249 332 426 423 413 96 447 465 29

8 459 411 118 480 302 417 42 82 126 82 474 362 76 190 104 21 257 88 21 251 6 383 47 78 392

394 244 494 87 253 376 379 98 364 237 13 299 228 409 402 225 426 267 330 243 209 426 435

309 356 173 130 416 15 477 34 28 377 193 481 368 466 262 422 275 384 399 397 87 218 84 312

480 207 68 108

iquestQueacute quiere destacar (1 ndash miacutenimo 2 ndash maacuteximo) 1

459 204 20 250 178 90 353 32 229 357 224 454 260 310 140 249 332 426 423 413 96 447 465 29

8 459 411 118 480 302 417 42 82 126 82 474 362 76 190 104 21 257 88 21 251 6 383 47 78

392 394 244 494 87 253 376 379 98 364 237 13 299 228 409 402 225 426 267 330 243 209 426

435 309 356 173 130 416 15 477 34 28 377 193 481 368 466 262 422 275 384 399 397 87 218 84

312 480 207 68 108

Ejercicio 14Escribe un programa que pida 8 palabras y las almacene en un array Acontinuacioacuten las palabras correspondientes a colores se deben almacenar alcomienzo y las que no son colores a continuacioacuten Puedes utilizar tantos arraysauxiliares como quieras Los colores que conoce el programa deben estar enotro array y son los siguientes verde rojo azul amarillo naranja rosa negroblanco y moradoEjemplo

Array original

0 1 2 3 4 5 6 7

casa azul verde orden morado bombillabici rosa

Array resultado

0 1 2 3 4 5 6 7

azul verde morado rosa casa orden bombillabici

Arrays 76

Ejercicio 15Un restaurante nos ha encargado una aplicacioacuten para colocar a los clientes ensus mesas En una mesa se pueden sentar de 0 (mesa vaciacutea) a 4 comensales(mesa llena) Cuando llega un cliente se le pregunta cuaacutentos son De momentoel programa no estaacute preparado para colocar a grupos mayores a 4 por tantosi un cliente dice por ejemplo que son un grupo de 6 el programa daraacute elmensaje ldquoLo siento no admitimos grupos de 6 haga grupos de 4personas como maacuteximo e intente de nuevordquo Para el grupo que llegase busca siempre la primera mesa libre (con 0 personas) Si no quedan mesaslibres se busca donde haya un hueco para todo el grupo por ejemplo si elgrupo es de dos personas se podraacute colocar donde haya una o dos personasInicialmente las mesas se cargan con valores aleatorios entre 0 y 4 Cadavez que se sientan nuevos clientes se debe mostrar el estado de las mesasLos grupos no se pueden romper aunque haya huecos sueltos suficientes Elfuncionamiento del programa se ilustra a continuacioacutenEjemplo

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 0 2 4 1 0 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 2

Por favor sieacutentense en la mesa nuacutemero 3

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 1 0 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 4

Por favor sieacutentense en la mesa nuacutemero 7

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 1 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 3

Tendraacuten que compartir mesa Por favor sieacutentense en la mesa nuacutemero 6

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 4 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 4

Lo siento en estos momentos no queda sitio

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 4 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) -1

Gracias Hasta pronto

Arrays 77

Ejercicio 16Escribe un programa que rellene un array de 20 elementos con nuacutemeros ente-ros aleatorios comprendidos entre 0 y 400 (ambos incluidos) A continuacioacutenel programa mostraraacute el array y preguntaraacute si el usuario quiere resaltar losmuacuteltiplos de 5 o los muacuteltiplos de 7 Seguidamente se volveraacute a mostrar elarray escribiendo los nuacutemeros que se quieren resaltar entre corchetesEjemplo ldquolsquoconsole159 204 20 250 178 90 353 32 229 357 224 54 260 310 140 249 335 326 22313 iquestQueacute nuacutemeros quiere resaltar (1 ndash los muacuteltiplos de 5 2 ndash los muacuteltiplos de7) 1 159 204 [20] [250] 178 [90] 353 32 229 357 224 54 [260] [310] [140]249 [335] 326 223 13 ldquolsquo

742 Arrays bidimensionales

Ejercicio 1Define un array de nuacutemeros enteros de 3 filas por 6 columnas con nombre num

y asigna los valores seguacuten la siguiente tabla Muestra el contenido de todoslos elementos del array dispuestos en forma de tabla como se muestra en lafigura

Ejercicio 2Escribe un programa que pida 20 nuacutemeros enteros Estos nuacutemeros se debenintroducir en un array de 4 filas por 5 columnas El programa mostraraacute lassumas parciales de filas y columnas igual que si de una hoja de caacutelculo setratara La suma total debe aparecer en la esquina inferior derecha

Arrays 78

Ejercicio 3Modifica el programa anterior de tal forma que los nuacutemeros que se introducenen el array se generen de forma aleatoria (valores entre 100 y 999)

Ejercicio 4Modifica el programa anterior de tal forma que las sumas parciales y la sumatotal aparezcan en la pantalla con un pequentildeo retardo dando la impresioacuten deque el ordenador se queda ldquopensandordquo antes de mostrar los nuacutemeros

Ejercicio 5Realiza un programa que rellene un array de 6 filas por 10 columnas connuacutemeros enteros positivos comprendidos entre 0 y 1000 (ambos incluidos)A continuacioacuten el programa deberaacute dar la posicioacuten tanto del maacuteximo comodel miacutenimo

Ejercicio 6Modifica el programa anterior de tal forma que no se repita ninguacuten nuacutemero enel array

Ejercicio 7Mejora el juego ldquoBusca el tesorordquo de tal forma que si hay una mina a una casillade distancia el programa avise diciendo iexclCuidado iexclHay una mina cerca

Ejercicio 8Escribe un programa que dada una posicioacuten en un tablero de ajedrez nos digaa queacute casillas podriacutea saltar un alfil que se encuentra en esa posicioacuten Como seindica en la figura el alfil se mueve siempre en diagonal El tablero cuenta con64 casillas Las columnas se indican con las letras de la ldquoardquo a la ldquohrdquo y las filasse indican del 1 al 8

Arrays 79

Ejemplo

Introduzca la posicioacuten del alfil d5

El aacutelfil puede moverse a las siguientes posiciones

h1 a2 g2 b3 e3 c4 e4 c6 e6 b7 f7 a8 g8

Ejercicio 9Realiza un programa que sea capaz de rotar todos los elementos de unamatriz cuadrada una posicioacuten en el sentido de las agujas del reloj La matrizdebe tener 12 filas por 12 columnas y debe contener nuacutemeros generados alazar entre 0 y 100 Se debe mostrar tanto la matriz original como la matrizresultado ambas con los nuacutemeros convenientemente alineados

Ejercicio 10Realiza el juego de las tres en raya

8 Funciones

81 Implementando funciones para reutilizar coacutedigo

En programacioacuten es muy frecuente reutilizar coacutedigo es decir usar coacutedigo ya exis-tente Cuando una parte de un programa requiere una funcionalidad que ya estaacuteimplementada en otro programa no tiene mucho sentido emplear tiempo y energiacuteaen implementarla otra vezUna funcioacuten es un trozo de coacutedigo que realiza una tarea muy concreta y que se puedeincluir en cualquier programa cuando hace falta resolver esa tarea Opcionalmentelas funciones aceptan una entrada (paraacutemetros de entrada) y devuelven una salidaObserva el siguiente ejemplo Se trata de un programa que pide un nuacutemero por tecladoy luego dice si el nuacutemero introducido es o no es primo

Dice si un nuacutemero es o no es primo (sin funciones) author Luis Joseacute Saacutenchez

public class NumeroPrimo

public static void main(String[] args)

Systemoutprint(Introduce un nuacutemero entero positivo )

int n = IntegerparseInt(Systemconsole()readLine())

boolean esPrimo = truefor (int i = 2 i lt n i++)

if ((n i) == 0)

esPrimo = false

if (esPrimo)

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

80

Funciones 81

Podemos intuir que la tarea de averiguar si un nuacutemero es o no primo seraacute algo queutilizaremos con frecuencia maacutes adelante asiacute que podemos aislar el trozo de coacutedigoque realiza ese cometido para usarlo con comodidad en otros programas

Dice si un nuacutemero es o no es primo usando una funcioacuten author Luis Joseacute Saacutenchez

public class NumeroPrimoConFuncion

Programa principal

public static void main(String[] args)

Systemoutprint(Introduzca un nuacutemero entero positivo )

int n = IntegerparseInt(Systemconsole()readLine())

if (esPrimo(n))

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

Funciones

Comprueba si un nuacutemero entero positivo es primo o no Un nuacutemero es primo cuando uacutenicamente es divisible entre eacutel mismo y la unidad param x un nuacutemero entero positivo return ltcodegttrueltcodegt si el nuacutemero es primo return ltcodegtfalseltcodegt en caso contrario

public static boolean esPrimo(int x)

for (int i = 2 i lt x i++)

if ((x i) == 0)

return false

Funciones 82

return true

Cada funcioacuten tiene una cabecera y un cuerpo En el ejemplo anterior la cabecera es

public static boolean esPrimo(int x)

De momento no vamos a explicar queacute significa public static lo dejaremos para cuandoveamos el capiacutetulo 9 ldquoProgramacioacuten orientada a objetosrdquo por ahora lo escribiremos talcual cada vez que definamos una funcioacuten A continuacioacuten se escribe el tipo de dato quedevuelve la funcioacuten en este caso es boolean porque la funcioacuten devolveraacute siempre true

(verdadero) o false falso Lo uacuteltimo que lleva la cabecera son los paraacutemetros encerradosentre pareacutentesis Esos paraacutemetros son los valores que se le pasan a la funcioacuten paraque realice los caacutelculos En este caso concreto el paraacutemetro que se pasa es x o seael nuacutemero que queremos saber si es primo o no Es necesario indicar siempre el tipode cada paraacutemetro en esta ocasioacuten el paraacutemetro que se pasa es de tipo entero (int)

82 Comentarios de funciones

Los comentarios tienen un papel muy importante en los programas ya que aunque nose compilan ni se ejecutan permiten describir aclarar o dar informacioacuten relevantesobre queacute hace exactamente el coacutedigo Un programa bien comentado es muchomaacutes faacutecil de corregir mantener y mejorar que un programa mal comentado o quesimplemente no tiene comentariosExiste una herramienta llamada javadoc que crea unos documentos en HTML coninformacioacuten sobre programas escritos en Java Para ello javadoc utiliza los comentariosque se han hecho y ademaacutes la meta-informacioacuten que se incluye en esos comentariosEsta meta-informacioacuten es muy faacutecil de distinguir pues va precedida siempre de uncaraacutecter Te habraacutes dado cuenta que en los comentarios de los programas que hemos visto eneste manual se indica el nombre del autor mediante authorSi los comentarios de los programas en general son importantes debemos prestarespecial atencioacuten a los comentarios de las funciones ya que posiblemente seraacutenusadas por otros programadores que querraacuten saber exactamente coacutemo se utilizanCon la etiqueta param seguida de un nombre de paraacutemetro se indica queacute paraacutemetroespera como entrada la funcioacuten Si una funcioacuten acepta varios paraacutemetros se especifi-caraacuten varias etiquetas param en los comentariosMediante la etiqueta return especificamos queacute devuelve exactamente la funcioacutenAunque el tipo de dato que se devuelve ya viene indicado en la cabecera de la funcioacutenmediante la etiqueta return podemos explicarlo con maacutes detalle

Funciones 83

En los comentarios se pueden incluir elementos de HTML como ltcodegt ampnbsp etc yaque los entiende perfectamente javadocPuedes hacer una prueba generando la documentacioacuten del ejemplo ejecutando lasiguiente liacutenea en una ventana de terminal Como tenemos tildes en los comentariossi queremos que salgan bien en las paacuteginas de documentacioacuten debemos indicar lacodificacioacuten de caracteres

javadoc -encoding UTF-8 -charset UTF-8 -docencoding UTF-8 NumeroPrimoConFuncionjava

Para aprender maacutes sobre javadoc puedes consultar la documentacioacuten oficial de Oracle1

83 Creacioacuten de bibliotecas de rutinas mediante paquetes

Si la funcioacuten esPrimo() va a ser usada en tres programas diferentes se puede copiary pegar su coacutedigo en cada uno de los programas pero hay una solucioacuten mucho maacuteselegante y praacutecticaLas funciones de un determinado tipo (por ejemplo funciones matemaacuteticas) se puedenagrupar para crear un paquete (package) que luego se importaraacute desde el programa quenecesite esas funcionesCada paquete se corresponde con un directorio Por tanto si hay un paquete connombre matematicas debe haber un directorio llamado tambieacuten matematicas en la mismaubicacioacuten del programa que importa ese paquete (normalmente el programa princi-pal)Las funciones se pueden agrupar dentro de un paquete de dos maneras diferentesPuede haber subpaquetes dentro de un paquete por ejemplo si quisieacuteramos dividirlas funciones matemaacuteticas en funciones relativas al caacutelculo de aacutereas y voluacutemenesde figuras geomeacutetricas y funciones relacionadas con caacutelculos estadiacutesticos podriacuteamoscrear dos directorios dentro de matematicas con nombres geometria y estadistica respecti-vamente Estos subpaquetes se llamariacutean matematicasgeometria y matematicasestadisticaOtra manera de agrupar las funciones dentro de un mismo paquete consiste en crearvarios ficheros dentro de un mismo directorio En este caso se podriacutean crear los ficherosGeometriajava y EstadisticajavaEntenderemos mejor todos estos conceptos con un ejemplo completo Vamos a crearun paquete con nombre matematicas que contenga dos clases Varias (para funcionesmatemaacuteticas de propoacutesito general) y Geometria Por tanto en el disco duro tendremosuna carpeta con nombre matematicas que contiene los ficheros Variasjava y GeometriajavaEl contenido de estos ficheros se muestra a continuacioacuten

1httpwwworaclecomtechnetworkjavajavasedocumentationindex-137868html

Funciones 84

Funciones matemaacuteticas de propoacutesito general author Luis Joseacute Saacutenchez

package matematicas

public class Varias

Comprueba si un nuacutemero entero positivo es primo o no Un nuacutemero es primo cuando uacutenicamente es divisible entre eacutel mismo y la unidad param x un nuacutemero entero positivo return ltcodegttrueltcodegt si el nuacutemero es primo return ltcodegtfalseltcodegt en caso contrario

public static boolean esPrimo(int x)

for (int i = 2 i lt x i++)

if ((x i) == 0)

return false

return true

Devuelve el nuacutemero de diacutegitos que contiene un nuacutemero entero param x un nuacutemero entero return la cantidad de diacutegitos que contiene el nuacutemero

public static int digitos(int x)

if (x == 0)

return 1

else

int n = 0

while (x gt 0)

x = x 10

n++

Funciones 85

return n

Se incluye a continuacioacuten Geometriacuteajava Recuerda que tanto Variasjava como Geome-

triacuteajava se encuentran dentro del directorio matematicas

Funciones geomeacutetricas author Luis Joseacute Saacutenchez

package matematicas

public class Geometria

Calcula el volumen de un cilindro Tanto el radio como la altura se deben proporcionar en las mismas unidades para que el resultado sea congruente param r radio del cilindro param h altura del cilindro return volumen del cilindro

public static double volumenCilindro(double r double h)

return MathPI r r h

Calcula la longitud de una circunferencia a partir del radio param r radio de la circunferencia return longitud de la circunferencia

public static double longitudCircunferencia(double r)

return 2 MathPI r

Observa que en ambos ficheros se especifica que las clases declaradas (y por tantolas funciones que se definen dentro) pertenecen al paquete matematicas mediante la

Funciones 86

liacutenea package matematicas Ahora ya podemos probar las funciones desde un programaexterno El programa PruebaFuncionesjava estaacute fuera de la carpeta matematicas justo enun nivel superior en la estructura de directorios

Dice si un nuacutemero es o no es primo usando una funcioacuten author Luis Joseacute Saacutenchez

import matematicasVariasimport matematicasGeometria

public class PruebaFunciones

public static void main(String[] args)

int n

Prueba esPrimo()

Systemoutprint(Introduzca un nuacutemero entero positivo )

n = IntegerparseInt(Systemconsole()readLine())

if (matematicasVariasesPrimo(n))

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

Prueba digitos()

Systemoutprint(Introduzca un nuacutemero entero positivo )

n = IntegerparseInt(Systemconsole()readLine())

Systemoutprintln(n + tiene + matematicasVariasdigitos(n) + diacutegitos)

Prueba volumenCilindro()

double r h

Systemoutprintln(Caacutelculo del volumen de un cilindro)

Systemoutprint(Introduzca el radio en metros )

r = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura en metros )

Funciones 87

h = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El volumen del cilindro es + matematicasGeometriavolumenCilind

ro(r h) + m3)

Las liacuteneas

import matematicasVariasimport matematicasGeometria

cargan las clases contenidas en el paquete matematicas y por tanto todas las funcionescontenidas en ellas No vamos a utilizar el comodiacuten de la forma import matematicas yaque estaacute desaconsejado su uso en el estaacutendar de codificacioacuten en Java de GoogleEl uso de una funcioacuten es muy sencillo hay que indicar el nombre del paquete el nom-bre de la clase y finalmente el nombre de la funcioacuten con los paraacutemetros adecuados Porejemplo como vemos en el programa anterior matematicasVariasdigitos(n) devuelve elnuacutemero de diacutegitos de n siendo matematicas el paquete Varias la clase digitos la funcioacuteny n el paraacutemetro que se le pasa a la funcioacuten

84 Aacutembito de las variables

El aacutembito de una variable es el espacio donde ldquoexisterdquo esa variable o dicho de otromodo el contexto dentro del cual la variable es vaacutelidaSeguramente has utilizado muchas veces variables con nombres como x i max o aux Elaacutembito de cada una de esas variables era el programa en el que estaban declaradasFiacutejate que la x del primer programa que aparece en este libro no interfiere para nadacon la x del siguiente programa que usa una variable con ese mismo nombre Aunquese llamen igual son variables diferentesCuando se implementan funciones hay que tener muy claro que las variables utilizadascomo paraacutemetros (por valor) o las variables que se definen dentro de la funcioacuten sonlocales a esa funcioacuten es decir su aacutembito es la funcioacuten y fuera de ella esas variablesno existen Presta atencioacuten al programa Variosjava y observa que las dos funcionesque hay definidas dentro de la clase utilizan sendas variables con nombre x Puesbien cada una de esas variables son completamente independientes se trata de dosvariables distintas que tienen el mismo nombre pero que son vaacutelidas cada una en supropio aacutembito

85 Paso de paraacutemetros por valor y por referencia

En Java como en la mayoriacutea de lenguajes de programacioacuten existen dos maneras depasar paraacutemetros por valor y por referencia

Funciones 88

Cuando se pasa un paraacutemetro por valor en realidad se pasa una copia de la variableuacutenicamente importa el valor Cualquier modificacioacuten que se le haga a la variable que sepasa como paraacutemetro dentro de la funcioacuten no tendraacute ninguacuten efecto fuera de la mismaVeamos un ejemplo

Paso de paraacutemetros por valor author Luis Joseacute Saacutenchez

public class PruebaParametros1

public static void main(String[] args)

int n = 10

Systemoutprintln(n)

calcula(n)

Systemoutprintln(n)

public static void calcula(int x)

x += 24

Systemoutprintln(x)

La salida del programa anterior es la siguiente

10

34

10

A pesar de que la variable que se pasa como paraacutemetro se modifica dentro de lafuncioacuten los cambios no tienen ninguacuten efecto en el programa principalCuando se pasa un paraacutemetro por referencia por el contrario si se modifica su valordentro de la funcioacuten los cambios se mantienen una vez que la funcioacuten ha terminadode ejecutarseEn la mayoriacutea de los lenguajes de programacioacuten es el programador quien decidecuaacutendo un paraacutemetro se pasa por valor y cuaacutendo se pasa por referencia En Java nopodemos elegir Todos los paraacutemetros que son de tipo int double float char o String

se pasan siempre por valor mientras que los arrays se pasan siempre por referenciaEsto quiere decir que cualquier cambio que efectuemos en un array que se pasa comoparaacutemetro permanece cuando termina la ejecucioacuten de la funcioacuten por lo que hay quetener especial cuidado en estos casos

Funciones 89

Paso de un array como paraacutemetro author Luis Joseacute Saacutenchez

public class PruebaParametrosArray

public static void main(String[] args)

int n[] = 8 33 200 150 11

int m[] = new int[5]

muestraArray(n)

incrementa(n)

muestraArray(n)

public static void muestraArray(int x[])

for (int i = 0 i lt xlength i++)

Systemoutprint(x[i] + )

Systemoutprintln()

public static void incrementa(int x[])

for (int i = 0 i lt xlength i++)

x[i]++

La salida del programa anterior es la siguiente

8 33 200 150 11

9 34 201 151 12

Comprobamos por tanto que el array que se ha pasado como paraacutemetro se hamodificado en la funcioacuten y se han conservado los cambios en el programa principalPor uacuteltimo se muestra un programa que contiene funciones que operan con arrays dedos dimensiones

Funciones 90

Paso de un array bidimensional como paraacutemetro author Luis Joseacute Saacutenchez

import matematicasVarias

public class ArrayBiFunciones

public static void main(String[] args)

int[][] n = new int[6][9]

for(int i = 0 i lt 6 i++)

for(int j = 0 j lt 9 j++)

n[i][j] = (int)(Mathrandom()100000)

muestraArrayIntBi(n)

Funciones

Devuelve el nuacutemero de filas de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return nuacutemero de filas del array

public static int filasArrayIntBi(int x[][])

return xlength

Devuelve el nuacutemero de columnas de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return nuacutemero de columnas del array

public static int columnasArrayIntBi(int x[][])

Funciones 91

return x[0]length

Devuelve el maacuteximo de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return el valor maacuteximo encontrado en el array

public static int maximoArrayIntBi(int x[][])

int maximo = IntegerMIN_VALUE

for (int f = 0 f lt filasArrayIntBi(x) f++)

for (int c = 0 c lt columnasArrayIntBi(x) c++)

if (x[f][c] gt maximo)

maximo = x[f][c]

return maximo

Muestra por pantalla el contenido de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros

public static void muestraArrayIntBi(int x[][])

String formatoNumero = + matematicasVariasdigitos(maximoArrayIntBi(x)) + d

for (int f = 0 f lt filasArrayIntBi(x) f++)

for (int c = 0 c lt columnasArrayIntBi(x) c++)

Systemoutprintf(formatoNumero + x[f][c])

Systemoutprintln()

Funciones 92

86 Ejercicios

Ejercicios 1-14Crea una biblioteca de funciones matemaacuteticas que contenga las siguientesfunciones Recuerda que puedes usar unas dentro de otras si es necesario

1 esCapicua Devuelve verdadero si el nuacutemero que se pasa como paraacute-metro es capicuacutea y falso en caso contrario

2 esPrimo Devuelve verdadero si el nuacutemero que se pasa como paraacutemetroes primo y falso en caso contrario

3 siguientePrimo Devuelve el menor primo que es mayor al nuacutemero quese pasa como paraacutemetro

4 potencia Dada una base y un exponente devuelve la potencia5 digitos Cuenta el nuacutemero de diacutegitos de un nuacutemero entero6 voltea Le da la vuelta a un nuacutemero7 digitoN Devuelve el diacutegito que estaacute en la posicioacuten n de un nuacutemero

entero Se empieza contando por el 0 y de izquierda a derecha8 posicionDeDigito Da la posicioacuten de la primera ocurrencia de un diacutegito

dentro de un nuacutemero entero Si no se encuentra devuelve -19 quitaPorDetras Le quita a un nuacutemero n diacutegitos por detraacutes (por la

derecha)10 quitaPorDelante Le quita a un nuacutemero n diacutegitos por delante (por la

izquierda)11 pegaPorDetras Antildeade un diacutegito a un nuacutemero por detraacutes12 pegaPorDelante Antildeade un diacutegito a un nuacutemero por delante13 trozoDeNumero Toma como paraacutemetros las posiciones inicial y final

dentro de un nuacutemero y devuelve el trozo correspondiente14 juntaNumeros Pega dos nuacutemeros para formar uno

Ejercicio 15Muestra los nuacutemeros primos que hay entre 1 y 1000

Ejercicio 16Muestra los nuacutemeros capicuacutea que hay entre 1 y 99999

Ejercicio 17Escribe un programa que pase de binario a decimal

Ejercicio 18Escribe un programa que pase de decimal a binario

Funciones 93

Ejercicio 19Une y ampliacutea los dos programas anteriores de tal forma que se permitaconvertir un nuacutemero entre cualquiera de las siguientes bases decimal binariohexadecimal y octal

Ejercicios 20-28Crea una biblioteca de funciones para arrays (de una dimensioacuten) de nuacutemerosenteros que contenga las siguientes funciones

1 generaArrayInt Genera un array de tamantildeo n con nuacutemeros aleatorioscuyo intervalo (miacutenimo y maacuteximo) se indica como paraacutemetro

2 minimoArrayInt Devuelve el miacutenimo del array que se pasa comoparaacutemetro

3 maximoArrayInt Devuelve el maacuteximo del array que se pasa comoparaacutemetro

4 mediaArrayInt Devuelve la media del array que se pasa como paraacute-metro

5 estaEnArrayInt Dice si un nuacutemero estaacute o no dentro de un array6 posicionEnArray Busca un nuacutemero en un array y devuelve la posicioacuten

(el iacutendice) en la que se encuentra7 volteaArrayInt Le da la vuelta a un array8 rotaDerechaArrayInt Rota n posiciones a la derecha los nuacutemeros de

un array9 rotaIzquierdaArrayInt Rota n posiciones a la izquierda los nuacutemeros de

un array

Funciones 94

Ejercicio 29-34Crea una biblioteca de funciones para arrays bidimensionales (de dos dimen-siones) de nuacutemeros enteros que contenga las siguientes funciones

1 generaArrayBiInt Genera un array de tamantildeo n x m con nuacutemerosaleatorios cuyo intervalo (miacutenimo y maacuteximo) se indica como paraacutemetro

2 filaDeArrayBiInt Devuelve la fila i-eacutesima del array que se pasa comoparaacutemetro

3 columnaDeArrayBiInt Devuelve la columna j-eacutesima del array que sepasa como paraacutemetro

4 coordenadasEnArrayBiInt Devuelve la fila y la columna (en un arraycon dos elementos) de la primera ocurrencia de un nuacutemero dentro de unarray bidimensional Si el nuacutemero no se encuentra en el array la funcioacutendevuelve el array -1 -1

5 esPuntoDeSilla Dice si un nuacutemero es o no punto de silla es decirmiacutenimo en su fila y maacuteximo en su columna

6 diagonal Devuelve un array que contiene una de las diagonales delarray bidimensional que se pasa como paraacutemetro Se pasan comoparaacutemetros fila columna y direccioacuten La fila y la columna determinanel nuacutemero que marcaraacute las dos posibles diagonales dentro del array Ladireccioacuten es una cadena de caracteres que puede ser ldquonoserdquo o ldquonesordquo Lacadena ldquonoserdquo indica que se elige la diagonal que va del noroeste haciael sureste mientras que la cadena ldquonesordquo indica que se elige la diagonalque va del noreste hacia el suroeste

9 Programacioacuten orientada a objetos

91 Clases y objetos

La programacioacuten orientada a objetos es un paradigma de programacioacuten que se basacomo su nombre indica en la utilizacioacuten de objetos Estos objetos tambieacuten se suelenllamar instanciasUn objeto en teacuterminos de POO no se diferencia mucho de lo que conocemos comoun objeto en la vida real Pensemos por ejemplo en un coche Nuestro coche seriacuteaun objeto concreto de la vida real igual que el coche del vecino o el coche de uncompantildeero de trabajo o un deportivo que vimos por la calle el fin de semana pasadohellipTodos esos coches son objetos concretos que podemos ver y tocarTanto mi coche como el coche del vecino tienen algo en comuacuten ambos son cochesEn este caso mi coche y el coche del vecino seriacutean instancias (objetos) y coche (asecas) seriacutea una clase La palabra coche define algo geneacuterico es una abstraccioacutenno es un coche concreto sino que hace referencia a unos elementos que tienen unaserie de propiedades como matriacutecula marca modelo color etc este conjunto depropiedades se denominan atributos o variables de instancia

ClaseConcepto abstracto que denota una serie de cualidades por ejemplo cocheInstanciaObjeto palpable que se deriva de la concrecioacuten de una clase por ejemplo micocheAtributosConjunto de caracteriacutesticas que comparten los objetos de una clase porejemplo para la clase coche tendriacuteamos matriacutecula marca modelo color ynuacutemero de plazas

En Java los nombres de las clases se escriben con la primera letra en mayuacutesculamientras que los nombres de las instancias comienzan con una letra en minuacutesculaPor ejemplo la clase coche se escribe en Java como Coche y el objeto ldquomi cocherdquo sepodriacutea escribir como miCocheDefiniremos cada clase en un fichero con el mismo nombre maacutes la extensioacuten java portanto la definicioacuten de la clase Coche debe estar contenida en un fichero con nombreCochejava

Vamos a definir a continuacioacuten la clase Libro con los atributos isbn autor titulo ynumeroPaginas

95

Programacioacuten orientada a objetos 96

Librojava Definicioacuten de la clase Libro author Luis Joseacute Saacutenchez

public class Libro

atributosString isbn

String titulo

String autor

int numeroPaginas

A continuacioacuten creamos varios objetos de esta clase

PruebaLibrojava Programa que prueba la clase Libro author Luis Joseacute Saacutenchez

public class PruebaLibro

public static void main(String[] args)

Libro lib = new Libro()

Libro miLibrito = new Libro()

Libro quijote = new Libro()

Hemos creado tres instancias de la clase libro lib miLibrito y quijote Ya sabemos definiruna clase indicando sus atributos y crear instancias

Las variables de instancia (atributos) determinan las cualidades de losobjetos

92 Encapsulamiento y ocultacioacuten

Uno de los pilares en los que se basa la Programacioacuten Orientada a Objetos es elencapsulamiento Baacutesicamente el encapsulamiento consiste en definir todas las

Programacioacuten orientada a objetos 97

propiedades y el comportamiento de una clase dentro de esa clase es decir en laclase Coche estaraacute definido todo lo concerniente a la clase Coche y en la clase Libro

estaraacute definido todo lo que tenga que ver con la clase LibroEl encapsulamiento parece algo obvio casi de perogrullo pero hay que tenerlosiempre muy presente al programar utilizando clases y objetos En alguna ocasioacutenpuede que estemos tentados a mezclar parte de una clase con otra clase distintapara resolver un problema puntual No hay que caer en esa trampa Se deben escribirlos programas de forma que cada cosa esteacute en su sitio Sobre todo al principiocuando definimos nuestras primeras clases debemos estar pendientes de que todoestaacute definido donde correspondeLa ocultacioacuten es una teacutecnica que incorporan algunos lenguajes (entre ellos Java) quepermite esconder los elementos que definen una clase de tal forma que desde otraclase distinta no se pueden ldquover las tripasrdquo de la primera La ocultacioacuten facilita comoveremos maacutes adelante el encapsulamiento

93 Meacutetodos

Un coche arranca para se aparca hace sonar el claxon se puede llevar a repararhellipUn gato puede comer dormir maullar ronronearhellipLas acciones asociadas a una clase se llaman meacutetodos Estos meacutetodos se definendentro del cuerpo de la clase y se suelen colocar a continuacioacuten de los atributos

Los meacutetodos determinan el comportamiento de los objetos

931 Creiacute haber visto un lindo gatito

Vamos a crear la clase GatoSimple La llamamos asiacute porque maacutes adelante crearemos otraclase algo maacutes elaborada que se llamaraacute Gato Para saber queacute atributos debe tener estaclase hay que preguntarse queacute caracteriacutesticas tienen los gatos Todos los gatos son deun color determinado pertenecen a una raza tienen una edad tienen un determinadosexo - son machos o hembras - y tienen un peso que se puede expresar en kilogramosEacutestos seraacuten por tanto los atributos que tendraacute la clase GatoSimplePara saber queacute metodos debemos implementar hay que preguntarse queacute accionesestaacuten asociadas a los gatos Bien pues los gatos maullan ronronean comen y si sonmachos se pelean entre ellos para disputarse el favor de las hembras Esos seraacuten losmeacutetodos que definamos en la clase

Programacioacuten orientada a objetos 98

GatoSimplejava Definicioacuten de la clase GatoSimple author Luis Joseacute Saacutenchez

public class GatoSimple

atributos

String color raza sexo

int edad

double peso

meacutetodos

constructorGatoSimple (String s)

thissexo = s

getterString getSexo()

return thissexo

Hace que el gato maulle

void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute

Programacioacuten orientada a objetos 99

param comida la comida que se le ofrece al gato

void come(String comida)

if (comidaequals(pescado))

Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Pone a pelear dos gatos Solo se van a pelear dos machos entre siacute param contrincante es el gato contra el que pelear

void peleaCon(GatoSimple contrincante)

if (thissexoequals(hembra))

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo()equals(hembra))

Systemoutprintln(no peleo contra gatitas)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

ConstructorEl meacutetodo constructor tiene siempre el mismo nombre que la clase y se utilizanormalmente para inicializar los atributos

Los atributos de la clase GatoSimple - color raza sexo edad y peso - se declaran igual quelas variables que hemos venido usando hasta ahora pero hay una gran diferenciaentre estos atributos y las variables que aparecen en el main (programa principal) Unavariable definida en el cuerpo del programa principal es uacutenica sin embargo cada unode los objetos que se crean en el programa principal tienen sus propios atributos esdecir si en el programa principal se crean 20 objetos de la clase GatoSimple cada unotiene sus valores para los atributos color raza etcFiacutejate en la cabecera del meacutetodo peleaCon

Programacioacuten orientada a objetos 100

void peleaCon(GatoSimple contrincante)

Como puedes comprobar es posible pasar un objeto como paraacutemetro A continuacioacutense muestra un programa que prueba la clase GatoSimple Te recomiendo seguir elprograma liacutenea a liacutenea y observar atentamente la salida que produce

PruebaGatoSimplejava Programa que prueba la clase GatoSimple author Luis Joseacute Saacutenchez

public class PruebaGatoSimple

public static void main(String[] args)

GatoSimple garfield = new GatoSimple(macho)

Systemoutprintln(hola gatito)

garfieldmaulla()

Systemoutprintln(toma tarta)

garfieldcome(tarta selva negra)

Systemoutprintln(toma pescado a ver si esto te gusta)

garfieldcome(pescado)

GatoSimple tom = new GatoSimple(macho)

Systemoutprintln(Tom toma sopita de verduras)

tomcome(sopa de verduras)

GatoSimple lisa = new GatoSimple(hembra)

Systemoutprintln(gatitos a ver coacutemo maullaacuteis)

garfieldmaulla()

tommaulla()

lisamaulla()

garfieldpeleaCon(lisa)

lisapeleaCon(tom)

tompeleaCon(garfield)

Observa coacutemo al crear una instancia se llama al constructor que como deciacuteamos antestiene el mismo nombre de la clase y sirve para inicializar los atributos En este casose inicializa el atributo sexo Maacutes adelante veremos constructores que inicializan variosatributos e incluso definiremos distintos constructores en la misma clase

Programacioacuten orientada a objetos 101

GatoSimple garfield = new GatoSimple(macho)

Como puedes ver hay meacutetodos que no toman ninguacuten paraacutemetro

garfieldmaulla()

Y hay otros meacutetodos que deben tomar paraacutemetros obligatoriamente

garfieldcome(tarta selva negra)

932 Meacutetodos getter y setter

Vamos a crear la clase Cubo Para saber queacute atributos se deben definir nos preguntamosqueacute caracteriacutesticas tienen los cubos - igual que hicimos con la clase GatoSimple Todos loscubos tienen una determinada capacidad un color estaacuten hechos de un determinadomaterial - plaacutestico latoacuten etc - y puede que tengan asa o puede que no Un cubo sefabrica con el propoacutesito de contener liacutequido por tanto otra caracteriacutestica es la cantidadde litros de liacutequido que contiene en un momento determinado Por ahora solo nosinteresa saber la capacidad maacutexima y los litros que contiene el cubo en cada momentoasiacute que esos seraacuten los atributos que tendremos en cuenta

Cubojava Definicioacuten de la clase Cubo author Luis Joseacute Saacutenchez

public class Cubo

atributos

int capacidad capacidad maacutexima en litrosint contenido contenido actual en litros

meacutetodos

constructorCubo (int c)

thiscapacidad = c

meacutetodos getterint getCapacidad()

return thiscapacidad

Programacioacuten orientada a objetos 102

int getContenido()

return thiscontenido

meacutetodo settervoid setContenido(int litros)

thiscontenido = litros

otros meacutetodosvoid vacia()

thiscontenido = 0

Llena el cubo al maacuteximo de su capacidad

void llena()

thiscontenido = thiscapacidad

Pinta el cubo en la pantalla Se muestran los bordes del cubo con el caraacutecter y el agua que contiene con el caraacutecter ~

void pinta()

for (int nivel = thiscapacidad nivel gt 0 nivel--)

if (thiscontenido gt= nivel)

Systemoutprintln(~~~~)

else

Systemoutprintln( )

Systemoutprintln()

Vuelca el contenido de un cubo sobre otro Antes de echar el agua se comprueba cuaacutento le cabe al cubo destino

void vuelcaEn(Cubo destino)

Programacioacuten orientada a objetos 103

int libres = destinogetCapacidad() - destinogetContenido()

if (libres gt 0)

if (thiscontenido lt= libres)

destinosetContenido(destinogetContenido() + thiscontenido)thisvacia()

else

thiscontenido -= libres

destinollena()

Observa estos meacutetodos extraiacutedos de la clase Cubo

int getCapacidad()

return thiscapacidad

int getContenido()

return thiscontenido

Se trata de meacutetodos muy simples su cometido es devolver el valor de un atributoPodriacutean tener cualquier nombre pero en Java es costumbre llamarlos con la palabraget (obtener) seguida del nombre del atributoFijeacutemonos ahora este otro meacutetodo

void setContenido(int litros)

thiscontenido = litros

Ahora estamos ante un setter Este tipo de meacutetodos tiene el cometido de establecerun valor para un determinado atributo Como puedes ver setContenido estaacute formadapor set (asignar) maacutes el nombre del atributoPodriacuteas preguntarte iquestpor queacute se crea un meacutetodo getter para extraer el valor de unavariable y no se accede a la variable directamenteParece maacutes loacutegico hacer esto

Systemoutprint(miCubocapacidad)

que esto otro

Programacioacuten orientada a objetos 104

Systemoutprint(miCubogetCapacidad())

Sin embargo en Java se opta casi siempre por esta uacuteltima opcioacuten Tiene su explicacioacuteny lo entenderaacutes bien cuando estudies el apartado Aacutembitovisibilidad de los elementosde una clase - public protected y privateProbamos con el siguiente ejemplo la clase Cubo que acabamos de definir Crea tuspropios cubos pasa agua de unos a otros y observa lo que se muestra por pantalla

PruebaCubojava Programa que prueba la clase Cubo author Luis Joseacute Saacutenchez

public class PruebaCubo

public static void main(String[] args)

Cubo cubito = new Cubo(2)

Cubo cubote = new Cubo(7)

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

Systemoutprintln(nLleno el cubito n)

cubitollena()

cubitopinta()

Systemoutprintln(nEl cubote sigue vaciacuteo n)

cubotepinta()

Systemoutprintln(nAhora vuelco lo que tiene el cubito en el cuboten)

cubitovuelcaEn(cubote)

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

Systemoutprintln(nAhora vuelco lo que tiene el cubote en el cubiton)

cubotevuelcaEn(cubito)

Programacioacuten orientada a objetos 105

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

933 Meacutetodo toString

La definicioacuten de la clase Cubo del apartado anterior contiene el meacutetodo pinta que comosu nombre indica permite pintar en pantalla un objeto de esa clase Se podriacutea definirel meacutetodo ficha para mostrar informacioacuten sobre objetos de la clase Alumno por ejemploTambieacuten seriacutea posible implementar el meacutetodo imprime dentro de la clase Libro con elpropoacutesito de mostrar por pantalla los datos de un libro Todos estos meacutetodos - pintaficha e imprime - hacen baacutesicamente lo mismoEn Java existe una solucioacuten muy elegante para mostrar informacioacuten sobre un objetopor pantalla Si se quiere mostrar el contenido de la variable entera x se utilizaSystemoutprint(x) y si se quiere mostrar el valor de la variable de tipo cadena decaracteres nombre se escribe Systemoutprint(nombre) De la misma manera si se quieremostrar el objeto miPiramide que pertenece a la clase Piramide tambieacuten se podriacutea usarSystemoutprint(miPiramide) Java sabe perfectamente coacutemo mostrar nuacutemeros y cadenasde caracteres pero no sabe a priori coacutemo se pintan piraacutemides Para indicar a Java coacutemodebe pintar un objeto de la clase Piramide basta con implementar el meacutetodo toString

dentro de la claseVeamos un ejemplo muy sencillo de implementacioacuten de toString Definiremos la claseCuadrado con el atributo lado el constructor y el meacutetodo toString

Cuadradojava Definicioacuten de la clase Cuadrado author Luis Joseacute Saacutenchez

public class Cuadrado

int lado

public Cuadrado(int l)

thislado = l

public String toString()

Programacioacuten orientada a objetos 106

int i espacios

String resultado =

for (i = 0 i lt thislado i++)

resultado +=

resultado += n

for (i = 1 i lt thislado - 1 i++)

resultado +=

for (espacios = 1 espacios lt thislado - 1 espacios++)

resultado +=

resultado += n

for (i = 0 i lt thislado i++)

resultado +=

resultado += n

return resultado

Observa que el meacutetodo toString() devuelve una cadena de caracteres Esa cadena esprecisamente la que mostraraacute por pantalla Systemoutprint() En el programa que semuestra a continuacioacuten y que prueba la clase Cuadrado puedes comprobar que se pintaun cuadrado igual que si se tratara de cualquier otra variable

PruebaCuadradojava Programa que prueba la clase Cuadrado author Luis Joseacute Saacutenchez

public class PruebaCuadrado

public static void main(String[] args)

Cuadrado miCuadradito = new Cuadrado(5)

Systemoutprintln(miCuadradito)

Programacioacuten orientada a objetos 107

94 Aacutembitovisibilidad de los elementos de una clase - publicprotected y private

Al definir los elementos de una clase se pueden especificar sus aacutembitos (scope) devisibilidad o accesibilidad Un elemento public (puacuteblico) es visible desde cualquierclase un elemento protected (protegido) es visible desde la clase actual y desde todassus subclases y finalmente un elemento private (privado) uacutenicamente es visible dentrode la clase actualEn el siguiente apartado veremos queacute son las subclases De momento fiacutejate en elaacutembito del atributo y de los meacutetodos en la definicioacuten de la clase Animal

Animaljava Definicioacuten de la clase Animal author Luis Joseacute Saacutenchez

public abstract class Animal

private Sexo sexo

public Animal ()

sexo = SexoMACHO

public Animal (Sexo s)

sexo = s

public Sexo getSexo()

return sexo

public String toString()

return Sexo + thissexo + n

Hace que el animal se eche a dormir

public void duerme()

Systemoutprintln(Zzzzzzz)

Programacioacuten orientada a objetos 108

Fiacutejate que el atributo sexo se ha definido como private

private Sexo sexo

Eso quiere decir que a ese atributo uacutenicamente se tiene acceso dentro de la claseAnimal Sin embargo todos los meacutetodos se han definido public lo que significa quese podraacuten utilizar desde cualquier otro programa por ejemplo como veremos maacutesadelante desde el programa PurebaAnimaljava

Salvo casos puntuales se seguiraacute la regla de declarar private las variables deinstancia y public los meacutetodos

El sexo de un animal solo puede ser macho hembra o hermafrodita Una forma dedelimitar los valores que puede tomar un atributo es definir un tipo enumerado

Tipo enumeradoMediante enum se puede definir un tipo enumerado de esta forma un atributosolo podraacute tener uno de los posibles valores que se dan como opcioacuten Losvalores que se especifican en el tipo enumerado se suelen escribir con todaslas letras en mayuacutescula

Sexojava Definicioacuten del tipo enumerado Sexo author Luis Joseacute Saacutenchez

public enum Sexo

MACHO HEMBRA HERMAFRODITA

95 Herencia

La herencia es una de las caracteriacutesticas maacutes importantes de la POO Si definimosuna serie de atributos y meacutetodos para una clase al crear una subclase todos estosatributos y meacutetodos siguen siendo vaacutelidosEn el apartado anterior se define la clase Animal Uno de los meacutetodos de esta clase esduerme A continuacioacuten podemos crear las clases Gato y Perro como subclases de AnimalDe forma automaacutetica se puede utilizar el meacutetodo duerme con las instancias de las clasesGato y Perro iquestno es fantaacutestico

Programacioacuten orientada a objetos 109

La clase Ave es subclase de Animal y la clase Pinguino a su vez seriacutea subclase de Ave ypor tanto hereda todos sus atributos y meacutetodos

Clase abstracta (abstract)Una clase abstracta es aquella que no va a tener instancias de forma directaaunque siacute habraacute instancias de las subclases (siempre que esas subclasesno sean tambieacuten abstractas) Por ejemplo si se define la clase Animal comoabstracta no se podraacuten crear objetos de la clase Animal es decir no se podraacutehacer Animal mascota = new Animal() pero siacute se podraacuten crear instancias de la claseGato Ave o Pinguino que son subclases de Animal

Para crear en Java una subclase de otra clase existente se utiliza la palabra reservadaextends A continuacioacuten se muestra el coacutedigo de las clases Gato Ave y Pinguino asiacutecomo el programa que prueba estas clases creando instancias y aplicaacutendoles meacutetodosRecuerda que la definicioacuten de la clase Animal se muestra en el apartado anterior

Gatojava Definicioacuten de la clase Gato author Luis Joseacute Saacutenchez

public class Gato extends Animal

private String raza

public Gato (Sexo s String r)

super(s)raza = r

public Gato (Sexo s)

super(s)raza = siameacutes

public Gato (String r)

super(SexoHEMBRA)raza = r

public Gato ()

super(SexoHEMBRA)

Programacioacuten orientada a objetos 110

raza = siameacutes

public String toString()

return supertoString()+ Raza + thisraza+ nn

Hace que el gato maulle

public void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

public void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al gato

public void come(String comida)

if (comidaequals(pescado))

Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Pone a pelear dos gatos Solo se van a pelear dos machos entre siacute param contrincante es el gato contra el que pelear

public void peleaCon(Gato contrincante)

Programacioacuten orientada a objetos 111

if (thisgetSexo() == SexoHEMBRA)

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo() == SexoHEMBRA)

Systemoutprintln(no peleo contra gatitas)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

Observa que se definen nada menos que cuatro constructores en la clase Gato Desdeel programa principal se dilucida cuaacutel de ellos se utiliza en funcioacuten del nuacutemero y tipode paraacutemetros que se pasa al meacutetodo Por ejemplo si desde el programa principal secrea un gato de esta forma

Gato gati = new Gato()

entonces se llamariacutea al constructor definido como

public Gato ()

super(SexoHEMBRA)raza = siameacutes

Por tanto gati seriacutea una gata de raza siameacutes Si por el contrario creamos gati de estaotra manera desde el programa principal

Gato gati = new Gato(SexoMACHO siberiano)

se llamariacutea al siguiente constructor

public Gato (Sexo s String r)

super(s)raza = r

y gati seriacutea en este caso un gato macho de raza siberianoEl meacutetodo super() hace una llamada al meacutetodo equivalente de la superclase Fiacutejate quese utiliza tanto en el constructor como en el meacutetodo toString() Por ejemplo al llamara super() dentro del meacutetodo toString() se estaacute llamando al toString() que hay definidoen la clase Animal justo un nivel por encima de Gato en la jerarquiacutea de clasesA continuacioacuten tenemos la definicioacuten de la clase Ave que es una subclase de Animal

Programacioacuten orientada a objetos 112

Avejava Definicioacuten de la clase Ave author Luis Joseacute Saacutenchez

public class Ave extends Animal

public Ave(Sexo s)

super(s)

public Ave()

super()

Hace que el ave se limpie

public void aseate()

Systemoutprintln(Me estoy limpiando las plumas)

Hace que el ave levante el vuelo

public void vuela()

Systemoutprintln(Estoy volando)

951 Sobrecarga de meacutetodos

Un meacutetodo se puede redefinir (volver a definir con el mismo nombre) en una subclasePor ejemplo el meacutetodo vuela que estaacute definido en la clase Ave se vuelve a definir enla clase Pinguino En estos casos indicaremos nuestra intencioacuten de sobreescribir unmeacutetodo mediante la etiqueta OverrideSi no escribimos esta etiqueta la sobreescritura del meacutetodo se realizaraacute de todasformas ya que Override indica simplemente una intencioacuten Ahora imagina que quieressobreescribir el meacutetodo come de Animal declarando un come especiacutefico para los gatos enla clase Gato Si escribes Override y luego te equivocas en el nombre del meacutetodo yescribes comer entonces el compilador diriacutea algo como ldquoiexclCuidado algo no estaacute bienme has dicho que ibas a sobreescribir un meacutetodo de la superclase y sin embargo comer

no estaacute definidordquoA continuacioacuten tienes la definicioacuten de la clase Pinguino

Programacioacuten orientada a objetos 113

Pinguinojava Definicioacuten de la clase Pinguino author Luis Joseacute Saacutenchez

public class Pinguino extends Ave

public Pinguino()

super()

public Pinguino(Sexo s)

super(s)

El pinguumlino se siente triste porque no puede volar

Override

public void vuela()

Systemoutprintln(No puedo volar)

Con el siguiente programa se prueba la clase Animal y todas las subclases que derivande ella Observa cada liacutenea y comprueba queacute hace el programa

PruebaAnimaljava Programa que prueba la clase Animal y sus subclases author Luis Joseacute Saacutenchez

public class PruebaAnimal

public static void main(String[] args)

Gato garfield = new Gato(SexoMACHO romano)

Gato tom = new Gato(SexoMACHO)

Gato lisa = new Gato(SexoHEMBRA)

Gato silvestre = new Gato()

Systemoutprintln(garfield)

Systemoutprintln(tom)

Systemoutprintln(lisa)

Programacioacuten orientada a objetos 114

Systemoutprintln(silvestre)

Ave miLoro = new Ave()

miLoroaseate()

miLorovuela()

Pinguino pingu = new Pinguino(SexoHEMBRA)

pinguaseate()

pinguvuela()

En el ejemplo anterior los objetos miLoro y pingu actuacutean de manera polimoacuterfica porquea ambos se les aplican los meacutetodos aseate y vuela

PolimorfismoEn Programacioacuten Orientada a Objetos se llama polimorfismo a la capacidadque tienen los objetos de distinto tipo (de distintas clases) de responder almismo meacutetodo

96 Atributos y meacutetodos de clase (static)

Hasta el momento hemos definido atributos de instancia como raza sexo o color ymeacutetodos de instancia como maulla come o vuela De tal modo que si en el programa secrean 20 gatos cada uno de ellos tiene su propia raza y puede haber potencialmente20 razas diferentes Tambieacuten podriacutea aplicar el meacutetodo maulla a todos y cada uno deesos 20 gatosNo obstante en determinadas ocasiones nos puede interesar tener atributos de clase(variables de clase) y meacutetodos de clase Cuando se define una variable de clase soloexiste una copia del atributo para toda la clase y no una para cada objeto Esto es uacutetilcuando se quiere llevar la cuenta global de alguacuten paraacutemetro Los meacutetodos de clase seaplican a la clase y no a instancias concretasA continuacioacuten se muestra un ejemplo que contiene la variable de clase kilometra-

jeTotal Si bien cada coche tiene un atributo kilometraje donde se van acumulando loskiloacutemetros que va recorriendo en la variable de clase kilometrajeTotal se lleva la cuentade los kiloacutemetros que han recorrido todos los coches que se han creadoTambieacuten se crea un meacutetodo de clase llamado getKilometrajeTotal que simplemente esun getter para la variable de clase kilometrajeTotal

Programacioacuten orientada a objetos 115

Cochejava Definicioacuten de la clase Coche author Luis Joseacute Saacutenchez

public class Coche

atributo de claseprivate static int kilometrajeTotal = 0

meacutetodo de clasepublic static int getKilometrajeTotal()

return kilometrajeTotal

private String marca

private String modelo

private int kilometraje

public Coche(String ma String mo)

marca = ma

modelo = mo

kilometraje = 0

public int getKilometraje()

return kilometraje

Recorre una determinada distancia param km distancia a recorrer en kiloacutemetros

public void recorre(int km)

kilometraje += km

kilometrajeTotal += km

Como ya hemos comentado el atributo kilometrajeTotal almacena el nuacutemero total dekiloacutemetros que recorren todos los objetos de la clase Coche es un uacutenico valor por esose declara como static Por el contrario el atributo kilometraje almacena los kiloacutemetrosrecorridos por un objeto concreto y tendraacute un valor distinto para cada uno de ellos

Programacioacuten orientada a objetos 116

Si en el programa principal se crean 20 objetos de la clase Coche cada uno tendraacute supropio kilometrajeA continuacioacuten se muestra el programa que prueba la clase Coche

PruebaCochejava Programa que prueba la clase Coche author Luis Joseacute Saacutenchez

public class PruebaCoche

public static void main(String[] args)

Coche cocheDeLuis = new Coche(Saab 93)

Coche cocheDeJuan = new Coche(Toyota Avensis)

cocheDeLuisrecorre(30)

cocheDeLuisrecorre(40)

cocheDeLuisrecorre(220)

cocheDeJuanrecorre(60)

cocheDeJuanrecorre(150)

cocheDeJuanrecorre(90)

Systemoutprintln(El coche de Luis ha recorrido + cocheDeLuisgetKilometraje() +

Km)

Systemoutprintln(El coche de Juan ha recorrido + cocheDeJuangetKilometraje() +

Km)

Systemoutprintln(El kilometraje total ha sido de + CochegetKilometrajeTotal() +

Km)

El meacutetodo getKilometrajeTotal() se aplica a la clase Coche por tratarse de un meacutetodo declase (meacutetodo static) Este meacutetodo no se podriacutea aplicar a una instancia de la mismamanera que un meacutetodo que no sea static no se puede aplicar a la clase sino a losobjetos

97 Interfaces

Una interfaz contiene uacutenicamente la cabecera de una serie de meacutetodos (opcional-mente tambieacuten puede contener constantes) Por tanto se encarga de especificar uncomportamiento que luego tendraacute que ser implementado La interfaz no especificael ldquocoacutemordquo ya que no contiene el cuerpo de los meacutetodos solo el ldquoqueacuterdquoUna interfaz puede ser uacutetil en determinadas circunstancias En principio separala definicioacuten de la implementacioacuten o como deciacuteamos antes el ldquoqueacuterdquo del ldquocoacutemordquo

Programacioacuten orientada a objetos 117

Tendremos entonces la menos dos ficheros la interfaz y la clase que implementaesa interfaz Se puede dar el caso que un programador escriba la interfaz y luegose la pase a otro programador para que sea eacuteste uacuteltimo quien la implementeHay que destacar que cada interfaz puede tener varias implementaciones asociadasPara ilustrar el uso de interfaces utilizaremos algunas clases ya conocidas La super-clase que va a estar por encima de todas las demaacutes seraacute la clase Animal vista conanterioridad El coacutedigo de esta clase no variacutea por lo tanto no lo vamos a reproduciraquiacute de nuevoDefinimos la interfaz Mascota

Mascotajava Definicioacuten de la interfaz Mascota author Luis Joseacute Saacutenchez

public interface Mascota

String getCodigo()

void hazRuido()

void come(String comida)

void peleaCon(Animal contrincante)

Como puedes ver uacutenicamente se escriben las cabeceras de los meacutetodos que debetener las clases que implementen la interfaz MascotaUna de las implementaciones de Mascota seraacute Gato

Gatojava Definicioacuten de la clase Gato author Luis Joseacute Saacutenchez

public class Gato extends Animal implements Mascota

private String codigo

public Gato (Sexo s String c)

super(s)thiscodigo = c

Override

Programacioacuten orientada a objetos 118

public String getCodigo()

return thiscodigo

Hace que el gato emita sonidos

Override

public void hazRuido()

thismaulla()thisronronea()

Hace que el gato maulle

public void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

public void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al gato

Override

public void come(String comida)

if (comidaequals(pescado))

supercome()Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Programacioacuten orientada a objetos 119

Pone a pelear al gato contra otro animal Solo se van a pelear dos machos entre siacute param contrincante es el animal contra el que pelear

Override

public void peleaCon(Animal contrincante)

if (thisgetSexo() == SexoHEMBRA)

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo() == SexoHEMBRA)

Systemoutprintln(no peleo contra hembras)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

Mediante la siguiente liacutenea

public class Gato extends Animal implements Mascota

estamos diciendo que Gato es una subclase de Animal y que ademaacutes es una im-plementacioacuten de la interfaz Mascota Fiacutejate que no es lo mismo la herencia que laimplementacioacutenObserva que los meacutetodos que se indicaban en Mascota uacutenicamente con la cabeceraahora estaacuten implementados completamente en Gato Ademaacutes Gato contiene otrosmeacutetodos que no se indicaban en Mascota como maulla y ronroneaLos meacutetodos de Gato que implementan meacutetodos especificados en Mascota deben tenerla anotacioacuten OverrideComo dijimos anteriormente una interfaz puede tener varias implementaciones Acontinuacioacuten se muestra Perro otra implementacioacuten de Mascota

Programacioacuten orientada a objetos 120

Perrojava Definicioacuten de la clase Perro author Luis Joseacute Saacutenchez

public class Perro extends Animal implements Mascota

private String codigo

public Perro (Sexo s String c)

super(s)thiscodigo = c

Override

public String getCodigo()

return thiscodigo

Hace que el Perro emita sonidos

Override

public void hazRuido()

thisladra()

Hace que el Perro ladre

public void ladra()

Systemoutprintln(Guau guau)

Hace que el Perro coma A los Perros les gusta la carne si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al Perro

Override

public void come(String comida)

if (comidaequals(carne))

Programacioacuten orientada a objetos 121

supercome()Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como carne)

Pone a pelear el perro contra otro animal Solo se van a pelear si los dos son perros param contrincante es el animal contra el que pelear

Override

public void peleaCon(Animal contrincante)

if (contrincantegetClass()getSimpleName()equals(Perro))

Systemoutprintln(ven aquiacute que te vas a enterar)

else

Systemoutprintln(no me gusta pelear)

Por uacuteltimo mostramos el programa que prueba Mascota y sus implementaciones Gato yPerro

PruebaMascotajava Programa que prueba la interfaz Mascota author Luis Joseacute Saacutenchez

public class PruebaMascota

public static void main(String[] args)

Mascota garfield = new Gato(SexoMACHO 34569)

Mascota lisa = new Gato(SexoHEMBRA 96059)

Mascota kuki = new Perro(SexoHEMBRA 234678)

Mascota ayo = new Perro(SexoMACHO 778950)

Systemoutprintln(garfieldgetCodigo())

Systemoutprintln(lisagetCodigo())

Systemoutprintln(kukigetCodigo())

Systemoutprintln(ayogetCodigo())

garfieldcome(pescado)

Programacioacuten orientada a objetos 122

lisacome(hamburguesa)

kukicome(pescado)

lisapeleaCon((Gato)garfield)

ayopeleaCon((Perro)kuki)

Observa que para crear una mascota que es un gato escribimos lo siguiente

Mascota garfield = new Gato(SexoMACHO 34569)

Una interfaz no se puede instanciar por tanto la siguiente liacutenea seriacutea incorrecta

Mascota garfield = new Mascota(SexoMACHO 34569)

InterfacesLa interfaz indica ldquoqueacuterdquo hay que hacer y la implementacioacuten especifica ldquocoacutemordquose haceUna interfaz puede tener varias implementacionesUna interfaz no se puede instanciarLa implementacioacuten puede contener meacutetodos adicionales cuyas cabeceras noestaacuten en su interfaz

98 Arrays de objetos

Del mismo modo que se pueden crear arrays de nuacutemeros enteros decimales o cadenasde caracteres tambieacuten es posible crear arrays de objetosVamos a definir la clase Alumnopara luego crear un array de objetos de esta clase

Alumnojava Definicioacuten de la clase Alumno author Luis Joseacute Saacutenchez

public class Alumno

private String nombre

private double notaMedia = 00

public String getNombre()

Programacioacuten orientada a objetos 123

return nombre

public void setNombre(String nombre)

thisnombre = nombre

public double getNotaMedia()

return notaMedia

public void setNotaMedia(double notaMedia)

thisnotaMedia = notaMedia

A continuacioacuten se define un array de cinco alumnos que posteriormente se rellena Poruacuteltimo se muestran los datos de los alumnos por pantallaObserva que la siguiente liacutenea uacutenicamente define la estructura del array pero no crealos objetos

Alumno[] alum = new Alumno[5]

Cada objeto concreto se crea de forma individual mediante

alum[i] = new Alumno()

Aquiacute tienes el ejemplo completo

ArrayDeAlumnosPrincipaljava Programa que prueba un array de la clase Alumno author Luis Joseacute Saacutenchez

public class ArrayDeAlumnosPrincipal

public static void main(String[] args)

Define la estructura un array de 5 alumnos pero no crea los objetosAlumno[] alum = new Alumno[5]

Pide los datos de los alumnos

Programacioacuten orientada a objetos 124

Systemoutprintln(A continuacion debera introducir el nombre y la nota media de 5 al

umnos)

String nombreIntroducido

double notaIntroducida

for(int i = 0 i lt 5 i++)

alum[i] = new Alumno()

Systemoutprintln(Alumno + i)

Systemoutprint(Nombre )

nombreIntroducido = Systemconsole()readLine()

(alum[i])setNombre(nombreIntroducido)

Systemoutprint(Nota media )

notaIntroducida = DoubleparseDouble(Systemconsole()readLine())

alum[i]setNotaMedia(notaIntroducida)

for i

Muestra los datos de los alumnos

Systemoutprintln(Los datos introducidos son los siguientes)

double sumaDeMedias = 0

for(int i = 0 i lt 5 i++)

Systemoutprintln(Alumno + i)

Systemoutprintln(Nombre + alum[i]getNombre())

Systemoutprintln(Nota media + alum[i]getNotaMedia())

Systemoutprintln(----------------------------)

sumaDeMedias += alum[i]getNotaMedia()

for i

Systemoutprintln(La media global de la clase es + sumaDeMedias 5)

Veamos ahora un ejemplo algo maacutes complejo Se trata de una gestioacuten tiacutepica - altabaja listado y modificacioacuten - de una coleccioacuten de discos Este tipo de programas sesuele denominar CRUD (Create Read Update Delete)Primero se define la clase Disco

Programacioacuten orientada a objetos 125

Discojava Definicioacuten de la clase Disco author Luis Joseacute Saacutenchez

public class Disco

private String codigo = LIBRE

private String autor

private String titulo

private String genero

private int duracion duracioacuten total en minutos

public String getCodigo()

return codigo

public void setCodigo(String codigo)

thiscodigo = codigo

public String getAutor()

return autor

public void setAutor(String autor)

thisautor = autor

public String getGenero()

return genero

public void setGenero(String genero)

thisgenero = genero

public String getTitulo()

return titulo

public void setTitulo(String titulo)

thistitulo = titulo

Programacioacuten orientada a objetos 126

public int getDuracion()

return duracion

public void setDuracion(int duracion)

thisduracion = duracion

public String toString()

String cadena = n------------------------------------------

cadena += nCoacutedigo + thiscodigocadena += nAutor + thisautorcadena += nTiacutetulo + thistitulocadena += nGeacutenero + thisgenerocadena += nDuracioacuten + thisduracioncadena += n------------------------------------------

return cadena

A continuacioacuten se crea el programa principal Cada elemento de la coleccioacuten seraacuteun objeto de la clase Disco Se trata como veraacutes de una gestioacuten muy simple perototalmente funcionalNo se incluye en el manual porque ocupariacutea varias paacuteginas El coacutedigo del programa sepuede descargar desde el siguiente enlace httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos09_POOColeccionDeDiscosColeccionDeDiscosPrincipaljava

Programacioacuten orientada a objetos 127

99 Ejercicios

991 Conceptos de POO

Ejercicio 1iquestCuaacuteles seriacutean los atributos de la clase PilotoDeFormula1 iquestSe te ocurren algunasinstancias de esta clase

Ejercicio 2A continuacioacuten tienes una lista en la que estaacuten mezcladas varias clases coninstancias de esas clases Para ponerlo un poco maacutes difiacutecil todos los elementosestaacuten escritos en minuacutescula Di cuaacuteles son las clases cuaacuteles las instanciasa queacute clase pertenece cada una de estas instancias y cuaacutel es la jerarquiacuteaentre las clases paula goofy gardfiel perro mineral caballo tom silvestrepirita rocinante milu snoopy gato pluto animal javier bucefalo pegasoayudante_de_santa_claus cuarzo laika persona pato_lucas

Ejercicio 3iquestCuaacuteles seriacutean los atributos de la clase Vivienda iquestQueacute subclases se te ocurren

Ejercicio 4Piensa en la liga de baloncesto iquestqueacute 5 clases se te ocurren para representar5 elementos distintos que intervengan en la liga

Ejercicio 5Haz una lista con los atributos que podriacutea tener la clase caballo A continuacioacutenhaz una lista con los posibles meacutetodos (acciones asociadas a los caballos)

Ejercicio 6Lista los atributos de la clase Alumno iquestSeriacutea nombre uno de los atributos de laclase Razona tu respuesta

Ejercicio 7iquestCuaacuteles seriacutean los atributos de la clase Ventana (de ordenador) iquestcuaacuteles seriacuteanlos meacutetodos Piensa en las propiedades y en el comportamiento de unaventana de cualquier programa

Programacioacuten orientada a objetos 128

992 POO en Java

Ejercicio 1Implementa la clase Caballo vista en un ejercicio anterior Prueacutebala creandoinstancias y aplicaacutendole algunos meacutetodos

Ejercicio 2Crea la clase Vehiculo asiacute como las clases Bicicleta y Coche como subclases dela primera Para la clase Vehiculo crea los atributos de clase vehiculosCreadosykilometrosTotales asiacute como el atributo de instancia kilometrosRecorridos Creatambieacuten alguacuten meacutetodo especiacutefico para cada una de las subclases Prueba lasclases creadas mediante un programa con un menuacute como el que se muestraa continuacioacuten

VEHIacuteCULOS

=========

1 Anda con la bicicleta

2 Haz el caballito con la bicicleta

3 Anda con el coche

4 Quema rueda con el coche

5 Ver kilometraje de la bicicleta

6 Ver kilometraje del coche

7 Ver kilometraje total

8 Salir

Elige una opcioacuten (1-8)

Ejercicio 3Crea las clases Animal Mamifero Ave Gato Perro Canario Pinguino y Lagarto Creaal menos tres meacutetodos especiacuteficos de cada clase y redefne ellos meacutetodoscuando sea necesario Prueba las clases creadas en un programa en el que seinstancien objetos y se les apliquen meacutetodos

Ejercicio 4Crea la clase Fraccioacuten Los atributos seraacuten numerador y denominador Y algunos delos meacutetodos pueden ser invierte simplifica multiplica divide etc

Programacioacuten orientada a objetos 129

Ejercicio 5Crea la clase Pizza con los atributos y meacutetodos necesarios Sobre cada pizzase necesita saber el tamantildeo - mediana o familiar - el tipo - margarita cuatroquesos o funghi - y su estado - pedida o servida La clase debe almacenarinformacioacuten sobre el nuacutemero total de pizzas que se han pedido y que sehan servido Siempre que se crea una pizza nueva su estado es ldquopedidardquoEl siguiente coacutedigo del programa principal debe dar la salida que se muestra

public class PedidosPizza

public static void main(String[] args)

Pizza p1 = new Pizza(margarita mediana)

Pizza p2 = new Pizza(funghi familiar)

p2sirve()

Pizza p3 = new Pizza(cuatro quesos mediana)

Systemoutprintln(p1)

Systemoutprintln(p2)

Systemoutprintln(p3)

p2sirve()

Systemoutprintln(pedidas + PizzagetTotalPedidas())

Systemoutprintln(servidas + PizzagetTotalServidas())

pizza margarita mediana pedida

pizza funghi familiar servida

pizza cuatro quesos mediana pedida

esa pizza ya se ha servido

pedidas 3

servidas 1

Ejercicio 6Crea la clase Tiempo con los meacutetodos suma y resta Los objetos de la clase Tiempo

son intervalos de tiempo y se crean de la forma Tiempo t = new Tiempo(1 20

30) donde los paraacutemetros que se le pasan al constructor son las horas losminutos y los segundos respectivamente Crea el meacutetodo toString para ver losintervalos de tiempo de la forma 10h 35m 5s Si se suman por ejemplo 30m 40s y35m 20s el resultado deberiacutea ser 1h 6m 0s Realiza un programa de prueba paracomprobar que la clase funciona bien

Programacioacuten orientada a objetos 130

Ejercicio 7Queremos gestionar la venta de entradas (no numeradas) de ExpocochesCampanillas que tiene 3 zonas la sala principal con 1000 entradas dispo-nibles la zona de compra-venta con 200 entradas disponibles y la zona vipcon 25 entradas disponibles Hay que controlar que existen entradas antes devenderlasLa clase Zona con sus atributos y meacutetodos se muestra a continuacioacuten

Definicioacuten de la clase Zona author Luis Joseacute Saacutenchez

public class Zona

private int entradasPorVender

public Zona(int n)

entradasPorVender = n

public int getEntradasPorVender()

return entradasPorVender

Vende un nuacutemero de entradas ltpgt Comprueba si quedan entradas libres antes de realizar la venta param n nuacutemero de entradas a vender

public void vender(int n)

if (thisentradasPorVender == 0)

Systemoutprintln(Lo siento las entradas para esa zona estaacuten agotadas)

else if (thisentradasPorVender lt n)

Systemoutprintln(Soacutelo me quedan + thisentradasPorVender+ entradas para esa zona)

if (thisentradasPorVender gt= n)

entradasPorVender -= n

Systemoutprintln(Aquiacute tiene sus + n + entradas gracias)

El menuacute del programa debe ser el que se muestra a continuacioacuten Cuandoelegimos la opcioacuten 2 se nos debe preguntar para queacute zona queremos lasentradas y cuaacutentas queremos Loacutegicamente el programa debe controlar queno se puedan vender maacutes entradas de la cuenta

1 Mostrar nuacutemero de entradas libres

2 Vender entradas

3 Salir

Programacioacuten orientada a objetos 131

993 Arrays de objetos

Ejercicio 1Utiliza la clase Gato para crear un array de cuatro gatos e introduce los datosde cada uno de ellos mediante un bucle Muestra a continuacioacuten los datos detodos los gatos utilizando tambieacuten un bucle

Ejercicio 2Cambia el programa anterior de tal forma que los datos de los gatos se intro-duzcan directamente en el coacutedigo de la forma gatito[2]setColor(ldquomarroacutenrdquo) o bienmediante el constructor de la forma gatito[3] = new Gato(ldquoGarfieldrdquo ldquonaranjardquo

ldquomachordquo) Muestra a continuacioacuten los datos de todos los gatos utilizando unbucle

Ejercicio 3Realiza el programa ldquoColeccioacuten de discosrdquo por tu cuenta mirando lo menosposible el ejemplo que se proporciona Prueacutebalo primero para ver coacutemofunciona y luego intenta implementarlo tuacute mismo

Ejercicio 4Modifica el programa ldquoColeccioacuten de discosrdquo como se indica a continuacioacutena) Mejora la opcioacuten ldquoNuevo discordquo de tal forma que cuando se llenen todas lasposiciones del array el programa muestre un mensaje de error No se permitiraacuteintroducir los datos de ninguacuten disco hasta que no se borre alguno de la listab) Mejora la opcioacuten ldquoBorrarrdquo de tal forma que se verifique que el coacutedigointroducido por el usuario existec) Modifica el programa de tal forma que el coacutedigo del disco sea uacutenico es decirque no se pueda repetird) Crea un submenuacute dentro dentro de ldquoListadordquo de tal forma que exista unlistado completo un listado por autor (todos los discos que ha publicado undeterminado autor) un listado por geacutenero (todos los discos de un geacutenero de-terminado) y un listado de discos cuya duracioacuten esteacute en un rango determinadopor el usuario

Programacioacuten orientada a objetos 132

Ejercicio 5Crea el programa GESTISIMAL (GESTIoacuten SIMplificada de Almaceacuten) para llevarel control de los artiacuteculos de un almaceacuten De cada artiacuteculo se debe saberel coacutedigo la descripcioacuten el precio de compra el precio de venta y el stock(nuacutemero de unidades) El menuacute del programa debe tener al menos lassiguientes opciones

1 Listado

2 Alta

3 Baja

4 Modificacioacuten

5 Entrada de mercanciacutea

6 Salida de mercanciacutea

7 Salir

La entrada y salida de mercanciacutea supone respectivamente el incremento ydecremento de stock de un determinado artiacuteculo Hay que controlar que no sepueda sacar maacutes mercanciacutea de la que hay en el almaceacuten

10 Colecciones y diccionarios

101 Colecciones la clase ArrayList

Una coleccioacuten en Java es una estructura de datos que permite almacenar muchosvalores del mismo tipo por tanto conceptualmente es praacutecticamente igual que unarray Seguacuten el uso y seguacuten si se permiten o no repeticiones Java dispone de un ampliocataacutelogo de colecciones ArrayList (lista) ArrayBlockingQueue (cola) HashSet (conjunto)Stack (pila) etc En este manual estudiaremos la coleccioacuten ArrayListUn ArrayList es una estructura en forma de lista que permite almacenar elementos delmismo tipo (pueden ser incluso objetos) su tamantildeo va cambiando a medida que seantildeaden o se eliminan esos elementosNos podemos imaginar un ArrayList como un conjunto de celdas o cajoncitos donde seguardan los valores exactamente igual que un array convencional En la praacutectica seraacutemaacutes faacutecil trabajar con un ArrayListEn capiacutetulos anteriores hemos podido comprobar la utilidad del array es un recursoimprescindible que cualquier programador debe manejar con soltura No obstante elarray presenta algunos inconvenientes Uno de ellos es la necesidad de conocer eltamantildeo exacto en el momento de su creacioacuten Una coleccioacuten sin embargo se crea sinque se tenga que especificar el tamantildeo posteriormente se van antildeadiendo y quitandoelementos a medida que se necesitanTrabajando con arrays es frecuente cometer errores al utilizar los iacutendices por ejemploal intentar guardar un elemento en una posicioacuten que no existe (iacutendice fuera de rango)Aunque las colecciones permiten el uso de iacutendices no es necesario indicarlos siemprePor ejemplo en una coleccioacuten del tipo ArrayList cuando hay que antildeadir el elementoAmapola se puede hacer simplemente floresadd(Amapola) Al no especificar iacutendice elelemento Amapola se antildeadiriacutea justo al final de flores independientemente del tamantildeoy del nuacutemero de elementos que se hayan introducido yaLa clase ArrayList es muy similar a la clase Vector Eacutesta uacuteltima estaacute obsoleta y por tantono se recomienda su uso

1011 Principales meacutetodos de ArrayList

Las operaciones maacutes comunes que se pueden realizar con un objeto de la claseArrayList son las siguientes

add(elemento)Antildeade un elemento al final de la lista

133

Colecciones y diccionarios 134

add(indice elemento)Inserta un elemento en una posicioacuten determinada desplazando el resto deelementos hacia la derecha

clear()Elimina todos los elementos pero no borra la lista

contains(elemento)Devuelve true si la lista contiene el elemento que se especifica y false en casocontrario

get(indice)Devuelve el elemento de la posicioacuten que se indica entre pareacutentesis

indexOf(elemento)Devuelve la posicioacuten de la primera ocurrencia del elemento que se indica entrepareacutentesis

isEmpty()Devuelve true si la lista estaacute vaciacutea y false en caso de tener alguacuten elemento

remove(indice)Elimina el elemento que se encuentra en una posicioacuten determinada

remove(elemento)Elimina la primera ocurrencia de un elemento

set(indice elemento)Machaca el elemento que se encuentra en una determinada posicioacuten con elelemento que se pasa como paraacutemetro

size()Devuelve el tamantildeo (nuacutemero de elementos) de la lista

toArray()Devuelve un array con todos y cada uno de los elementos que contiene la lista

Puedes consultar todos los meacutetodos disponibles en la documentacioacuten oficial de la claseArrayList1

1httpdocsoraclecomjavase7docsapijavautilArrayListhtml

Colecciones y diccionarios 135

1012 Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de suselementos

A continuacioacuten se muestra un ejemplo en el que se puede ver coacutemo se declara unArrayList y coacutemo se insertan y se extraen elementos

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList01

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

Systemoutprintln(Nordm de elementos + asize())

aadd(rojo)

aadd(verde)

aadd(azul)

Systemoutprintln(Nordm de elementos + asize())

aadd(blanco)

Systemoutprintln(Nordm de elementos + asize())

Systemoutprintln(El elemento que hay en la posicioacuten 0 es + aget(0))

Systemoutprintln(El elemento que hay en la posicioacuten 3 es + aget(3))

Observa que al crear un objeto de la clase ArrayList hay que indicar el tipo de dato quese almacenaraacute en las celdas de esa lista Para ello se utilizan los caracteres lt y gt Nohay que olvidar los pareacutentesis del final

Es necesario importar la clase ArrayList para poder crear objetos de estaclase para ello debe aparecer al principio del programa la liacutenea import

javautilArrayList Algunos IDEs (por ej Netbeans) insertan esta liacutenea decoacutedigo de forma automaacutetica

En el siguiente ejemplo se muestra un ArrayList de nuacutemeros enteros

Colecciones y diccionarios 136

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList011

public static void main(String[] args)

ArrayListltIntegergt a = new ArrayListltIntegergt()

aadd(18)

aadd(22)

aadd(-30)

Systemoutprintln(Nordm de elementos + asize())

Systemoutprintln(El elemento que hay en la posicioacuten 1 es + aget(1))

Se define la estructura de la siguiente manera

ArrayListltIntegergt a = new ArrayListltIntegergt()

Fiacutejate que no se utiliza el tipo simple int sino el wrapper Integer Recuerda quelos wrapper son clases que engloban a los tipos simples y les antildeaden nuevasfuncionalidades (p ej permiten tratar a las variables numeacutericas como objetos) Elwrapper de int es Integer el de float es Float el de double es Double el de long es Longel de boolean es Boolean y el de char es CharacterEn el siguiente ejemplo podemos ver coacutemo extraer todos los elementos de una lista ala manera tradicional con un bulce for

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList02

Colecciones y diccionarios 137

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(int i=0 i lt asize() i++)

Systemoutprintln(aget(i))

Si estaacutes acostumbrado al for claacutesico habraacutes visto que es muy sencillo recorrer todoslos elementos del ArrayList No obstante al trabajar con colecciones es recomendableusar el for al estilo foreach como se muestra en el siguiente ejemplo Como puedes verla sintaxis es maacutes corta y no se necesita crear un iacutendice para recorrer la estructura

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList03

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(String color a)

Colecciones y diccionarios 138

Systemoutprintln(color)

Fiacutejate en estas liacuteneas

for(String color a)

Systemoutprintln(color)

El significado de este coacutedigo seriacutea el siguiente

for(String color a)

rarr Saca uno a uno todos los elementos de a y ve metieacutendolos en una variable de nombrecolor

Systemoutprintln(color)

rarr Muestra por pantalla el contenido de la variable colorVeamos ahora en otro ejemplo coacutemo eliminar elementos de un ArrayList Se utiliza elmeacutetodo remove() y se puede pasar como paraacutemetro el iacutendice del elemento que se quiereeliminar o bien el valor del elemento O sea aremove(2) elimina el elemento que seencuentra en la posicioacuten 2 de a mientras que aremove(blanco) elimina el valor blancoEs importante destacar que el ArrayList se reestructura de forma automaacutetica despueacutesdel borrado de cualquiera de sus elementos

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList04

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

Colecciones y diccionarios 139

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

aadd(blanco)

Systemoutprintln(Contenido de la lista )

for(String color a)

Systemoutprintln(color)

if (acontains(blanco))

Systemoutprintln(El blanco estaacute en la lista de colores)

aremove(blanco)

Systemoutprintln(Contenido de la lista despueacutes de quitar la +

primera ocurrencia del color blanco )

for(String color a)

Systemoutprintln(color)

aremove(2)

Systemoutprintln(Contenido de la lista despueacutes de quitar el +

elemento de la posicioacuten 2 )

for(String color a)

Systemoutprintln(color)

A continuacioacuten se muestra un ejemplo en el que se ldquomachacardquo una posicioacuten delArrayList Al hacer aset(2 turquesa) se borra lo que hubiera en la posicioacuten 2 y secoloca el valor turquesa Seriacutea equivalente a hacer a[2] = turquesa en caso de que a

fuese un array tradicional en lugar de un ArrayList

Colecciones y diccionarios 140

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList05

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido del vector )

for(String color a)

Systemoutprintln(color)

aset(2 turquesa)

Systemoutprintln(Contenido del vector despueacutes de machacar la posicioacuten 2 )

for(String color a)

Systemoutprintln(color)

El meacutetodo add permite antildeadir elementos a un ArrayList como ya hemos visto Porejemplo aadd(amarillo) antildeade el elemento amarillo al final de a Este meacutetodo sepuede utilizar tambieacuten con un iacutendice de la forma aadd(1 turquesa) En este caso loque se hace es insertar en la poscioacuten indicada Lo mejor de todo es que el ArrayList sereestructura de forma automaacutetica desplazando el resto de elementos

Colecciones y diccionarios 141

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList06

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(String color a)

Systemoutprintln(color)

aadd(1 turquesa)

Systemoutprintln(Contenido del vector despueacutes de insertar en la posicioacuten 1 )

for(String color a)

Systemoutprintln(color)

1013 ArrayList de objetos

Una coleccioacuten ArrayList puede contener objetos que son instancias de clases definidaspor el programador Esto es muy uacutetil sobre todo en aplicaciones de gestioacuten paraguardar datos de alumnos productos libros etcEn el siguiente ejemplo definimos una lista de gatos En cada celda de la lista sealmacenaraacute un objeto de la clase Gato

Colecciones y diccionarios 142

Uso de un ArrayList de objetos author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList07

public static void main(String[] args)

ArrayListltGatogt g = new ArrayListltGatogt()

gadd(new Gato(Garfield naranja mestizo))

gadd(new Gato(Pepe gris angora))

gadd(new Gato(Mauri blanco manx))

gadd(new Gato(Ulises marroacuten persa))

Systemoutprintln(nDatos de los gatosn)

for (Gato gatoAux g)

Systemoutprintln(gatoAux+n)

En el siguiente apartado se muestra la definicioacuten de la clase Gato

1014 Ordenacioacuten de un ArrayList

Los elementos de una lista se pueden ordenar con el meacutetodo sort El formato es elsiguiente

Collectionssort(lista)

Observa que sort es un meacutetodo de clase que estaacute definido en Collections Para poderutilizar este meacutetodo es necesario incluir la liacutenea

import javautilCollections

al principio del programa A continuacioacuten se muestra un ejemplo del uso de sort

Colecciones y diccionarios 143

Ordenacioacuten de un ArrayList author Luis Joseacute Saacutenchez

import javautilCollectionsimport javautilArrayList

public class EjemploArrayList071

public static void main(String[] args)

ArrayListltIntegergt a = new ArrayListltIntegergt()

aadd(67)

aadd(78)

aadd(10)

aadd(4)

Systemoutprintln(nNuacutemeros en el orden original)

for (int numero a)

Systemoutprintln(numero)

Collectionssort(a)

Systemoutprintln(nNuacutemeros ordenados)

for (int numero a)

Systemoutprintln(numero)

Tambieacuten es posible ordenar una lista de objetos En este caso es necesario indicar elcriterio de ordenacioacuten en la definicioacuten de la clase En el programa principal se utilizael meacutetodo sort igual que si se tratase de una lista de nuacutemeros o de palabras como semuestra a continuacioacuten

Colecciones y diccionarios 144

Ordenacioacuten de un ArrayList de objetos author Luis Joseacute Saacutenchez

import javautilCollectionsimport javautilArrayList

public class EjemploArrayList08

public static void main(String[] args)

ArrayListltGatogt g = new ArrayListltGatogt()

gadd(new Gato(Garfield naranja mestizo))

gadd(new Gato(Pepe gris angora))

gadd(new Gato(Mauri blanco manx))

gadd(new Gato(Ulises marroacuten persa))

gadd(new Gato(Adaacuten negro angora))

Collectionssort(g)

Systemoutprintln(nDatos de los gatos ordenados por nombre)

for (Gato gatoAux g)

Systemoutprintln(gatoAux+n)

Ahora bien en la definicioacuten de la clase Gato hay que indicar de alguna manera coacutemo sedebe realizar la ordenacioacuten ya que Java no sabe de antemano si los gatos se ordenanseguacuten el color el nombre el peso etcLo primero que hay que hacer es indicar que los objetos de la clase Gato se puedencomparar unos con otros Para ello cambiamos la siguiente liacutenea

public class Gato

por esta otra

public class Gato implements ComparableltGatogt

Lo siguiente y no menos importante es definir el meacutetodo compareTo Este meacutetodo debedevolver un 0 si los elementos que se comparan son iguales un nuacutemero negativo si

Colecciones y diccionarios 145

el primer elemento que se compara es menor que el segundo y un nuacutemero positivoen caso contrario Afortunadamente las clases String Integer Double etc ya tienenimplementado su propio meacutetodo compareTo asiacute que tenemos hecho lo maacutes difiacutecil Louacutenico que deberemos escribir en nuestro coacutedigo es un compareTo con los atributos quequeremos compararEn el caso que nos ocupa si queremos ordenar los gatos por nombre tendremos queimplementar el compareTo de la clase Gato de tal forma que nos devuelva el resultadodel compareTo de los nombres de los gatos que estamos comparando de la siguientemanera

public int compareTo(Gato g)

return (thisnombre)compareTo(ggetNombre())

Si en lugar de ordenar por nombre quisieacuteramos ordenar por raza el meacutetodo compareTo

de la clase Gato seriacutea el siguiente

public int compareTo(Gato g)

return (thisraza)compareTo(ggetRaza())

A continuacioacuten se muestra la definicioacuten completa de la clase Gato

Definicioacuten de la clase Gato author

public class Gato implements ComparableltGatogt

private String nombre

private String color

private String raza

public Gato(String nombre String color String raza)

thisnombre = nombre

thiscolor = color

thisraza = raza

public String getNombre()

return nombre

Colecciones y diccionarios 146

public String getRaza()

return raza

public String toString()

return Nombre + thisnombre + nColor + thiscolor + nRaza + thisraza

public int compareTo(Gato g)

return (thisnombre)compareTo(ggetNombre())

public boolean equals(Gato g)

return (thisnombre)equals(ggetNombre())

102 Diccionarios la clase HashMap

Imagina un diccionario ingleacutes-espantildeol Queremos saber queacute significa la palabra ldquostiffrdquoSabemos que en el diccionario hay muchas entradas y en cada entrada tenemos unapalabra en ingleacutes y su correspondiente traduccioacuten al espantildeol Buscando por la ldquosrdquoencontramos que ldquostiffrdquo significa ldquoagujetasrdquoUn diccionario en Java funciona exactamente igual Contiene una serie de elementosque son las entradas que a su vez estaacuten formadas por un par (clave valor) La clave(key) permite acceder al valor No puede haber claves duplicadas En el ejemploanterior la clave seriacutea ldquostiffrdquo y el valor ldquoagujetasrdquoJava dispone de varios tipos de diccionarios HashMap EnumMap Hashtable IdentityHashMapLinkedHashMap etc Nosotros estudiaremos el diccionario HashMap

1021 Principales meacutetodos de HashMap

Algunos de los meacutetodos maacutes importantes de la clase HasMap son

get(clave)Obtiene el valor correspondiente a una clave Devuelve null si no existe esa claveen el diccionario

put(clave valor)Antildeade un par (clave valor) al diccionario Si ya habiacutea un valor para esa clave semachaca

keySet()Devuelve un conjunto (set) con todas las claves

Colecciones y diccionarios 147

values()Devuelve una coleccioacuten con todos los valores (los valores pueden estar duplicadosa diferencia de las claves)

entrySet()Devuelve una coleccioacuten con todos los pares (clave valor)

containsKey(clave)Devuelve true si el diccionario contiene la clave indicada y false en caso contrario

getKey()Devuelve la clave de la entrada Se aplica a una sola entrada del diccionario (noal diccionario completo) es decir a una pareja (clave valor)

Por ejemplo

for (MapEntry pareja mentrySet())

Systemoutprintln(parejagetKey())

getValue()Devuelve el contenido de la entrada Se aplica a una entrada del diccionario (noal diccionario completo) es decir a una pareja (clave valor)

Por ejemplo

for (MapEntry pareja mentrySet())

Systemoutprintln(parejagetValue())

1022 Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas

Al declarar un diccionario hay que indicar los tipos tanto de la clave como del valorEn el siguiente ejemplo definimos el diccionario m que tendraacute como clave un nuacutemeroentero y una cadena de caracteres como valor Este diccionario se declara de estaforma

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

No hay que olvidar importar la clase al principio del programa

import javautilHashMap

Para insertar una entrada en el diccionario se utiliza el meacutetodo put indicando siemprela clave y el valor Veamos un ejemplo completo

Colecciones y diccionarios 148

Ejemplo de uso de la clase HasMap author Luis Joseacute Saacutenchez

import javautilHashMap

public class EjemploHashMap01

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(Los elementos de m son n + m)

Para extraer valores se utiliza el meacutetodo get Se proporciona una clave y el diccionarionos devuelve el valor igual que un diccionario de verdad Si no existe ninguna entradacon la clave que se indica se devuelve null

Ejemplo de uso de la clase HasMap author Luis Joseacute Saacutenchez

import javautilHashMap

public class EjemploHashMap011

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

Colecciones y diccionarios 149

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(mget(921))

Systemoutprintln(mget(605))

Systemoutprintln(mget(888))

iquestY si queremos extraer todas las entradas Tenemos varias opciones Podemos usar elmeacutetodo print directamente sobre el diccionario de la forma Systemoutprint(diccionario)

como vimos en un ejemplo anterior de esta manera se muestran por pantalla todaslas entradas encerradas entre llaves Tambieacuten podemos convertir el diccionario enun entrySet (conjunto de entradas) y mostrarlo con print de esta forma se obtieneuna salida por pantalla muy parecida a la primera (en lugar de llaves se muestrancorchetes) Otra opcioacuten es utilizar un for para recorrer una a una todas las entradasEn este uacuteltimo caso hay que convertir el diccionario en un entrySet ya que no se puedensacar las entradas directamente del diccionario Estas dos uacuteltimas opciones se ilustranen el siguiente ejemplo

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautilHashMapimport javautilMap

public class EjemploHashMap02

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(Todas las entradas del diccionario extraiacutedas con entrySet)

Systemoutprintln(mentrySet())

Systemoutprintln(nEntradas del diccionario extraiacutedas una a una)

Colecciones y diccionarios 150

for (MapEntry pareja mentrySet())

Systemoutprintln(pareja)

A continuacioacuten se muestra el uso de los meacutetodos getKey y getValue que extraen la clavey el valor de una entrada respectivamente

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautil

public class EjemploHashMap03

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(CoacutedigotNombren------t-------------)

for (MapEntry pareja mentrySet())

Systemoutprint(parejagetKey() + t)

Systemoutprintln(parejagetValue())

En el uacuteltimo programa de ejemplo hacemos uso del meacutetodo containsKey que nos serviraacutepara saber si existe o no una determinada clave en un diccionario y del meacutetodo get

que como ya hemos visto sirve para extraer un valor a partir de su clave

Colecciones y diccionarios 151

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautil

public class EjemploHashMap04

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprint(Por favor introduzca un coacutedigo )

int codigoIntroducido = IntegerparseInt(Systemconsole()readLine())

if (mcontainsKey(codigoIntroducido))

Systemoutprint(El coacutedigo + codigoIntroducido + corresponde a )

Systemoutprintln(mget(codigoIntroducido))

else

Systemoutprint(El coacutedigo introducido no existe)

Colecciones y diccionarios 152

103 Ejercicios

Ejercicio 1Crea un ArrayList con los nombres de 6 compantildeeros de clase A continuacioacutenmuestra esos nombres por pantalla Utiliza para ello un bucle for que recorratodo el ArrayList sin usar ninguacuten iacutendice

Ejercicio 2Realiza un programa que introduzca valores aleatorios (entre 0 y 100) en unArrayList y que luego calcule la suma la media el maacuteximo y el miacutenimo de esosnuacutemeros El tamantildeo de la lista tambieacuten seraacute aleatorio y podraacute oscilar entre 10y 20 elementos ambos inclusive

Ejercicio 3Escribe un programa que ordene 10 nuacutemeros enteros introducidos por tecladoy almacenados en un objeto de la clase ArrayList

Ejercicio 4Realiza un programa equivalente al anterior pero en esta ocasioacuten el programadebe ordenar palabras en lugar de nuacutemeros

Ejercicio 5Realiza de nuevo el ejercicio de la coleccioacuten de discos pero utilizando esta vezuna lista para almacenar la informacioacuten sobre los discos en lugar de un arrayconvencional Comprobaraacutes que el coacutedigo se simplifica notablemente iquestCuaacutentoocupa el programa original hecho con un array iquestCuaacutento ocupa este nuevoprograma hecho con una lista

Ejercicio 6Implementa el control de acceso al aacuterea restringida de un programa Se debepedir un nombre de usuario y una contrasentildea Si el usuario introduce losdatos correctamente el programa diraacute ldquoHa accedido al aacuterea restringidardquo Elusuario tendraacute un maacuteximo de 3 oportunidades Si se agotan las oportunidadesel programa diraacute ldquoLo siento no tiene acceso al aacuterea restringidardquo Los nombresde usuario con sus correspondientes contrasentildeas deben estar almacenadosen una estructura de la clase HashMap

Colecciones y diccionarios 153

Ejercicio 7La maacutequina Eurocoin genera una moneda de curso legal cada vez que se pulsaun botoacuten siguiendo la siguiente pauta o bien coincide el valor con la monedaanteriormente generada - 1 ceacutentimo 2 ceacutentimos 5 ceacutentimos 10 ceacutentimos 25ceacutentimos 50 ceacutentimos 1 euro o 2 euros - o bien coincide la posicioacuten ndash cara ocruz Simula mediante un programa la generacioacuten de 6 monedas aleatoriassiguiendo la pauta correcta Cada moneda generada debe ser una instanciade la clase Moneda y la secuencia se debe ir almacenando en una lista

Ejemplo

2 ceacutentimos ndash cara

2 ceacutentimos ndash cruz

50 ceacutentimos ndash cruz

1 euro ndash cruz

1 euro ndash cara

10 ceacutentimos ndash cara

Ejercicio 8Realiza un programa que escoja al azar 10 cartas de la baraja espantildeola(10 objetos de la clase Carta) Emplea un objeto de la clase ArrayList paraalmacenarlas y aseguacuterate de que no se repite ninguna

Ejercicio 9Modifica el programa anterior de tal forma que las cartas se muestren orde-nadas Primero se ordenaraacuten por palo bastos copas espadas oros Cuandocoincida el palo se ordenaraacute por nuacutemero as 2 3 4 5 6 7 sota caballo rey

Ejercicio 10Crea un mini-diccionario espantildeol-ingleacutes que contenga al menos 20 palabras(con su correspondiente traduccioacuten) Utiliza un objeto de la clase HashMap paraalmacenar las parejas de palabras El programa pediraacute una palabra en espantildeoly daraacute la correspondiente traduccioacuten en ingleacutes

Ejercicio 11Realiza un programa que escoja al azar 5 palabras en espantildeol del mini-diccionario del ejercicio anterior El programa iraacute pidiendo que el usuarioteclee la traduccioacuten al ingleacutes de cada una de las palabras y comprobaraacute sison correctas Al final el programa deberaacute mostrar cuaacutentas respuestas sonvaacutelidas y cuaacutentas erroacuteneas

Colecciones y diccionarios 154

Ejercicio 12Escribe un programa que genere una secuencia de 5 cartas de la barajaespantildeola y que sume los puntos seguacuten el juego de la brisca El valor de lascartas se debe guardar en una estructura HashMap que debe contener parejas(figura valor) por ejemplo (ldquocaballordquo 3) La secuencia de cartas debe ser unaestructura de la clase ArrayList que contiene objetos de la clase Carta El valorde las cartas es el siguiente as rarr 11 tres rarr 10 sota rarr 2 caballo rarr 3 rey rarr4 el resto de cartas no vale nada

Ejemplo

as de oros

cinco de bastos

caballo de espadas

sota de copas

tres de oros

Tienes 26 puntos

Ejercicio 13Modifica el programa Gestisimal realizado anteriormente antildeadiendo lassiguientes mejoras

bull Utiliza una lista en lugar de un array para el almacenamiento de los datosbull Comprueba la existencia del coacutedigo en el alta la baja y la modificacioacuten

de artiacuteculos para evitar erroresbull Cambia la opcioacuten ldquoSalida de stockrdquo por ldquoVentardquo Esta nueva opcioacuten

permitiraacute hacer una venta de varios artiacuteculos y emitir la factura corres-pondiente Se debe preguntar por los coacutedigos y las cantidades de cadaartiacuteculo que se quiere comprar Aplica un 21 de IVA

11 Ficheros de texto y paso de paraacutemetrospor liacutenea de comandos

Mediante un programa en Java se puede acceder al contenido de un fichero grabadoen un dispositivo de almacenamiento (por ejemplo en el disco duro) tanto para leercomo para escribir (grabar) datosLa informacioacuten contenida en las variables los arrays los objetos o cualquier otraestructura de datos es volaacutetil es decir se pierde cuando se cierra el programaLos ficheros permiten tener ciertos datos almacenados y disponibles en cualquiermomento para cuando nuestro programa los necesitePensemos por ejemplo en un juego Podriacuteamos utilizar un fichero para guardar elranking de jugadores con las mejores puntuaciones De esta manera estos datos nose perderiacutean al salir del juego De igual forma en un programa de gestioacuten puede seruacutetil tener un fichero de configuracioacuten con datos como el nuacutemero maacuteximo de elementosque se muestran en un listado o los distintos tipos de IVA aplicables a las facturas Almodificar esta informacioacuten quedaraacute almacenada en el fichero correspondiente y nose perderaacute cuando se cierre el programa

Cuando un programa se cierra se pierde la informacioacuten almacenada envariables arrays objetos o cualquier otra estructura Si queremos conservarciertos datos debemos guardarlos en ficheros

Hay programas que hacen un uso intensivo de datos Por ejemplo la aplicacioacutenSeacuteneca- que por cierto estaacute hecha en Java - lleva el control de la matriculacioacuten de cientosde miles de alumnos y la gestioacuten de decenas de miles de profesores En este caso yen otros similares se utiliza un sistema gestor de bases de datos El acceso a bases dedatos mediante Java lo estudiaremos en el capiacutetulo 13

La creacioacuten y uso de ficheros desde un programa en Java se lleva a cabocuando hay poca informacioacuten que almacenar o cuando esa informacioacuten esheterogeacutenea En los casos en que la informacioacuten es abundante y homogeacuteneaes preferible usar una base de datos relacional (por ejemplo MySQL) en lugarde ficheros

En este capiacutetulo estudiaremos ademaacutes del acceso a ficheros desde un programa enJava el paso de paraacutemetros desde la liacutenea de comandos Son cosas diferentes y nohay que utilizarlas juntas necesariamente pero como podraacutes comprobar se combinanmuy bien por eso hemos incluido estos dos recursos de Java en un mismo capiacutetulo

155

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 156

111 Lectura de un fichero de texto

Aunque Java puede manejar tambieacuten ficheros binarios vamos a centrarnos exclusi-vamente en la utilizacioacuten de ficheros de texto Los ficheros de texto tienen una granventaja se pueden crear y manipular mediante cualquier editor como por ejemploGEditSiempre que vayamos a usar ficheros deberemos incluir al principio del programa unao varias liacuteneas para cargar las clases necesarias Anque se pueden cargar varias clasesen una sola liacutenea usando el asterisco de la siguiente manera

import javaio

nosotros no lo haremos asiacute ya que nuestro coacutedigo sigue las normas del estaacutendar deGoogle y estas normas lo prohiben taxativamente Se importaraacuten las clases usandovarias liacuteneas una liacutenea por cada clase que se importa en el programa de esta forma

import javaioBufferedReaderimport javaioFileReader

No es necesario saber de memoria los nombres de las clases el entorno de desarrolloNetbeans detecta queacute clases hacen falta cargar y antildeade los import de forma automaacute-ticaTodas las operaciones que se realicen sobre ficheros deberaacuten estar incluidas en unbloque try-catch Esto nos permitiraacute mostrar mensajes de error y terminar el programade una forma ordenada en caso de que se produzca alguacuten fallo - el fichero no existeno tenemos permiso para acceder a eacutel etcEl bloque try-catch tiene el siguiente formato

try

Operaciones_con_fichero

catch (tipo_de_error nombre_de_variable)

Mensaje_de_error

Tanto para leer como para escribir utilizamos lo que en programacioacuten se llama unldquomanejador de ficherordquo Es algo asiacute como una variable que hace referencia al ficherocon el que queremos trabajarEn nuestro ejemplo el manejador de fichero se llama bf y se crea de la siguientemanera

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 157

BufferedReader bf = new BufferedReader(new FileReader(malaga1txt))

El fichero con el que vamos a trabajar tiene por nombre malaga1txt y contieneinformacioacuten extraiacuteda de la Wikipedia sobre la bonita ciudad de Maacutelaga1 A partir deaquiacute siempre que queramos realizar una operacioacuten sobre ese archivo utilizaremos sumanejador de fichero asociado es decir bfEn el ejemplo que se muestra a continuacioacuten el programa lee el contenido del ficheromalaga1txt y lo muestra tal cual en pantalla igual que si hicieacuteramos en una ventanade terminal cat malaga1txtObserva que se va leyendo el fichero liacutenea a liacutenea mediante bfreadLine() hasta que seacaban las liacuteneas Cuando no quedan maacutes liacuteneas por leer se devuelve el valor null

Ejemplo de uso de la clase File Lectura de un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileNotFoundExceptionimport javaioFileReaderimport javaioIOException

class EjemploFichero01

public static void main(String[] args)

try

BufferedReader bf = new BufferedReader(new FileReader(malaga1txt))

String linea =

while (linea = null)

Systemoutprintln(linea)

linea = bfreadLine()

bfclose()

catch (FileNotFoundException e) queacute hacer si no se encuentra el ficheroSystemoutprintln(No se encuentra el fichero malagatxt)

catch (IOException e) queacute hacer si hay un error en la lectura del fichero

1httpeswikipediaorgwikiMC3A1laga

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 158

Systemoutprintln(No se puede leer el fichero malagatxt)

Es importante ldquocerrar el ficherordquo cuando se han realizado todas las operacionesnecesarias sobre eacutel En este ejemplo esta accioacuten se ha llevado a cabo con la sentenciabfclose()A continuacioacuten se muestra un programa un poco maacutes complejo Se trata de unaaplicacioacuten que pide por teclado un nombre de fichero Previamente en ese fichero(por ejemplo numerostxt) habremos introducido una serie de nuacutemeros a razoacuten de unopor liacutenea Se podriacutean leer tambieacuten los nuacutemeros si estuvieran separados por comaso espacios aunque seriacutea un poco maacutes complicado (no mucho maacutes) Los nuacutemerospueden contener decimales ya que se van a leer como Double Cada nuacutemero que selee del fichero se va sumando de tal forma que la suma total estaraacute contenida en lavariable suma a la par se va llevando la cuenta de los elementos que se van leyendoen la variable i Finalmente dividiendo la suma total entre el nuacutemero de elementosobtenemos la media aritmeacutetica de los nuacutemeros contenidos en el fichero

Ejemplo de uso de la clase File Calcula la media de los nuacutemeros que se encuentran en un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileReaderimport javaioIOException

class EjemploFichero08

public static void main(String[] args)

Systemoutprint(Introduzca el nombre del archivo donde se encuentran los nuacutemeros )

String nombreFichero = Systemconsole()readLine()

try

BufferedReader bf = new BufferedReader(new FileReader(nombreFichero))

String linea = 0

int i = 0

double suma = 0

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 159

while (linea = null)

i++

suma += DoubleparseDouble(linea)

linea = bfreadLine()

i--

bfclose()

Systemoutprintln(La media es + suma (double)i)

catch (IOException e)

Systemoutprintln(egetMessage())

112 Escritura sobre un fichero de texto

La escritura en un fichero de texto es si cabe maacutes faacutecil que la lectura Solo hay quecambiar Systemoutprint(texto) por manejadorwrite(texto) Se pueden incluir saltosde liacutenea tabuladores y espacios igual que al mostrar un mensaje por pantallaEs importante ejecutar close() despueacutes de realizar la escritura de esta manera nosaseguramos que se graba toda la informacioacuten en el discoAl realizar escrituras en ficheros con Java hay que tener ciertas precauciones Cuandotoca dar este tema en clase es frecuente que a maacutes de un alumno le empiece a irlento el ordenador luego se le queda inutilizado y por uacuteltimo ni siquiera le arrancaiquestqueacute ha pasado Pues que ha estado escribiendo datos en ficheros y por alguna razoacutensu programa se ha metido en un bucle infinito lo que da como resultado cuelgues yficheros de varios gigabytes de basura Por eso es muy importante asegurarse biende que la informacioacuten que se va a enviar a un fichero es la correcta iquestcoacutemo muy faacutecilenviaacutendola primero a la pantalla

Primero a pantalla y luego a ficheroEnviacutea primero a la pantalla todo lo que quieras escribir en el fichero Cuandocompruebes que lo que se ve por pantalla es realmente lo que quieres grabaren el fichero entonces y solo entonces cambia Systemoutprint(texto) pormanejadorwrite(texto)

A continuacioacuten se muestra un programa de ejemplo que crea un fichero de texto yluego esribe en eacutel tres palabras una por cada liacutenea

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 160

Ejemplo de uso de la clase File Escritura en un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedWriterimport javaioFileWriterimport javaioIOException

class EjemploFichero02

public static void main(String[] args)

try

BufferedWriter bw = new BufferedWriter(new FileWriter(frutatxt))

bwwrite(naranjan)

bwwrite(mangon)

bwwrite(chirimoyan)

bwclose()

catch (IOException ioe)

Systemoutprintln(No se ha podido escribir en el fichero)

113 Lectura y escritura combinadas

Las operaciones de lectura y escritura sobre ficheros se pueden combinar de tal formaque haya un flujo de lectura y otro de escritura uno de lectura y dos de escritura tresde lectura etcEn el ejemplo que presentamos a continuacioacuten hay dos flujos de lectura y uno deescritura Observa que se declaran en total tres manejadores de fichero (dos paralectura y uno para escritura) El programa va leyendo de forma alterna una liacutenea decada fichero - una liacutenea de fichero1txt y otra liacutenea de fichero2txt - mientras quedenliacuteneas por leer en alguno de los ficheros y al mismo tiempo va guardando esas liacuteneasen otro fichero con nombre mezclatxt

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 161

Ejemplo de uso de la clase File Mezcla de dos ficheros author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioBufferedWriterimport javaioFileReaderimport javaioFileWriterimport javaioIOException

class EjemploFichero03

public static void main(String[] args)

try

BufferedReader bf1 = new BufferedReader(new FileReader(fichero1txt))

BufferedReader bf2 = new BufferedReader(new FileReader(fichero2txt))

BufferedWriter bw = new BufferedWriter(new FileWriter(mezclatxt))

String linea1 =

String linea2 =

while ( (linea1 = null) || (linea2 = null) )

linea1 = bf1readLine()

linea2 = bf2readLine()

if (linea1 = null) bwwrite(linea1 + n)

if (linea2 = null) bwwrite(linea2 + n)

bf1close()

bf2close()

bwclose()

catch (IOException ioe)

Systemoutprintln(Se ha producido un error de lecturaescritura)

Systemerrprintln(ioegetMessage())

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 162

114 Otras operaciones sobre ficheros

Ademaacutes de leer desde o escribir en un fichero hay otras operaciones relacionadas conlos archivos que se pueden realizar desde un programa escrito en JavaVeremos tan solo un par de ejemplos Si quieres profundizar maacutes eacutechale un vistazo ala documentacioacuten oficial de la clase File2El siguiente ejemplo muestra por pantalla un listado con todos los archivos quecontiene un directorio

Ejemplo de uso de la clase File Listado de los archivos del directorio actual author Luis Joseacute Saacutenchez

import javaioFile

class EjemploFichero04

public static void main(String[] args)

File fichero = new File() se indica la ruta entre comillas el punto () es el directorio actual

String[] listaArchivos = ficherolist()

for(int i = 0 i lt listaArchivoslength i++)

Systemoutprintln(listaArchivos[i])

El siguiente programa de ejemplo comprueba si un determinado archivo existe ono mediante exists() y en caso de que exista lo elimina mediante delete() Siintentaacuteramos borrar un archivo que no existe obtendriacuteamos un error

2httpdocsoraclecomjavase7docsapijavaioFilehtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 163

Ejemplo de uso de la clase File Comprobacioacuten de existencia y borrado de un fichero author Luis Joseacute Saacutenchez

import javaioFile

class EjemploFichero05

public static void main(String[] args)

Systemoutprint(Introduzca el nombre del archivo que desea borrar )

String nombreFichero = Systemconsole()readLine()

File fichero = new File(nombreFichero)

if (ficheroexists())

ficherodelete()

Systemoutprintln(El fichero se ha borrado correctamente)

else

Systemoutprintln(El fichero + nombreFichero + no existe)

115 Paso de argumentos por liacutenea de comandos

Como dijimos al comienzo de este capiacutetulo el paso de argumentos por liacutenea decomandos no estaacute directamente relacionado con los ficheros aunque es muy frecuentecombinar estos dos recursosSeguro que has usado muchas veces el paso de argumentos por liacutenea de comandossin saberlo Por ejemplo si tecleas el siguiente comando en una ventana de terminal

$ head -5 etcbashbashrc

se muestran por pantalla las 5 primeras liacuteneas del fichero bashbashrc que se encuentraen el directorio etc En este caso head es el nombre del programa que estamosejecutando y los valores -5 y etcbashbashrc son los argumentosVolvamos al comienzo al primer capiacutetulo iquestRecuerdas coacutemo ejecutaste tu primerprograma en Java iexclQueacute tiempos aqueacutellos El programa HolaMundo se ejecutaba asiacute

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 164

$ java HolaMundo

Para probar los ejemplos que te presentamos maacutes adelante deberaacutes hacer lo mismo yademaacutes antildeadir a continuacioacuten y separados por espacios los argumentos que quieresque lea el programa Vamos a verlo en detalleEl siguiente programa de ejemplo simplemente muestra por pantalla los argumentosintroducidos Compila el programa y prueba a ejecutar lo siguiente

$ java EjemploArgumentos06 hola que tal 24 12 fin

con lo que obtendraacutes el siguiente resultado

Los argumentos introducidos son

hola

que

tal

24

12

fin

Los argumentos han pasado al programa en virtud del paraacutemetro que incluimos en laliacutenea del main

public static void main(String[] args)

Fiacutejate en lo que hay entre pareacutentesis String[] args Se trata de un array de cadenasde caracteres (String) donde cada uno de los elementos seraacute un argumento que se hapasado como paraacutemetro Si has ejecutado el ejemplo tal y como se ha indicado args[0]vale ldquoholardquo args[1] vale ldquoquerdquo args[2] vale ldquotalrdquo args[3] vale ldquo24rdquo args[4] vale ldquo12rdquo yargs[5] vale ldquofinrdquo

Paso de argumentos en la liacutenea de comandos author Luis Joseacute Saacutenchez

class EjemploArgumentos06

public static void main(String[] args)

Systemoutprintln(Los argumentos introducidos son )

for (int i = 0 i lt argslength i++)

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 165

Systemoutprintln(args[i])

Hagamos algo un poco maacutes uacutetil con los argumentos En el siguiente ejemplo se sumantodos los argumentos que se pasan como paraacutemetros y se muestra por pantalla elresultado de la sumaDespueacutes de compilar deberaacutes ejecutar desde una ventana de terminal lo siguiente(puedes cambiar los nuacutemeros si quieres)

$ java EjemploArgumentos07 10 36 44

con lo que obtendraacutes este resultado

90

es decir la suma de los nuacutemeros que has pasado como paraacutemetros

Paso de argumentos en la liacutenea de comandos author Luis Joseacute Saacutenchez

class EjemploArgumentos07

public static void main(String[] args)

int suma = 0

for (int i = 0 i lt argslength i++)

suma += IntegerparseInt(args[i])

Systemoutprintln(suma)

Observa que el programa convierte en nuacutemeros enteros todos y cada uno de losargumentos mediante el meacutetodo IntegerparseInt() para poder sumarlos

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 166

Los argumentos recogidos por liacutenea de comandos se guardan siempre enun array de String Cuando sea necesario realizar operaciones matemaacuteticascon esos argumentos habriacutea que convertirlos al tipo adecuado medianteIntegerparseInt() o DoubleparseDouble()

116 Combinacioacuten de ficheros y paso de argumentos

Llegoacute el momento de combinar las operaciones con ficheros con el paso de paraacutemetrospor liacutenea de comandos El ejemplo que mostramos a continuacioacuten es parecido al quehemos visto en el apartado anterior calcula la media de una serie de nuacutemeros peroesta vez esos nuacutemeros se leen desde un fichero y lo que se pasa como paraacutemetro por laliacutenea de comandos es precisamente el nombre del fichero donde estaacuten esos nuacutemerosCrea un fichero y noacutembralo numerostxt e introduce los siguientes nuacutemeros (es impor-tante que esteacuten separados por un salto de liacutena para que el programa funcione bien)

25

100

44

17

6

8

A continuacioacuten compila el programa de ejemplo EjemploFichero09java y teclea losiguiente en la ventana de terminal

$ java EjemploFichero09 numerostxt

Apareceraacute el siguiente resultado

La media es 33333333333333336

Ejemplo de uso de la clase File Calcula la media de los nuacutemeros que se encuentran en un fichero de texto El nombre del fichero se pasa como argumento en la liacutenea de comandos author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileReader

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 167

import javaioIOException

class EjemploFichero09

public static void main(String[] args)

if (argslength = 1)

Systemoutprintln(Este programa calcula la media de los nuacutemeros contenidos en un f

ichero)

Systemoutprintln(Uso del programa java EjemploFichero09 FICHERO)

Systemexit(-1) sale del programa

try

BufferedReader bf = new BufferedReader(new FileReader(args[0]))

String linea = 0

int i = 0

double suma = 0

while (linea = null)

i++

suma += DoubleparseDouble(linea)

linea = bfreadLine()

i--

bfclose()

Systemoutprintln(La media es + suma(double)i)

catch (IOException e)

Systemoutprintln(egetMessage())

Observa que el programa comprueba el nuacutemero de argumentos que se pasan por laliacutenea de comandos mediante if (argslength = 1) y si este nuacutemero es distinto de 1muestra este mensaje

Este programa calcula la media de los nuacutemeros contenidos en un fichero

Uso del programa java EjemploFichero09 FICHERO

y sale del programa De esta manera el usuario sabe exactamente coacutemo hay queutilizar el programa y coacutemo hay que pasarle la informacioacuten

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 168

117 Procesamiento de archivos de texto

La posibilidad de realizar desde Java operaciones con ficheros abre muchas posibili-dades a la hora de procesar archivos cambiar una palabra por otra eliminar ciertoscaracteres mover de sitio una liacutenea o una palabra borrar espacios o tabulaciones alfinal de las liacuteneas o cualquier otra cosa que se nos pueda ocurrirCuando se procesa un archivo de texto los pasos a seguir son los siguientes

1 Leer una liacutenea del fichero origen mientras quedan liacuteneas por leer2 Modificar la liacutenea (normalmente utilizando los meacutetodos que ofrece la clase String)3 Grabar la liacutenea modificada en el fichero destino4 Volver al paso 1

A continuacioacuten tienes algunos meacutetodos de la clase String que pueden resultar muyuacutetiles para procesar archivos de texto

bull charAt(int n) Devuelve el caraacutecter que estaacute en la posicioacuten n-eacutesima de la cadenaRecuerda que la primera posicioacuten es la nuacutemero 0

bull indexOf(String palabra) Devuelve un nuacutemero que indica la posicioacuten en la quecomienza una palabra determinada

bull length() Devuelve la longitud de la cadenabull replace(char c1 char c2) Devuelve una cadena en la que se han cambiado

todas las ocurrencias del caraacutecter c1 por el caraacutecter c2bull substring(int inicioint fin) Devuelve una subcadenabull toLowerCase() Convierte todas las letras en minuacutesculasbull toUpperCase() Convierte todas las letras en mayuacutesculas

Puedes consultar todos los meacutetodos de la clase String en la documentacioacuten oficial3A continuacioacuten tienes un ejemplo en el que se usan los meacutetodos descritos anterior-mente

Ejemplos de uso de String author Luis Joseacute Saacutenchez

public class EjemplosString

public static void main(String[] args)

Systemoutprintln(nEjemplo 1)

Systemoutprintln(En la posicioacuten 2 de berengena estaacute la letra

3httpdocsoraclecomjavase7docsapijavalangStringhtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 169

+ berengenacharAt(2))

Systemoutprintln(nEjemplo 2)

String frase = Hola caracola

char[] trozo = new char[10]trozo[0] = z trozo[1] = z trozo[2] = z

frasegetChars(2 7 trozo 1)

Systemoutprint(El array de caracteres vale )

Systemoutprintln(trozo)

Systemoutprintln(nEjemplo 3)

Systemoutprintln(La secuencia co aparece en la frase en la posicioacuten

+ fraseindexOf(co))

Systemoutprintln(nEjemplo 4)

Systemoutprintln(La palabra murcieacutelago tiene

+ murcieacutelagolength() + letras)

Systemoutprintln(nEjemplo 5)

String frase2 = frasereplace(o u)

Systemoutprintln(frase2)

Systemoutprintln(nEjemplo 6)

frase2 = frasesubstring(3 10)

Systemoutprintln(frase2)

Systemoutprintln(nEjemplo 7)

Systemoutprintln(frasetoLowerCase())

Systemoutprintln(nEjemplo 8)

Systemoutprintln(frasetoUpperCase())

A continuacioacuten se muestra un programa que procesa archivos de texto Lo que hacees cambiar cada tabulador por dos espacios en blanco Lo hice a propoacutesito cuandoestaba escribiendo este manual ya que el estaacutendar de Google para la codificacioacuten enJava4 especifica que la sangriacutea debe ser precisamente de dos espacios Teniacutea muchosprogramas escritos en Java (ejemplos y soluciones a ejercicios) que no cumpliacutean esterequisito porque la sangriacutea estaba aplicada con el caraacutecter de tabulacioacuten teniacutea dosposibilidades abrir todos y cada uno de los ficheros y cambiarlo a mano o escribir unprograma que lo hiciera Opteacute por la segunda opcioacuten y aquiacute tienes el programa iquestverdadque es muy sencillo

4httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 170

import javaioBufferedReaderimport javaioBufferedWriterimport javaioFileimport javaioFileReaderimport javaioFileWriterimport javaioIOException

Cambia los tabuladores por 2 espacios author Luis Joseacute Saacutenchez

public class EjemploProcesamiento10

public static void main(String[] args)

for (int i = 0 i lt argslength i++)

Systemoutprint(Procesando el archivo + args[i] + )

try

renombra el fichero antildeadiendo tmpFile ficheroOriginal = new File(args[i])

File ficheroTemporal = new File(args[i] + tmp)

ficheroOriginalrenameTo(ficheroTemporal)

lee los datos del archivo temporalBufferedReader bf = new BufferedReader(new FileReader(args[i] + tmp))

crea un fichero nuevo con el nombre originalBufferedWriter bw = new BufferedWriter(new FileWriter(args[i]))

String linea =

while ( linea = null )

linea = bfreadLine()

if (linea = null)

cambia el tabulador por 2 espacioslinea = lineareplace(t )

bwwrite(linea + n)

bfclose()

bwclose()

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 171

borra el fichero temporalficheroTemporaldelete()

catch (IOException ioe)

Systemoutprintln(Se ha producido un error de lecturaescritura)

Systemerrprintln(ioegetMessage())

Systemoutprintln(hecho)

118 Ejercicios

Ejercicio 1Escribe un programa que guarde en un fichero con nombre primosdat losnuacutemeros primos que hay entre 1 y 500

Ejercicio 2Realiza un programa que lea el fichero creado en el ejercicio anterior y quemuestre los nuacutemeros por pantalla

Ejercicio 3Escribe un programa que guarde en un fichero el contenido de otros dosficheros de tal forma que en el fichero resultante aparezcan las liacuteneas de losprimeros dos ficheros mezcladas es decir la primera liacutenea seraacute del primerfichero la segunda seraacute del segundo fichero la tercera seraacute la siguiente delprimer fichero etcLos nombres de los dos ficheros origen y el nombre del fichero destino se debenpasar como argumentos en la liacutenea de comandosHay que tener en cuenta que los ficheros de donde se van cogiendo las liacuteneaspueden tener tamantildeos diferentes

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 172

Ejercicio 4Realiza un programa que sea capaz de ordenar alfabeacuteticamente las palabrascontenidas en un fichero de texto El nombre del fichero que contiene laspalabras se debe pasar como argumento en la liacutenea de comandos El nombredel fichero resultado debe ser el mismo que el original antildeadiendo la coletillasort por ejemplo palabras_sorttxt Suponemos que cada palabra ocupa unaliacutenea

Ejercicio 5Escribe un programa capaz de quitar los comentarios de un programa de JavaSe utilizariacutea de la siguiente maneraquita_commentarios PROGRAMA_ORIGINAL PROGRAMA_LIMPIO

Por ejemploquita_comentarios holajava holav2java

crea un fichero con nombre holav2java que contiene el coacutedigo de holajava perosin los comentarios

Ejercicio 6Realiza un programa que diga cuaacutentas ocurrencias de una palabra hay en unfichero Tanto el nombre del fichero como la palabra se deben pasar comoargumentos en la liacutenea de comandos

12 Aplicaciones web en Java (JSP)Hasta el momento los programas realizados funcionan en una austera ventana determinal No se trata de algo casual hemos elegido esta manera de trabajar de formadeliberada para que el estudiante se centre en resolver el problema y no se distraigadaacutendole sombra a un botoacuten o escogiendo la mejor imagen de fondo para un listadoLlegamos no obstante a un punto en que algunos programas piden a gritos unaapariencia maacutes vistosaEn este capiacutetulo vamos a aprender coacutemo utilizar paacuteginas web como interfaz paraprogramas en Java Usaremos JSP (JavaServer Pages) que nos permitiraacute mezclar coacutedigoen Java con coacutedigo HTML El coacutedigo en Java que utilizaremos seraacute muy parecido alque hemos venido utilizando hasta ahora Cambiaraacute uacutenicamente lo relativo a mostrarinformacioacuten por pantalla (ahora se volcaraacute todo a HTML) y la manera en que seintroducen los datos que se realizaraacute mediante formularios

El lector deberaacute tener unos conocimientos baacutesicos de HTML para entender bieny sacar provecho de este capiacutetulo Una web excelente para aprender HTML esW3Schools1

El estaacutendar de programacioacuten de Google para el coacutedigo fuente escrito en Java2 noespecifica ninguna regla en cuanto a la manera de nombrar los ficheros correspon-dientes a las aplicaciones JSP Por tanto vamos a adoptar las convenciones de Oracle3

en esta materia Seguacuten estas convenciones los nombres de los ficheros JSP debenestar escritos en lowerCamelCase es decir la primera letra siempre es minuacutesculay en caso de utilizar varias palabras dentro del nombre eacutestas van seguidas unade otra empezando cada una por mayuacutescula Finalmente se antildeade la extensioacuten jspPor ejemplo listadoSociosjsp es un nombre correcto mientras que ListadoSociosjsplistado_sociosjsp o Listadosociosjsp son incorrectos

121 Hola Mundo en JSP

Para desarrollar aplicaciones en JSP utilizaremos el entorno de desarrollo NetbeansEste IDE se puede descargar de forma gratuita en httpsnetbeansorgdownloadsnota12_-14

Sigue estos pasos para crear una aplicacioacuten en JSP con Netbeans1httpw3schoolscom2httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml3httpwwworaclecomtechnetworkarticlesjavasecode-convention-138726html4ParamaacutesdetallessobrelainstalacioacutenyconfiguracioacutendeNetbeansverel[ApeacutendiceB](apendiceb)

173

Aplicaciones web en Java (JSP) 174

bull En el menuacute principal selecciona Archivo y a continuacioacuten Nuevo Proyecto Sepuede hacer maacutes raacutepido con la combinacioacuten Control + Mayuacutescula + N

bull Apareceraacute una ventana emergente para elegir el tipo de proyecto SeleccionaJava Web en el apartado ldquoCategoriacuteasrdquo y Aplicacioacuten Web en el apartadoldquoProyectosrdquo Haz clic en Siguiente

bull Ahora hay que darle el nombre al proyecto lo puedes llamar por ejemploSaludo1 Recuerda no utilizar caracteres especiales ni signos de puntuacioacuten Secrearaacute una carpeta con el mismo nombre que el proyecto que contendraacute todoslos ficheros necesarios Haz clic en Siguiente

bull En la siguiente ventana tendraacutes que elegir el servidor la versioacuten de Java y laruta Elige Glass Fish Server En caso de no haber ninguacuten servidor disponibleNetbeans permite antildeadir uno sobre la marcha (se lo descarga y lo instala) Hazclic en Finalizar

A la izquierda en la ventana de proyectos debe aparecer el que acabas de crearSaludo1 Navegando por la estructura del proyecto veraacutes que hay una carpeta connombre Web Pages en esta carpeta se deberaacuten guardar los archivos correspondien-tes a la aplicacioacuten archivos jsp html css imaacutegenes archivos de audio etc Para quelos archivos esteacuten ordenados se pueden organizar a su vez en subcarpetas dentrode Web PagesPor defecto cuando se crea un proyecto JSP se crea el archivo indexhtml Elimina estearchivo de tu proyecto y luego crea indexjsp haciendo clic con el botoacuten derecho enWeb Pages rarr Nuevo rarr JSP Al indicar el nombre no hay que poner la extensioacutenYa tienes un ldquoHola Mundordquo en ingleacutes Si lo quieres en espantildeol solo tienes que cambiarldquoHello Worldrdquo por ldquoHola Mundordquo con lo que la aplicacioacuten quedariacutea como sigue

lt-- saludo1jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Mundolth1gt

En esta paacutegina se usa uacutenicamente HTML

ltbodygt

lthtmlgt

Para ejecutar la aplicacioacuten hay que hacer clic en el botoacuten verde Ejecutar Proyecto opulsar F6 En ese momento Netbeans buscaraacute un fichero con el nombre indexjsp ylo lanzaraacute en el navegador

Aplicaciones web en Java (JSP) 175

Observa que el programa del ejemplo se llama saludo1jsp y no indexjsp En estecaso para ejecutar la aplicacioacuten hay que hacer clic con el botoacuten derecho encima desaludo1jsp y seleccionar EjecutarDe momento solo hemos visto coacutedigo HTML iquestdoacutende estaacute Java Bien vamos a verlopero antes hay entender bien coacutemo funciona JSPUna aplicacioacuten JSP consistiraacute en una o varias paacuteginas web que normalmente contendraacutecoacutedigo HTML y que llevaraacuten ldquoinsertadordquo coacutedigo en Java Este coacutedigo en Java puedecolocarse en cualquier parte del archivo y se delimita mediante las etiquetas lt y gtCuando se pulsa F6 para ejecutar la aplicacioacuten sucede lo siguiente

1 Todo el coacutedigo (tanto HTML como JAVA) se enviacutea al servidor (Glass Fish o ApacheTomcat por ejemplo)

2 El servidor deja intacto el coacutedigo HTML y compila y ejecuta el coacutedigo en JavaGeneralmente el coacutedigo Java genera coacutedigo HTML mediante las instruccionesoutprint y outprintln

3 Por uacuteltimo todo el coacutedigo (ya solo queda HTML) se enviacutea al navegador que es elque muestra la paacutegina Recuerda que el navegador no entiende Java (entiendeJavascript que es otro lenguaje diferente) y es imprescindible que todo el coacutedigoJava haya sido traducido previamente

122 Mezclando Java con HTML

A continuacioacuten se muestra un ejemplo que siacute tiene Java Como ves el coacutedigo Java estaacutedelimitado por los caracteres lt y gt

lt-- saludo2jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt outprintln(lth1gtiexclHola Mundolth1gt) gt

ltbodygt

lthtmlgt

Mediante Java se puede generar cualquier contenido HTML por ejemplo para modi-ficar estilos crear tablas mostrar imaacutegenes etc Trabajando en consola lo que seincluye en un print es exactamente lo que se muestra por pantalla Ahora con JSP loque se incluye dentro del print es ldquorenderizadordquo a posteriori por el navegador En elsiguiente ejemplo se puede ver claramente este comportamiento

Aplicaciones web en Java (JSP) 176

lt-- saludo3jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Caracolalth1gt

lt outprint(ltbgtltigt) gt

Esta liacutenea se ha puesto en negrita y cursiva mediante Java

lt outprint(ltigtltbgt) gt

ltbodygt

lthtmlgt

Es muy uacutetil ver el coacutedigo fuente que se ha generado una vez que se puede visualizarla aplicacioacuten en el navegador Para ver el coacutedigo fuente tanto en Firefox como enChrome hay que hacer clic con el botoacuten derecho en la paacutegina y seleccionar la opcioacutenldquoVer coacutedigo fuente de la paacuteginardquoCuando el contenido que se quiere volcar en HTML es el resultado de una expresioacutense pueden utilizar de forma opcional las etiquetas lt= y gt

lt-- saludo4jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Caracolalth1gt

lt= ltbgtltigt gt

Esta liacutenea se ha puesto en negrita y cursiva mediante Java

lt= ltigtltbgt gt

ltbodygt

lthtmlgt

En el coacutedigo Java que se inserta en las aplicaciones JSP se pueden utilizar todos loselemento del lenguaje vistos anteriormente bucles sentencias de control arraysdiccionarios etcEn el siguiente ejemplo se utiliza un bucle for para mostrar texto en diferentestamantildeos utilizando las etiquetas desde la lth6gt (cabecera pequentildea) hasta la lth1gt

(cabecera maacutes grande)

Aplicaciones web en Java (JSP) 177

lt-- pruebaVariable1 --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

for (int i = 1 i lt 7 i++)

outprintln(lth + (7-i) + gt+ i + lth + (7-i) + gt)

gt

ltbodygt

lthtmlgt

El coacutedigo en Java se puede insertar en cualquier parte dentro del coacutedigo HTML eincluso se pueden insertar varios trozos como se puede ver en el siguiente ejemploAunque una variable se haya definido en una determinada zona su aacutembito deactuacioacuten no se ve reducido a ese fragmento de coacutedigo sino que se puede utilizarposteriormente en otro lugar de la aplicacioacutenObserva que en el siguiente ejemplo la definicioacuten e inicializacioacuten de la variable x serealiza en un bloque de coacutedigo en Java y que luego esta variable se utiliza en otros dosbloques diferentes

lt-- pruebaVariable2 --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt int x = 3 gt

lthlt outprint(x) gtgtholalthlt outprint(x) gtgt

ltbodygt

lthtmlgt

En ocasiones puede ser uacutetil recabar informacioacuten del sistema versioacuten de Java en usosistema operativo nombre de usuario etc Estos datos se pueden obtener medianteSystemgetProperty(propiedad)

Aplicaciones web en Java (JSP) 178

lt-- muestraInfojsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtInformacioacuten del entorno de trabajolth1gt

lt

outprint(Fabricante de Java + SystemgetProperty(javavendor))

outprint(ltbrgtUrl del fabricante + SystemgetProperty(javavendorurl))

outprint(ltbrgtVersioacuten + SystemgetProperty(javaversion))

outprint(ltbrgtSistema operativo + SystemgetProperty(osname))

outprint(ltbrgtUsuario + SystemgetProperty(username))

gt

ltbodygt

lthtmlgt

Para mostrar informacioacuten en una paacutegina de forma ordenada es muy frecuente utilizartablas Las tablas son especialmente uacutetiles para mostrar listados obtenidos de unabase de datos como veremos en el siguiente capiacutetuloEn el siguiente ejemplo se muestra una tabla con dos columnas en la primera columnase muestran los nuacutemeros del 0 al 9 y en la segunda sus correspondientes cuadrados

lt-- tablajsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltbodygt

lth1gtEjemplo de tablalth1gt

lttable border=2gt

lttrgt

lttdgtNuacutemerolttdgtlttdgtCuadradolttdgt

lttrgt

lt

for(int i = 0 i lt 10 i++)

outprintln(lttrgt)

outprintln(lttdgt + i + lttdgt)

outprintln(lttdgt)

outprintln(i i)

outprintln(lttdgtlttrgt)

Aplicaciones web en Java (JSP) 179

gt

lttablegt

ltbodygt

lthtmlgt

123 Recogida de datos en JSP

En cualquier aplicacioacuten web la introduccioacuten de datos se realiza mediante formulariosAunque se puede hacer todo en la misma paacutegina de momento vamos a tener dos Laprimera paacutegina contendraacute un formulario y seraacute la encargada de recoger la informacioacuteny enviarla a una segunda paacutegina Esta uacuteltima paacutegina recibiraacute los datos realizaraacute unaserie de caacutelculos u operaciones si procede y por uacuteltimo mostraraacute un resultadoEn el primer ejemplo - un proyecto que llamaremos PasoDeCadena - tenemos una paacuteginacon nombre indexjsp que contiene un formulario HTML Este formulario contiene unaentrada de texto donde el usuario introduciraacute una cadena de caracteres Es muyimportante darle un valor a la etiqueta name En el caso que nos ocupa tenemosname=cadenaIntro por tanto el dato que recoge el formulario se llama de esa maneraseriacutea el equivalente al nombre de la variable en Java No menos importante es indicarla paacutegina que recibiraacute los datos que recoge el formulario Esta informacioacuten se indicacon la etiqueta action en nuestro ejemplo action=frasejsp indica que seraacute el ficherofrasejsp el que recibiraacute cadenaIntroEl fichero indexjsp uacutenicamente contiene coacutedigo HTML por tanto se podriacutea llamarindexhtml y la aplicacioacuten funcionariacutea exactamente igual

lt-- indexjsp (proyecto PasoDeCadena) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtPaso de cadenalttitlegt

ltheadgt

ltbodygt

lth1gtPasando una cadena de caractereslth1gt

ltform method=post action=frasejspgt

Introduzca el nombre de una fruta

ltinput type=text name=cadenaIntrogt

ltinput type=submit value=OKgt

ltformgt

ltbodygt

lthtmlgt

Para recoger los datos enviados por un formulario se utiliza requestgetParameter(nombreDeVariable)

donde nombreDeVariable es el dato que se enviacutea desde el formulario En caso de que el

Aplicaciones web en Java (JSP) 180

dato enviado sea un texto que pueda contener tildes o entildees hay que especificar lacodificacioacuten mediante requestsetCharacterEncoding(UTF-8) antes de recoger el dato

lt-- frasejsp (proyecto PasoDeCadena) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtPaso de cadenalttitlegt

ltheadgt

ltbodygt

lt requestsetCharacterEncoding(UTF-8) gt

Me gusta mucho comer

lt outprint(requestgetParameter(cadenaIntro))gt

ltbodygt

lthtmlgt

En el siguiente ejemplo llamado Incrementa5 se muestra coacutemo manipular en JSP un datonumeacuterico La aplicacioacuten recoge un nuacutemero y luego muestra ese nuacutemero incrementadoen 5 unidades

lt-- indexjsp (proyecto Incrementa5) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

ltform method=get action=incrementa5jspgt

Introduzca un nuacutemero (puede tener decimales)

ltinput type=text name=numeroIntrogt

ltinput type=submit value=OKgt

ltformgt

ltbodygt

lthtmlgt

Observa en el fichero incrementa5jsp coacutemo se transforma la cadena de caracteresque se recibe en numeroIntro en un dato numeacuterico con el meacutetodo DoubleparseDoubleexactamente igual que si estuvieacuteramos leyendo un nuacutemero desde teclado en laventana de terminal

Aplicaciones web en Java (JSP) 181

lt-- incrementa5jsp (proyecto Incrementa5) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

El nuacutemero introducido maacutes cinco es

lt

double resultado

resultado = DoubleparseDouble(requestgetParameter(numeroIntro)) + 5

outprint(resultado)

gt

ltbodygt

lthtmlgt

El siguiente ejemplo ilustra la recogida y enviacuteo de dos variables x e y Observa queahora el formulario contiene dos entradas de texto una para cada variable

lt-- indexjsp (proyecto Suma) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtSumalttitlegt

ltheadgt

ltbodygt

lth1gtSupercalculadoralth1gt

ltform method=get action=resultadojspgt

x ltinput type=text name=xgtltbrgt

y ltinput type=text name=ygtltbrgt

ltinput type=submitgt

ltformgt

ltbodygt

lthtmlgt

En el fichero resultadojsp se reciben las variables recogidas en indexjsp y se sumanRecuerda que por defecto la informacioacuten enviada por un formulario es una cadenade caracteres Si queremos sumar los valores introducidos debemos transformar lascadenas de caracteres a nuacutemeros enteros con el meacutetodo IntegervalueOf()

Aplicaciones web en Java (JSP) 182

lt-- resultadojsp (proyecto Suma) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtSumalttitlegt

ltheadgt

ltbodygt

La suma es

lt

int primerNumero = IntegervalueOf(requestgetParameter(x))

int segundoNumero = IntegervalueOf(requestgetParameter(y))

outprintln(primerNumero + segundoNumero)

gt

ltbodygt

lthtmlgt

El siguiente proyecto de ejemplo es Animales En la paacutegina principal (indexjsp) se puedeseleccionar un animal - gato o caracol - y un nuacutemero Una vez introducidos los datoseacutestos se enviacutean a animalesjsp

lt-- indexjsp (proyecto Animales) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtAnimaleslttitlegt

ltheadgt

ltbodygt

ltform method=post action=animalesjspgt

Seleccione animal a visualizar

ltselect name=animalgt

ltoptiongtGatoltoptiongt

ltoptiongtCaracolltoptiongt

ltselectgt

ltbrgt

Nuacutemero de animales ltinput type=text name=numero size=3gt

ltbrgt

ltinput type=submitgt

ltformgt

ltbodygt

lthtmlgt

Aplicaciones web en Java (JSP) 183

La paacutegina animalesjsp nos mostraraacute una imagen del animal elegido repetida el nuacutemerode veces que hemos indicado

lt-- animalesjsp (proyecto Animales) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtAnimaleslttitlegt

ltheadgt

ltbodygt

lt

String nombreAnimal = requestgetParameter(animal)

String nombreImagen

if (nombreAnimalequals(Gato))

nombreImagen = gatojpg

else

nombreImagen = caracoljpg

int veces = IntegerparseInt(requestgetParameter(numero))

for (int i = 0 i lt veces i++)

outprint(ltimg src= + nombreImagen + width=20gt)

gt

ltbodygt

lthtmlgt

124 POO en JSP

En las aplicaciones realizadas en JSP se puenden incluir clases definidas por el usuariopara posteriormente crear objetos de esas clases Lo habitual es que el fichero quecontiene la definicioacuten de la clase se encuentre separado del programa principalEn un nuevo proyecto con nombre GatosConClase vamos a crear la clase Gato paraello haz clic derecho sobre el icono del proyecto selecciona Nuevo y luego seleccionaClase de Java El nombre de la clase seraacute Gato y el nombre del paquete seraacute porejemplo daw1El fichero Gatojava quedariacutea como el que se muestra a continuacioacuten

Aplicaciones web en Java (JSP) 184

Gatojava (proyecto GatosConClase)

package daw1

public class Gato

private String nombre

private String imagen

public Gato(String nombre String imagen)

thisnombre = nombre

thisimagen = imagen

public String getNombre()

return nombre

public String getImagen()

return imagen

Override

public String toString()

return ltimg src= + imagen + width=80gtHola soy + nombre + ltbrgt

public String maulla()

return ltimg src= + imagen + width=80gtMiauuuuuuuultbrgt

public String come(String comida)

return ltimg src= + imagen + width=80gtEstoy comiendo + comida + ltbrgt

Hemos creado una clase Gato muy sencilla que uacutenicamente contiene dos atributosel nombre del gato y el nombre del fichero de su foto Como meacutetodos se hanimplementado toString() maulla() y come()

Aplicaciones web en Java (JSP) 185

lt-- indexjsp (proyecto GatosConClase) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltpage import=daw1Gatogt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtGatos con claselttitlegt

ltheadgt

ltbodygt

lth1gtGatos con claselth1gt

lthrgt

lt

Gato g1 = new Gato(Pepe gatojpg)

Gato g2 = new Gato(Garfield garfieldjpg)

Gato g3 = new Gato(Tom tompng)

outprintln(g1)

outprintln(g2)

outprintln(g3)

outprintln(g1maulla())

outprintln(g2come(sardinas))

gt

ltbodygt

lthtmlgt

El coacutedigo Java del programa principal es casi ideacutentico al que tendriacuteamos en unprograma para consolaEl siguiente ejemplo - GatosConClaseYBocadillos - es una mejora del anterior Seantildeaden estilos5 para mostrar lo que dicen los gatos igual que en un coacutemic

Gatojava (proyecto GatosConClaseYBocadillos)

package daw1

public class Gato

private String nombre

private String imagen

public Gato(String nombre String imagen)

thisnombre = nombre

thisimagen = imagen

5httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos12_JSPGatosConClaseYBocadillosestiloscss

Aplicaciones web en Java (JSP) 186

public String getNombre()

return nombre

public String getImagen()

return imagen

Override

public String toString()

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspHola soy + nombre + ampnbspltdivgtltdivgt

public String maulla()

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspMiauuuuuuuuampnbspltdivgtltdivgt

public String come(String comida)

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspEstoy comiendo + comida + ampnbspltdivgtltdivgt

El uacutenico antildeadido al programa principal es una liacutenea situada en la cabecera de la paacuteginaque carga la hoja de estilos estiloscss

lt-- indexjsp (proyecto GatosConClaseYBocadillos) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltpage import=daw1Gatogt

ltDOCTYPE htmlgtlthtmlgt

ltheadgtltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gtlttitlegtGatos con clase y bocadilloslttitlegt

ltlink rel=stylesheet type=textcss href=estiloscss gtltheadgtltbodygtlth1gtGatos con claselth1gtlthrgtlt

Gato g1 = new Gato(Pepe gatojpg)

Aplicaciones web en Java (JSP) 187

Gato g2 = new Gato(Garfield garfieldjpg)

Gato g3 = new Gato(Tom tompng)

outprintln(g1)

outprintln(g2)

outprintln(g3)

outprintln(g1maulla())

outprintln(g2come(sardinas))

gt

ltbodygtlthtmlgt

Aplicaciones web en Java (JSP) 188

125 Ejercicios

Ejercicio 1Crea una aplicacioacuten web en Java que muestre tu nombre y tus datos personalespor pantalla La paacutegina principal debe ser un archivo con la extensioacuten jspComprueba que se lanzan bien el servidor y el navegador web Observa losmensajes que da el servidor Fiacutejate en la direccioacuten que aparece en la barra dedirecciones del navegador

Ejercicio 2Mejora el programa anterior de tal forma que la apariencia de la paacuteginaweb que muestra el navegador luzca maacutes bonita mediante la utilizacioacuten deCSS (utiliza siempre ficheros independientes para CSS para no mezclarlo conHTML)

Ejercicio 3Escribe una aplicacioacuten que pida tu nombre A continuacioacuten mostraraacute ldquoHolardquoseguido del nombre introducido El nombre se deberaacute recoger mediante unformulario

Ejercicio 4Realiza una aplicacioacuten que calcule la media de tres notas

Ejercicio 5Realiza un conversor de euros a pesetas

Ejercicio 6Realiza un conversor de pesetas a euros

Ejercicio 7Combina las dos aplicaciones anteriores en una sola de tal forma que en lapaacutegina principal se pueda elegir pasar de euros a pesetas o de pesetas a eurosAdorna la paacutegina con alguna foto o dibujo

Aplicaciones web en Java (JSP) 189

Ejercicio 8Realiza una aplicacioacuten que pida un nuacutemero y que luego muestre la tabla demultiplicar de ese nuacutemero El resultado se debe mostrar en una tabla (lttablegten HTML)

Ejercicio 9Realiza una aplicacioacuten que pinte una piraacutemide La altura se pediraacute en unformulario La piraacutemide estaraacute hecha de bolitas ladrillos o cualquier otraimagen

Ejercicio 10Realiza un cuestionario con 10 preguntas tipo test sobre las asignaturasque se imparten en el curso Cada pregunta acertada sumaraacute un punto Elprograma mostraraacute al final la calificacioacuten obtenida Paacutesale el cuestionario a tuscompantildeeros y piacutedeles que lo hagan para ver queacute tal andan de conocimientosen las diferentes asignaturas del curso Utiliza radio buttons en las preguntasdel cuestionario

Ejercicio 11Escribe una aplicacioacuten que genere el calendario de un mes Se pediraacute elnombre del mes el antildeo el texto que queremos que aparezca sobre elcalendario el diacutea de la semana en que cae el diacutea 1 y el nuacutemero de diacuteas quetiene el mes

Ejercicio 12Mejora la aplicacioacuten anterior de tal forma que no haga falta introducir el diacuteade la semana en que cae el diacutea 1 y el nuacutemero de diacuteas que tiene el mes Elprograma debe deducir estos datos del mes y el antildeo Pista puedes usar laclase Calendar (javautilCalendar)

Ejercicio 13Transforma el test de infidelidad realizado anteriormente para consola en unaaplicacioacuten web

Aplicaciones web en Java (JSP) 190

Ejercicio 14Escribe un programa que muestre los n primeros teacuterminos de la serie deFibonacci El primer teacutermino de la serie de Fibonacci es 0 el segundo es 1y el resto se calcula sumando los dos anteriores por lo que tendriacuteamos quelos teacuterminos son 0 1 1 2 3 5 8 13 21 34 55 89 144hellip El nuacutemero n sedebe introducir por teclado

Ejercicio 15Realiza una aplicacioacuten que genere 100 nuacutemeros aleatorios del 1 al 200 Losprimos deberaacuten aparecer en un color diferente al resto

Ejercicio 16Realiza una aplicacioacuten que muestre la tirada aleatoria de tres dados de poacutekerUtiliza imaacutegenes de dados reales

Ejercicio 17Realiza un configurador del interior de un vehiacuteculo El usuario puede elegirmediante un formulario el color de la tapiceriacutea ndash blanco negro o berengena -y el material de las molduras ndash madera o carbono Se debe mostrar el interiordel coche tal y como lo quiere el usuario

Ejercicio 18Crea la aplicacioacuten ldquoEl Trilerdquo Deben aparecer tres cubiletes por pantalla y elusuario deberaacute seleccionar uno de ellos Para dicha seleccioacuten se puede usar unformulario con radio-button una lista desplegable hacer clic en el cubilete o loque resulte maacutes faacutecil Se levantaraacuten los tres cubiletes y se veraacute si estaba o nola bolita dentro del que el usuario indicoacute asiacute mismo se mostraraacute un mensajediciendo ldquoLo siento no has acertadordquo o ldquoiexclEnhorabuena has encontrado labolitardquo La probabilidad de encontrar la bolita es de 13

Ejercicio 19Crea el juego ldquoApuesta y ganardquo El usuario debe introducir inicialmente unacantidad de dinero A continuacioacuten apareceraacute por pantalla una imagen deforma aleatoria Si sale una calavera el usuario pierde todo su dinero y terminael juego Si sale medio limoacuten el usuario pierde la mitad del dinero y puedeseguir jugando con esa cantidad o puede dejar de jugar Si sale el gato chinode la suerte el usuario multiplica por dos su dinero y puede seguir jugandocon esa cantidad o puede dejar de jugar

Aplicaciones web en Java (JSP) 191

Ejercicio 20Crea una aplicacioacuten que dibuje un tablero de ajedrez mediante una tabla HTMLgenerada con bucles usando JSP y que situacutee dentro del tablero un alfil y uncaballo en posiciones aleatorias Las dos figuras no pueden estar colocadas enla misma casilla Las filas y las columnas del tablero deben estar etiquetadascorrectamente

13 Acceso a bases de datosEn el capiacutetulo 11 vimos coacutemo almacenar informacion en ficheros de texto de tal formaque esta informacioacuten no se pierde cuando el programa se cierra Normalmente losficheros de texto se usan en casos concretos como archivos de configuracioacuten o archivosde registro (log)Las bases de datos relacionales entran en juego cuando se necesita almacenar muchainformacioacuten y ademaacutes esta informacioacuten es homogeacutenea y se puede representarmediante tablas Por ejemplo una aplicacioacuten que permita gestionar la matriculacioacutende los alumnos de un centro educativo deberaacute ser capaz de almacenar los datos degran cantidad de alumnos (puede que miles) En este caso concreto cada alumno serepresenta mediante un registro que contiene determinados datos como el nuacutemerode expediente el nombre los apellidos la nota media etc A estos datos se les llamacamposEn este capiacutetulo vamos a ver coacutemo se puede acceder mediante Java a una basede datos relacional MySQL para hacer listados insertar nuevos elementos y borrarelementos existentesLos programas de ejemplo que se muestran en este capiacutetulo son aplicaciones JSPaprovechando lo visto en el capiacutetulo anterior aunque tambieacuten se puede acceder auna base de datos desde un programa en Java escrito para la consola

131 Socios de un club de baloncesto

Para ilustrar el acceso a una base de datos mediante Java vamos a utilizar comoejemplo un club de baloncesto Nuestro club necesita tener almacenada la informacioacutende todos los socios Sobre cada socio se necesita saber su nombre completo suestatura su edad y su localidad de residencia Cada socio tendraacute ademaacutes un nuacutemerode identificacioacuten uacutenico que seraacute el nuacutemero de socioNuestra aplicacioacuten consistiraacute en varias paacuteginas JSP que van a permitir ver un listadocon los datos de todos los socios dar de alta un nuevo miembro en el club y tambieacutenborrar o modificar los datos de un determinado socioSi todaviacutea no tienes instalado en tu equipo el gestor de bases de datosMySQL deberaacutesinstalarlo Tambieacuten es recomendable instalar PHPMyAdmin que es una aplicacioacuten quepermite crear y manejar bases de datos MySQL de una forma muy sencilla medianteuna interfaz web

192

Acceso a bases de datos 193

Instalacioacuten de MySQL

sudo apt-get install mysql-server

sudo apt-get install mysql-client

Para el usuario root de MySQL deberaacutes establecer la contrasentildea root para quete funcionen correctamente los ejemplos

Instalacioacuten de PHPMyAdmin

sudo apt-get install phpmyadmin

Para acceder a PHPMyAdmin debes escribir httplocalhostphpmyadmin en labarra de direcciones del navegador

Deberaacutes crear la base de datos MySQL a la que llamaraacutes baloncesto que contendraacuteuna tabla de nombre socio con los campos socioID nombre estatura edad y localidad yluego deberaacutes antildeadir los datos de los socios Todo esto lo tienes ya preparado en unfichero con nombre baloncestosql que estaacute en GitHub en la direccioacuten httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDbaloncestosql Descaacutergate este fichero lo utilizaremos en seguidaA continuacioacuten mostramos un fragmento del fichero baloncestosql para que veas coacutemose crea la base de datos la tabla socio y coacutemo se introducen los datos de muestra

---- Base de datos `baloncesto`--CREATE DATABASE IF NOT EXISTS `baloncesto` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

USE `baloncesto`

-- --------------------------------------------------------

---- Estructura de tabla para la tabla `socio`--

CREATE TABLE IF NOT EXISTS `socio` (

`socioID` int(11) NOT NULL`nombre` varchar(40) COLLATE utf8_spanish2_ci DEFAULT NULL`estatura` int(11) DEFAULT NULL`edad` int(11) DEFAULT NULL`localidad` varchar(30) COLLATE utf8_spanish2_ci DEFAULT NULLPRIMARY KEY (`socioID`)

Acceso a bases de datos 194

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci

---- Volcado de datos para la tabla `socio`--

INSERT INTO `socio` (`socioID` `nombre` `estatura` `edad` `localidad`) VALUES(1235 Bermuacutedez Espada Ana Mariacutea 186 46 Maacutelaga)

(1236 Cano Cuenca Margarita 161 48 Maacutelaga)

En dos sencillos pasos tendraacutes preparada y lista para usar la base de datos de ejemploPara acceder a PHPMyAdmin debes escribir httplocalhostphpmyadmin en la barrade direcciones de tu navegador A continuacioacuten teclea el nombre de usuario y lacontrasentildea Si has instalado MySQL como te hemos indicado tanto el nombre deusuario como la contrasentildea deberiacutean ser root

A continuacioacuten haz clic en la pestantildea Importar y seguidamente en el botoacuten Exami-nar Selecciona el fichero baloncestosql que descargaste antes

Acceso a bases de datos 195

Si has seguido correctamente los pasos ya tienes la base de datos lista para usardesde un programa escrito en Java

132 Preparacioacuten del proyecto de ejemplo

1321 Activar la conexioacuten a MySQL

Abre el entorno Netbeans y crea un nuevo proyecto del tipo Java Web - como vimosen el capiacutetulo 12 - y noacutembralo BaloncestoAhora es necesario activar el servicio de bases de datos Haz clic en la pestantildeaServicios (estaacute junto a la pestantildea Proyectos) Haz clic con el botoacuten derecho enBasesde datos y luego selecciona Nueva conexioacuten A continuacioacuten aparece una ventanapara seleccionar el driver debes seleccionar MySQL (ConnectorJdriver)

Acceso a bases de datos 196

Una vez se haya establecido el servicio veraacutes las bases de datos disponibles en unaestructura de aacuterbol Puedes ir desplegando hasta encontrar la base de datos baloncesto

y la tabla socio que contiene los campos socioID nombre estatura edad y localidad

Una vez activada la conexioacuten a MySQL no es necesario realizarla de nuevo para cada

Acceso a bases de datos 197

proyecto

1322 Incluir la libreriacutea MySQL JDBC

Cada proyecto de aplicacioacuten en Java que haga uso de una base de datos MySQLdeberaacute incluir la libreriacutea MySQL JDBC Para incluir esta libreriacutea despliega el proyectoBaloncesto haz clic con el botoacuten derecho en Libreriacuteas selecciona Antildeadir libreriacuteay por uacuteltimo selecciona MySQL JDBC Driver

133 Listado de socios

El primer ejemplo de acceso a una base de datos mediante Java que veremos seraacute unlistado Si echas un vistazo desde PHPMyAdmin a la tabla socio de la base de datosbaloncesto veraacutes que ya contiene informacioacuten sobre maacutes de 20 socios Nuestro primerejemplo seraacute una aplicacioacuten en Java que mueste todos esos datos en una paacuteginaweb Copia el archivo listadoSociosjsp1 a la carpeta principal del proyecto (donde estaacuteindexhtml) Para ejecutarlo haz clic con el botoacuten derecho y selecciona EjecutarA continuacioacuten tienes el coacutedigo JSP del listado de socios

1httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDBaloncestolistadoSociosjsp

Acceso a bases de datos 198

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtListado Socioslttitlegt

ltheadgt

ltbodygt

lth1gtListado de Socioslth1gt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balonce

storoot root)

Statement s = conexioncreateStatement()

ResultSet listado = sexecuteQuery (SELECT FROM socio)

while (listadonext())

outprintln(listadogetString(socioID) + + listadogetString(nombre) + ltbrgt

)

conexionclose()

gt

ltbodygt

lthtmlgt

Si todo ha salido bien al ejecutar el archivo - haciendo clic con el botoacuten derecho sobreel archivo y seleccionando Ejecutar - veraacutes por pantalla un listado como el siguientecon el nuacutemero y el nombre de cada socio

Acceso a bases de datos 199

Vamos a ldquodiseccionarrdquo el coacutedigo Las siguientes tres liacuteneas son obligatorias y deberaacutescopiarlas en todas las paacuteginas JSP que accedan a una base de datos Lo uacutenico quetendraacutes que cambiar es el nombre de la base de datos - la de nuestro ejemplo sellama baloncesto - seguacuten el caso

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306baloncesto

root root)

Statement s = conexioncreateStatement()

La siguiente liacutenea ejecuta la consulta

SELECT FROM socio

sobre la base de datos y guarda el resultado en el objeto listado Esta consulta extraetodos los datos () de la tabla socio Si quisieacuteramos obtener esos datos ordenados pornombre la consulta seriacutea

SELECT FROM socio ORDER BY nombre

Aquiacute estaacute la liacutenea en cuestioacuten

Acceso a bases de datos 200

ResultSet listado = sexecuteQuery (SELECT FROM socio)

Una vez extraiacutedos los datos en bruto hace falta ir sacando cada uno de los registroses decir cada una de las liacuteneas En cada liacutenea se van a mostrar los datos de un socioPara ello usamos un while que va extrayendo liacuteneas mientras quede alguna en el objetolistado

while (listadonext())

outprintln(listadogetString(socioID) + + listadogetString(nombre) + ltbrgt)

Observa que el meacutetodo getString toma como paraacutemetro el nombre de un campoEn este ejemplo estamos mostrando uacutenicamente los nuacutemeros de socio con suscorrespondientes nombres Si quisieacuteramos mostrar tambieacuten la altura de cada sociola podemos extraer mediante listadogetString(altura)

134 Alta

Para dar de alta un nuevo socio necesitamos recoger los datos mediante un formularioque puede ser un programa JSP o simplemente una paacutegina HTML Estos datos recogidospor el formulario seraacuten enviados a otra paacutegina encargada de grabarlos en la tabla socio

de la base de datos baloncesto mediante el comando INSERT de SQLA continuacioacuten se muestra el coacutedigo de formularioSociojsp que recoge los datos delnuevo socio Como puedes comprobar es un simple formulario HTML y no contienecoacutedigo en Java

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgtlthtmlgtltheadgtltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgtltbodygtlth2gtIntroduzca los datos del nuevo sociolth2gtltform method=get action=grabaSociojspgtNordm socio ltinput type=text name=numerogtltbrgtNombre ltinput type=text name=nombregtltbrgtEstatura ltinput type=text name=estaturagtltbrgtEdad ltinput type=text name=edadgtltbrgtLocalidad ltinput type=text name=localidadgtltbrgtltinput type=submit value=Aceptargt

ltformgtltbodygt

lthtmlgt

Acceso a bases de datos 201

El siguiente programa - grabaSociojsp - se encarga de tomar los datos que enviacuteaformularioSociojsp y grabarlos en la base de datosIgual que en los programas del capiacutetulo 12 incluimos esta liacutenea para poder recogercorrectamente cadenas de caracteres que contienen tildes la letra ntilde etc

requestsetCharacterEncoding(UTF-8)

La variable insercion es una cadena de caracteres en la que se va componiendo a basede ir juntando trozos la sentencia SQL correspondiente a la insercioacuten

String insercion = INSERT INTO socio VALUES (

+ IntegervalueOf(requestgetParameter(numero))

+ + requestgetParameter(nombre)

+ + IntegervalueOf(requestgetParameter(estatura))

+ + IntegervalueOf(requestgetParameter(edad))

+ + requestgetParameter(localidad) + )

Una vez que se han recogido los datos del formulario y se ha creado la cadena en lavariable insercion deberiacutea quedar algo como esto

INSERT INTO socio VALUES (6789 Brito Fino Alan 180 40 Benalmaacutedena)

Por uacuteltimo se ejecuta la sentencia de insercioacuten mediante sexecute(insercion)A continuacioacuten tienes el coacutedigo completo de grabaSociojsp

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

requestsetCharacterEncoding(UTF-8)

Acceso a bases de datos 202

String insercion = INSERT INTO socio VALUES (

+ IntegervalueOf(requestgetParameter(numero))

+ + requestgetParameter(nombre)

+ + IntegervalueOf(requestgetParameter(estatura))

+ + IntegervalueOf(requestgetParameter(edad))

+ + requestgetParameter(localidad) + )

sexecute(insercion)

conexionclose()

gt

Socio dado de alta

ltbodygt

lthtmlgt

Al componer una sentencia SQL concatenando trozos es frecuente que seproduzcan errores porque faltan o sobran comillas pareacutentesis comas etc Sise produce un error al ejecutar la sentencia la manera maacutes faacutecil de detectarloes mostrar por pantalla la sentencia Por ejemplo si la sentencia es unainsercioacuten de datos y la cadena de caracteres que la contiene se llama insercioncomo en el ejemplo que acabamos de ver simplemente tendriacuteamos queescribir outprintln(insercion)

135 Borrado

El borrado al igual que el alta se realiza en dos pasos En el primer paso se carga lapaacutegina pideNumeroSociojsp que muestra en una tabla todos los socios cada uno en unafila Junto a cada socio se coloca un botoacuten borrar que al ser pulsado enviacutea el nuacutemerode socio a la paacutegina borraSociojsp que se encarga de ejecutar la sentencia SQL deborradoLa tabla con los socios y los botones de borrado quedariacutea como se muestra acontinuacioacuten

Acceso a bases de datos 203

A continucacioacuten se muestra el coacutedigo de pideNumeroSociojsp El fichero estiloscss2 seencuentra disponible en GitHub igual que el resto de archivos

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltlink rel=stylesheet type=textcss href=estiloscss gt

ltheadgt

ltbodygt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

2httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDBaloncestoestiloscss

Acceso a bases de datos 204

ResultSet listado = sexecuteQuery (SELECT FROM socio)

gt

lttablegt

lttrgtltthgtCoacutedigoltthgtltthgtNombreltthgtltthgtEstaturaltthgtltthgtEdadltthgtltthgtLocalidadltthgtlt

trgt

lt

while (listadonext())

outprintln(lttrgtlttdgt)

outprintln(listadogetString(socioID) + lttdgt)

outprintln(lttdgt + listadogetString(nombre) + lttdgt)

outprintln(lttdgt + listadogetString(estatura) + lttdgt)

outprintln(lttdgt + listadogetString(edad) + lttdgt)

outprintln(lttdgt + listadogetString(localidad) + lttdgt)

gt

lttdgt

ltform method=get action=borraSociojspgt

ltinput type=hidden name=codigo value=lt=listadogetString(socioID) gtgt

ltinput type=submit value=borrargt

ltformgt

lttdgtlttrgt

lt

whileconexionclose()

gt

lttablegt

ltbodygt

lthtmlgt

A continuacioacuten se muestra el coacutedigo de borraSociojsp Como puedes comprobar lasentencia SQL que borra el registro deseado es un DELETE que toma como referencia elnuacutemero de socio para realizar el borrado

ltpage import=javasqlResultSetgt

ltpage import=javasqlStatementgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

Acceso a bases de datos 205

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

sexecute (DELETE FROM socio WHERE socioID= + requestgetParameter(codigo))

gt

ltscriptgtdocumentlocation = pideNumeroSociojspltscriptgt

ltbodygt

lthtmlgt

136 CRUD completo con Bootstrap

Los programas que ofrecen la posibilidad de hacer listados y de realizar modificacionesy borrado sobre los registros de una tabla se denominan CRUD que son las siglas eningleacutes de Create Read Update y Delete en espantildeol se diriacutea que es un programa dealta listado modificacioacuten y borrado El coacutedigo fuente completo estaacute disponible en lacarpeta BaloncestoMejorado de nuestro repositorio en GitHub3

Para dar de alta un nuevo socio simplemente habriacutea que rellenar los campos delformulario que aparecen en la primera liacutenea y hacer clic en el botoacuten Antildeadir Laaplicacioacuten comprueba si el nuacutemero de socio introducido ya existe en la base de datosy en tal caso muestra un mensaje de error recuerda que el nuacutemero de socio es uacutenico

3httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciostreemasterejemplos13_JSP_y_BBDDBaloncestoMejorado

Acceso a bases de datos 206

El borrado se lleva a cabo de la misma manera que en el ejemplo del apartado anteriorEl botoacuten Modificar nos lleva a otra paacutegina que contiene un formulario con todos losdatos del socio donde podemos modificar la informacioacuten necesaria A continuacioacuten semuestra una captura

Para los estilos - colores botones iconos etc - hemos utilizado Boostrap4 Boostrapes un framework que incluye unos estilos predefinidos para que con solo incluirloen nuestro proyecto la aplicacioacuten tenga una apariencia bonita y homogeacutenea Puedesencontrar maacutes informacioacuten de coacutemo utilizar este framework en la paacutegina oficial deBoostrap5

4httpgetbootstrapcom5httpgetbootstrapcom

Acceso a bases de datos 207

137 Ejercicios

Ejercicio 1Establece un control de acceso mediante nombre de usuario y contrasentildeapara alguno de los programas de la relacioacuten anterior (por ejemplo el quepinta una piraacutemide) Lo primero que apareceraacute por pantalla seraacute un formulariopidiendo el nombre de usuario y la contrasentildea Si el usuario y la contrasentildea soncorrectos se podraacute acceder al ejercicio en caso contrario volveraacute a aparecerel formulario pidiendo los datos de acceso y no se nos dejaraacute ejecutar laaplicacioacuten hasta que iniciemos sesioacuten con un nombre de usuario y contrasentildeacorrectos Los nombres de usuario y contrasentildeas deben estar almacenados enla tabla de una base de datos

Acceso a bases de datos 208

Ejercicio 2Mejora el programa anterior de tal forma que se puedan dar de alta nuevosusuarios para acceder a la aplicacioacuten Si se introduce un nombre de usuarioque no sea el administrador (admin) y una contrasentildea correcta la aplicacioacutenfuncionaraacute exactamente igual que el ejercicio anterior Si se introduce elusuario admin y la contrasentildea correcta la aplicacioacuten entra en la gestioacuten deusuarios donde se podraacuten dar de alta nuevos usuarios indicando nombre deusuario y contrasentildea No puede haber dos nombres de usuario iguales aunquesiacute puede haber claves repetidas

Acceso a bases de datos 209

Ejercicio 3Ampliacutea el programa anterior para que se pueda asignar o quitar permiso paraejecutar las aplicaciones de la relacioacuten anterior a los distintos usuarios Porejemplo que se pueda especificar que el usuario ldquojaimitordquo pueda ejecutar losejercicios 2 3 y 5 Para ello en la base de datos deberaacute existir una tabla con lasparejas (usuario nordm ejercicio) Por ejemplo si el usuario ldquojaimitordquo tiene accesoa los ejercicios 2 3 y 5 en la tabla correspondiente estaraacuten las parejas (jaimito2) (jaimito 3) y (jaimito 5) Lo ideal es que la asignacioacuten de permisos se hagamediante el marcado de muacuteltiples ldquocheckboxrdquo

Acceso a bases de datos 210

Ejercicio 4Crea una aplicacioacuten web que permita hacer listado alta baja y modificacioacutensobre la tabla cliente de la base de datos banco Un cliente tiene su identifica-dor nombre completo direccioacuten teleacutefono y fecha de nacimiento

Acceso a bases de datos 211

Ejercicio 5Ampliacutea el programa anterior para que se pueda hacer una buacutesqueda por nom-bre El programa buscaraacute la cadena introducida dentro del campo ldquonombrerdquoy si hay varias coincidencias se mostraraacute una lista de clientes para poderseleccionar uno de ellos y ver todos los datos Si solo hay una coincidencia semostraraacuten directamente los datos del cliente en cuestioacuten

Acceso a bases de datos 212

Ejercicio 6Crea una versioacuten web del programa GESTISIMAL (GESTIoacuten SIMplifcada deAlmaceacuten) para llevar el control de los artiacuteculos de un almaceacuten De cada artiacuteculose debe saber el coacutedigo la descripcioacuten el precio de compra el precio de ventay el stock (nuacutemero de unidades) La entrada y salida de mercanciacutea suponerespectivamente el incremento y decremento de stock de un determinadoartiacuteculo Hay que controlar que no se pueda sacar maacutes mercanciacutea de la que hayen el almaceacuten Aprovecha las opciones que puede ofrecer una interfaz webpor ejemplo para eliminar un artiacuteculo ya no seraacute necesario pedir el coacutedigo sinoque se puede mostrar un listado de todos los artiacuteculos de tal forma que sepuedan borrar un artiacuteculo directamente pulsando un botoacuten

213

Apeacutendice A Ejercicios de ampliacioacuten 214

Apeacutendice A Ejercicios de ampliacioacuten

Ejercicio 1 Transcomunicacioacuten instrumental mediante ficherosde texto digitalesSe conoce la transcomunicacioacuten instrumental (TCI) como la teacutecnica decomunicacioacuten que utiliza aparatos electroacutenicos para establecer comunicacioacutencon los espiacuteritus El caso de TCI maacutes conocido es el de la psicofoniacuteaPara realizar una psicofoniacutea se pone a grabar al aire un dispositivo en unlugar donde previamente hayan ocurrido fenoacutemenos extrantildeos o simplementese invoca la entidad que queremos que se comunique mediante el ritualadecuado Posteriormente se escucha la grabacioacuten para comprobar si se hagrabado algo un mensaje una palabra un grito un lamentohellipLos sonidos extrantildeos se graban gracias a lo que se llama en teacuterminosparapsicoloacutegicos una sentildeal portadora puede ser el chasquido de una ramauna racha de viento un golpe La entidad comunicante aprovecha ese sonidopara supuestamente moldearlo y convertirlo en un mensaje inteligible Muchasde las psicofoniacuteas se realizan utilizando como portadora el ruido que produceuna radio que no estaacute sintonizadaEl ejercicio que se propone es la realizacioacuten de un programa que permitarealizar la TCI mediante la creacioacuten y el posterior anaacutelisis de ficherosde textoEn primer lugar el programa deberaacute generar la portadora que seraacute un ficherode texto creado con caracteres producidos de forma aleatoria Se podraacutenespecificar varios paraacutemetros como el nuacutemero de liacuteneas o paacuteginas que sequieren generar si se incluyen letras uacutenicamente o bien letras y nuacutemerosfrecuencia aproximada de espacios saltos de liacutenea y signos de puntuacioacutenetc Se obtienen portadoras de calidad - con maacutes probabilidad de contenermensajes - cuando la proporcioacuten de las letras que contienen eacutestas coincidecon las del idioma espantildeolFrecuencia de aparicioacuten de letrashttpeswikipediaorgwikiFrecuencia_de_apariciC3B3n_de_letras

Una vez creado el fichero de texto el programa deberaacute ser capaz de analizarloal menos de una forma superficial de modo que nos resulte faacutecil encontrar losposibles mensajes Para realizar este anaacutelisis el programa iraacute comparandouna a una todas las palabras que aparecen en el texto con las que hay enel diccionario de espantildeol En caso de coincidencia la palabra o palabrasencontradas deben aparecer resaltadas con un color diferente al resto deltexto o bien en viacutedeo inverso Opcionalmente se pueden mostrar estadiacutesticascon el nuacutemero total de palabras encontradas distancia media entre esaspalabras palabras reales por cada mil palabras generadas etcEl alumno puede encontrar ficheros con las palabras que tiene el idiomaespantildeol en formato digital en la siguiente direccioacuten Se trata de una muestrahay otros muchos diccionarios disponibles en internethttplasrcsuclaedugeoffispell-dictionarieshtmlSpanish-dicts

Apeacutendice A Ejercicios de ampliacioacuten 215

Ejercicio 2 Coleccioacuten de discos ampliado (con canciones)Este ejercicio consiste en realizar una mejora del ejercicio del capiacutetulo 10que permite gestionar una coleccioacuten de discos Ahora cada disco contienecanciones Deberaacutes crear la clase Cancion con los atributos y meacutetodos queestimes oportunos Antildeade el atributo canciones a la clase Disco Este atributocanciones debe ser un array de objetos de la clase CancionFiacutejate bien que Cancion NO ES una subclase de Disco sino que ahora cadadisco puede tener muchas canciones que estaacuten almacenadas en el atributocancionesModifica convenientemente el meacutetodo toString para que al mostrarse los datosde un disco se muestre tambieacuten la informacioacuten sobre las canciones quecontieneLa aplicacioacuten debe permitir antildeadir borrar y modificar las canciones de losdiscos

Apeacutendice B Entorno de Desarrollo IntegradoNetbeansNetbeans es un IDE (Integrated Development Environment) es decir un Entornode Desarrollo Integrado Consta de un potente editor y de todas las herramientasnecesarias para codificar compilar depurar y ejecutar una aplicacioacutenEste IDE tiene algunas caracteriacutesticas que lo hacen muy atractivo para los programa-dores

bull Es el IDE oficial para desarrollar en Java6bull Chequea errores de sintaxis y da advertencias al mismo tiempo que se escribe el

coacutedigobull Tiene autocompletado inteligente de palabras clave clases meacutetodos paraacuteme-

troshellipbull Permite depurar una aplicacioacuten ejecutaacutendola paso a paso y ver el contendido de

todas las variables en tiempo realbull Soporta muchos lenguajes de programacioacuten ademaacutes de Java PHP Groovy HTML

XML Javascript JSPhellipbull Existe una gran variedad de plugins que ampliacutean las funcionalidades del entorno

Descarga e instalacioacuten

Netbeans se puede descargar de forma gratuita y para cualquier plataforma desdehttpsnetbeansorgdownloads

6Esto no es casualidad ya que es la misma empresa - Oracle - la que estaacute detraacutes del desarrollo de Java y tambieacuten la quesoporta Netbeans

216

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 217

Figura B1 Descarga de Netbeans

El programa de instalacioacuten de Netbeans estaacute disponible en varios paquetes seguacutenel lenguaje de programacioacuten y las tecnologiacuteas que se incluyen En el momento deescribir este libro los paquetes disponibles son Java SE Java EE HTML5JavaScriptPHP CC++ All Este uacuteltimo paquete (All) instala todos los lenguajes y tecnologiacuteasdisponibles para el IDE (sin contar los plugins) Para seguir este libro es suficientecon la versioacuten Java EE sin embargo animo al lector a descargar la versioacuten completa yexperimentar con otros lenguajes diferentes a Java por ejemplo con PHP7

Configuracioacuten

En los ejemplos y soluciones a los ejercicios de este libro nos centildeimos al los estaacuten-dares de programacioacuten de Google para el coacutedigo fuente escrito en el lenguaje deprogramacioacuten Java8 Por tanto despueacutes de la instalacioacuten de Netbeans es necesariorealizar algunso ajustes en la configuracioacuten del editor para cumplir con las siguientescondiciones

7httpsleanpubcomaprendephpconejercicios8httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 218

bull La tecla TAB debe insertar espacios no debe insertar el caraacutecter de tabulacioacutenbull La indentacioacuten debe ser de 2 caracteres (por defecto suele estar a 4)bull La condificacioacuten de caracteres debe ser UTF-8

Para ello selecciona Herramientas rarr Opciones rarr Editor A continuacioacuten seleccionala pestantildea Formato y en el menuacute desplegable correspondiente al lenguaje deprogramacioacuten selecciona Java La configuracioacuten deberiacutea quedar como se indica enla imagen

Figura B2 Configuracioacuten de Netbeans

Creacioacuten de un proyecto

Sigue los pasos que damos a continuacioacuten para crear un nuevo proyecto de Java enNetbeansEn primer lugar desde el menuacute principal selecciona Archivo y a continuacioacuten NuevoProyecto Se puede hacer maacutes raacutepido con la combinacioacuten Control + Mayuacutescula + NVeraacutes que aparece una ventana emergente para elegir el tipo de proyecto SeleccionaJava en el apartado ldquoCategoriacuteasrdquo y Aplicacioacuten Java en el apartado ldquoProyectosrdquo Hazclic en Siguiente

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 219

Figura B3 Nuevo proyecto en Java

Ahora es necesario darle el nombre al proyecto lo puedes llamar por ejemplo SaludoRecuerda no utilizar caracteres especiales ni signos de puntuacioacuten Se crearaacute unacarpeta con el mismo nombre que el proyecto que contendraacute todos los ficherosnecesarios Aseguacuterate de que la casilla Crear la clase principal estaacute marcada Hazclic en Terminar

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 220

Figura B4 Proyecto ldquoSaludordquo

Veraacutes que se ha creado el ldquoesqueletordquo de la aplicacioacuten La clase principal se llamaSaludo y contiene el main que seraacute el cuerpo principal del programa Observa que en laparte de la izquierda donde estaacuten todos los proyectos que se van realizando puedesver la estructura de carpetas y ficheros El coacutedigo fuente de nuestra aplicacioacuten estaacuteen el fichero Saludojava Escribe dentro del main la siguiente liacutenea

Systemoutprintln(iexclHola mundo)

Para guardar compilar y ejecutar basta con hacer clic en el botoacuten verde con el iconode Play o bien pulsar la tecla F6

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 221

Figura B5 Ejecucioacuten del proyecto

Si todo ha salido bien veraacutes el mensaje iexclHola mundo en la ventana de terminal integradade Netbeans que hay justo debajo del editor

Depuracioacuten

El entornoNetbeans permite la depuracioacuten paso a paso de un programa En ocasioneses complicado encontrar y corregir los fallos de una aplicacioacuten y ayuda mucho tenerla posibilidad de ir ejecutando un programa liacutenea a liacutenea y ver coacutemo van cambiandolas variablesPara ilustrar la depuracioacuten paso a paso vamos a utilizar un programa de ejemplo delCapiacutetulo 7 Arrays en concreto usaremos el coacutedigo de Array03javaCrea un nuevo proyecto de Java como se ha indicado en el apartado anterior y llaacutemaloArray03 A continuacioacuten copia el contenido del main del fichero Array03java en tuproyecto Ten cuidado de no borrar la liacutenea package array03Comenzaremos la ejecucioacuten paso a paso del programa pulsando de manera sucesivala tecla F7

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 222

Figura B6 Ejecucioacuten paso a paso

Observa coacutemo Netbeans resalta una liacutenea la ejecuta se detiene y espera quesigamos pulsando F7 En la parte de abajo ha aparecido una nueva ventana que resultatremendamente uacutetil Se trata de una zona donde puedes ver en tiempo real el valorque tiene cada variable (por supuesto se incluyen los arrays)Ve pulsando F7 hasta colocarte en la liacutenea siguiente

num[2] = 200

En la ventana inferior donde aparecen todos los datos despliega el array num veraacutesque los elementos 0 y 1 ya tienen los valores 8 y 33 respectivamente Si vuelves apulsar F7 veraacutes que ahora en la posicioacuten 2 se ha almacenado el 200Para salir del modo ldquopaso a pasordquo y terminar de ejecutar el programa pulsa F5Ademaacutes de la ejecucioacuten ldquopaso a pasordquo tambieacuten resultan muy uacutetiles los puntos deruptura o breakpoints Se trata de marcas a modo de sentildeales de STOP dondeindicamos pausas en la ejecucioacuten del programa La depuracioacuten de un programa devarios cientos o miles de liacuteneas puede ser muy tediosa si se ejecuta cada liacutenea paso a

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 223

paso con F7 Los breakpoints permiten parar la ejecucioacuten en liacuteneas concretas dondequeremos ver con maacutes detalle queacute estaacute sucediendo en nuestro programaVamos a colocar varios breakpoints en nuestro coacutedigo Haz clic sobre las liacuteneas 15 20y 24 (justo encima del nuacutemero de liacutenea) Observa que estas liacuteneas quedan marcadascon un pequentildeo cuadradito

Figura B7 Breakpoints

Pulsa la combinacioacuten de teclas Control + F5 Observa coacutemo el programa empiezaa ejecutarse con normalidad y se para justo en la liacutenea 15 donde estaacute el primerbreakpoint Pulsando ahora F5 el programa continuacutea ejecutaacutendose hasta que se paraen la liacutenea 20 donde estaacute el segundo breakpoint Otra pulsacioacuten de F5 hace quecontinuacutee la ejecucioacuten hasta la liacutenea 24 Una uacuteltima pulsacioacuten de esta tecla hace que elprograma continuacutee la ejecucioacuten hasta el final

Apeacutendice C Caracteres especialesLiacuteneas para tablas

Bloques

⊞ ⊟ ⊠ ⊡

Figuras de ajedrez

Ciacuterculos

oplus ⊖ otimes ⊘ ⊙ ⊛ ⊜ ⊝ ⴱ ⴲ ⵀ ⵁ ⵔ ⵕ ⵙ ⵚ

Flechas

larr uarr rarr darr harr ↚ ↛ ↠ ↣ ↦ ↮ crarr ⇎ ⇏ lArr uArr rArr dArr hArr ⇴ ⇵ ⇶ ⇷ ⇸ ⇹ ⇺ ⇻ ⇼ ⇽ ⇾ ⇿

Nuacutemeros en ciacuterculos

❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓

Dados

Fichas de dominoacute

127024 127025 127026 127027 127028 127029 127030 127031 127032 127033 127034 127035 127036 127037 127038 127039 127040 127041 127042 127043 127044 127045 127046 127047 127048 127049127050 127051 127052 127053 127054 127055 127056 127057 127058 127059 127060 127061 127062 127063 127064 127065 127066 127067 127068 127069 127070 127071 127072 127073 127074 127075127076 127077 127078 127079 127080 127081 127082 127083 127084 127085 127086 127087 127088 127089 127090 127091 127092 127093 127094 127095 127096 127097 127098 127099 127100 127101 127102 127103 127104 127105 127106 127107 127108 127109 127110 127111 127112 127113127114 127115 127116 127117 127118 127119 127120 127121 127122 127123

224

Apeacutendice C Caracteres especiales 225

Cartas

127136 127137 127138 127139 127140 127141 127142 127143 127144 127145 127146 127147 127148 127149 127150 127153 127154 127155 127156 127157 127158 127159 127160 127161 127162 127163 127164 127165 127166 127169 127170 127171127172 127173 127174 127175 127176 127177 127178 127179 127180 127181 127182 127183 127185 127186 127187 127188 127189 127190 127191 127192 127193 127194 127195 127196 127197 127198 127199

Caras

128045 128046 128049 128053 128512 128513 128514 128515 128516 128517 128518 128519 128520 128521 128522 128523 128524 128525 128526 128527 128528 128529 128530 128531 128532 128533 128534 128535 128536128537 128538 128539 128540 128541 128542 128543 128544 128545 128546 128547 128549 128550 128551 128552 128553 128554 128555 128557 128558 128559 128560 128561 128562 128563 128564 128565 128566 128567 128568 128569128570 128571 128572 128573 128574 128575 128576

Horoacutescopo

Miscelaacutenea

Ω ꙮ

  • Tabla de contenidos
  • Sobre este libro
  • Sobre el autor
  • Centros en los que se usa este libro
  • Introduccioacuten
  • Instalacioacuten y configuracioacuten del entorno de programacioacuten Java
  • iexclHola mundo - Salida de datos por pantalla
    • iexclHola mundo - Mi primer programa
    • Coloreado de texto
    • Ejercicios
      • Variables
        • Definicioacuten y tipos de variables
          • Enteros (int y long)
          • Nuacutemeros decimales (double y float)
          • Cadenas de caracteres (String)
            • Operadores artimeacuteticos
            • Asignacioacuten de valores a variables
            • Conversioacuten de tipos (casting)
            • Ejercicios
              • Lectura de datos desde teclado
                • Lectura de texto
                • Lectura de nuacutemeros
                • La clase Scanner
                • Ejercicios
                  • Sentencia condicional (if y switch)
                    • Sentencia if
                    • Operadores de comparacioacuten
                    • Operadores loacutegicos
                    • Sentencia switch (seleccioacuten muacuteltiple)
                    • Ejercicios
                      • Bucles
                        • Bucle for
                        • Bucle while
                        • Bucle do-while
                        • Ejercicios
                          • Nuacutemeros aleatorios
                            • Generacioacuten de nuacutemeros aleatorios con y sin decimales
                            • Generacioacuten de palabras de forma aleatoria de un conjunto dado
                            • Ejercicios
                              • Arrays
                                • Arrays de una dimensioacuten
                                • Arrays bidimensionales
                                • Recorrer arrays con for al estilo foreach
                                • Ejercicios
                                  • Arrays de una dimensioacuten
                                  • Arrays bidimensionales
                                      • Funciones
                                        • Implementando funciones para reutilizar coacutedigo
                                        • Comentarios de funciones
                                        • Creacioacuten de bibliotecas de rutinas mediante paquetes
                                        • Aacutembito de las variables
                                        • Paso de paraacutemetros por valor y por referencia
                                        • Ejercicios
                                          • Programacioacuten orientada a objetos
                                            • Clases y objetos
                                            • Encapsulamiento y ocultacioacuten
                                            • Meacutetodos
                                              • Creiacute haber visto un lindo gatito
                                              • Meacutetodos getter y setter
                                              • Meacutetodo toString
                                                • Aacutembitovisibilidad de los elementos de una clase - public protected y private
                                                • Herencia
                                                  • Sobrecarga de meacutetodos
                                                    • Atributos y meacutetodos de clase (static)
                                                    • Interfaces
                                                    • Arrays de objetos
                                                    • Ejercicios
                                                      • Conceptos de POO
                                                      • POO en Java
                                                      • Arrays de objetos
                                                          • Colecciones y diccionarios
                                                            • Colecciones la clase ArrayList
                                                              • Principales meacutetodos de ArrayList
                                                              • Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de sus elementos
                                                              • ArrayList de objetos
                                                              • Ordenacioacuten de un ArrayList
                                                                • Diccionarios la clase HashMap
                                                                  • Principales meacutetodos de HashMap
                                                                  • Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas
                                                                    • Ejercicios
                                                                      • Ficheros de texto y paso de paraacutemetros por liacutenea de comandos
                                                                        • Lectura de un fichero de texto
                                                                        • Escritura sobre un fichero de texto
                                                                        • Lectura y escritura combinadas
                                                                        • Otras operaciones sobre ficheros
                                                                        • Paso de argumentos por liacutenea de comandos
                                                                        • Combinacioacuten de ficheros y paso de argumentos
                                                                        • Procesamiento de archivos de texto
                                                                        • Ejercicios
                                                                          • Aplicaciones web en Java (JSP)
                                                                            • Hola Mundo en JSP
                                                                            • Mezclando Java con HTML
                                                                            • Recogida de datos en JSP
                                                                            • POO en JSP
                                                                            • Ejercicios
                                                                              • Acceso a bases de datos
                                                                                • Socios de un club de baloncesto
                                                                                • Preparacioacuten del proyecto de ejemplo
                                                                                  • Activar la conexioacuten a MySQL
                                                                                  • Incluir la libreriacutea MySQL JDBC
                                                                                    • Listado de socios
                                                                                    • Alta
                                                                                    • Borrado
                                                                                    • CRUD completo con Bootstrap
                                                                                    • Ejercicios
                                                                                      • Apeacutendice A Ejercicios de ampliacioacuten
                                                                                      • Apeacutendice B Entorno de Desarrollo Integrado Netbeans
                                                                                        • Descarga e instalacioacuten
                                                                                        • Configuracioacuten
                                                                                        • Creacioacuten de un proyecto
                                                                                        • Depuracioacuten
                                                                                          • Apeacutendice C Caracteres especiales
                                                                                            • Liacuteneas para tablas
                                                                                            • Bloques
                                                                                            • Figuras de ajedrez
                                                                                            • Ciacuterculos
                                                                                            • Flechas
                                                                                            • Nuacutemeros en ciacuterculos
                                                                                            • Dados
                                                                                            • Fichas de dominoacute
                                                                                            • Cartas
                                                                                            • Caras
                                                                                            • Horoacutescopo
                                                                                            • Miscelaacutenea
Page 5: Aprende Java con Ejercicios - DAM

IacuteNDICE GENERAL

Apeacutendice C Caracteres especiales 224Liacuteneas para tablas 224Bloques 224Figuras de ajedrez 224Ciacuterculos 224Flechas 224Nuacutemeros en ciacuterculos 224Dados 224Fichas de dominoacute 224Cartas 225Caras 225Horoacutescopo 225Miscelaacutenea 225

Sobre este libroldquoAprende Java con Ejerciciosrdquo es un manual praacutectico para aprender a programar enJava desde ceroNo es necesario tener conocimientos previos de programacioacuten La dificultad del libroes gradual empieza con conceptos muy baacutesicos y ejercicios muy sencillos y vaaumentando en complejidad y dificultad a medida que avanzan los capiacutetulosLa praacutectica hace al maestro Como de verdad se aprende a programar es programandodesde el principio y esa es la filosofiacutea que sigue este libro En cada capiacutetulo se explicanuna serie de conceptos de programacioacuten y se ilustran con ejemplos Al final de cadauno de los capiacutetulos se plantean ejercicios de diferente dificultadEste libro contiene maacutes de 200 ejercicios Tanto las soluciones a los ejercicios como losejemplos estaacuten disponibles en GitHub httpsgithubcomLuisJoseSanchezaprende-java-con-ejercicios y tanto los unos como los otros siguen los estaacutendares de programacioacutende Google para el coacutedigo fuente escrito en el lenguaje de programacioacuten Java1ldquoAprende Java con Ejerciciosrdquo es un libro hecho casi a medida de la asignatura ldquoProgra-macioacutenrdquo que forma parte del curriacuteculo del primer curso de los ciclos formativos DAW(Desarrollo de Aplicaciones Web) y DAM (Desarrollo de Aplicaciones Multiplataforma)pero igualmente puede ser utilizado por estudiantes de Ingenieriacutea Informaacutetica Ingenie-riacutea de Telecomunicaciones o Ciencias Matemaacuteticas en la asignatura de ldquoProgramacioacutenrdquode los primeros cursosSi tienes alguna duda o quieres hacer alguacuten comentario en relacioacuten a este libro tienesa tu disposicioacuten el grupo de Google httpsgroupsgooglecomdforumaprende-java-con-ejercicios Cualquier sugerencia para mejorar este manual seraacute bienvenida

1httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

i

Sobre el autorLuis Joseacute Saacutenchez Gonzaacutelez es Ingeniero Teacutecnico en Informaacutetica de Gestioacuten por laUniversidad de Maacutelaga (Espantildea) y funcionario de carrera de la Junta de Andaluciacuteadesde 1998 En su trabajo de profesor de Informaacutetica combina sus dos pasiones laensentildeanza y la programacioacutenEn el momento de publicar este libro es profesor del IES Campanillas (Maacutelaga) eimparte clases en el Ciclo Superior de Desarrollo de Aplicaciones WebPuedes ponerte en contacto con el autor mediante la direccioacuten de correo electroacute-nico luisjoseprofegmailcom o mediante LinkedIn (httpseslinkedincompubluis-joseacute-saacutenchez86b0834)

ii

Centros en los que se usa este librobull IES Campanillas Maacutelaga (Espantildea)bull IES Poliacutegono Sur Sevilla (Espantildea)bull IES Murgi El Ejido - Almeriacutea (Espantildea)bull IES Punta del Verde Sevilla (Espantildea)

Si eres profesor y utilizas este libro para ensentildear Java piacutedele al autor que antildeada enesta seccioacuten el nombre de tu centro educativo o empresa escribiendo un correo a ladireccioacuten luisjoseprofegmailcom indicando la localidad y el paiacutes del centro

iii

IntroduccioacutenJava es un lenguaje de programacioacuten es de hecho desde hace maacutes de 10 antildeos ellenguaje de programacioacuten maacutes utilizado en el mundo seguacuten el iacutendice PYPL2(PopularitYof Programming Language index)Los ordenadores no entienden - por ahora - el espantildeol ni el ingleacutes ni ninguacuten otroidioma natural De una forma muy simplificada podriacuteamos decir que un lenguaje deprogramacioacuten es un idioma que entiende el ordenador3 Cualquier aplicacioacuten - proce-sador de textos navegador programa de retoque fotograacutefico etc - estaacute compuesta deuna serie de instrucciones convenientemente empaquetadas en ficheros que le dicenal ordenador de una manera muy precisa queacute tiene que hacer en cada momentoJava es un lenguaje de programacioacuten estructurado y como tal hace uso de variablessentencias condicionales bucles funcioneshellip Java es tambieacuten un lenguaje de progra-macioacuten orientado a objetos y por consiguiente permite definir clases con sus meacutetodoscorrespondientes y crear instancias de esas clases Java no es un lenguaje de marcascomo HTML o XML aunque puede interactuar muy bien con ellos4Las aplicaciones Java se suelen compilar a bytecode que es independiente del sistemaoperativo no a binario que siacute depende del sistema operativo De esta forma elbytecode generado al compilar un programa escrito en Java deberiacutea funcionar encualquier sistema operativo que tenga instalada una maacutequina virtual de java (JVM)Cualquier editor simple como Nano o GEdit es suficiente para escribir coacutedigo enJava aunque se recomiendan IDEs5 como NetBeans o Eclipse ya que tienen algunascaracteriacutesticas que facilitan mucho la programacioacuten como el chequeo de erroresmientras se escribe el autocompletado de nombres de variables y funciones y muchomaacutes

2httppyplgithubioPYPLhtml3En realidad un ordenador no entiende directamente los lenguajes de programacioacuten como Java C Ruby etc Mediante una

herramienta que se llama compilador o traductor seguacuten el caso lo que hay escrito en cualquiera de estos lenguajes se convierteen coacutedigo maacutequina - secuencias de unos y ceros - que es el uacutenico lenguaje que de verdad entiende el ordenador

4El lector deberaacute tener unos conocimientos baacutesicos de HTML para entender bien y sacar provecho del capiacutetulo relativo a JSPde este mismo libro Una web excelente para aprender HTML es httpw3schoolscom

5IDE Integrated Development Enviroment (Entorno de Desarrollo Integrado)

iv

Instalacioacuten y configuracioacuten del entorno deprogramacioacuten JavaTodos los ejemplos que contiene este libro asiacute como las soluciones a los ejerciciosse han escrito sobre Linux en concreto sobre Ubuntu (httpwwwubuntucom) Noobstante todo el coacutedigo deberiacutea compilar y funcionar sin ninguacuten problema en cualquierotra plataformaEl software necesario para seguir este manual es el siguiente6

OpenJDKEl Open Java Development Kit (OpenJDK) contiene una serie de componentesque permiten desarrollar y ejecutar aplicaciones escritas en Java Incluye la maacute-quina virtual de Java (JVM) que permite ejecutar bytecode Como mencionamosen el apartado Introduccioacuten el bytecode es el ejecutable en Java El OpenJDKtambieacuten incluye el compilador javac que permite compilar el coacutedigo fuente paragenerar el bytecode En Ubuntu basta ejecutar una liacutenea en la ventana determinal para instalar el OpenJDK

$ sudo apt-get install openjdk-8-jdk

Para los sitemas operativos Mac OS X y Windows se encuentran disponiblespara su descarga los archivos de instalacioacuten del OpenJDK en la paacutegina UnofficialOpenJDK installers for Windows Linux and Mac OS X7 Otra opcioacuten consiste enutilizar el JDK oficial de Oracle que se puede descargar en el apartado Java SEDevelopment Kit 8 - Downloads8 de la web de esta misma empresa No vamos aexplicar las diferencias entre el OpenJDK y el JDK ya que se escapa al aacutembitode este libro A efectos praacutecticos todos los ejemplos contenidos en este manualfuncionan tanto con en el OpenJDK como con el JDK y los ejercicios se puedenrealizar sin problema sea cual sea el kit de desarrollo instalado

Editor de textos simplePara seguir este manual recomendamos utilizar al principio un editor de textossencillo para probar los primeros programas y realizar los primeros ejercicioscompilando en liacutenea de comandos De esta manera el lector se va familiarizandocon el proceso de edicioacuten de coacutedigo compilacioacuten y ejecucioacuten y va entendiendo loque sucede en cada paso En Ubuntu viene instalado por defecto el editor GEditel sistema operativo Mac OS X viene con TextEdit y en Windows podemos usarel programa Bloc de notas

6En la paacutegina httphelloworldcollectionde se muestra el programa Hola mundo escrito en maacutes de 400 lenguajes deprogramacioacuten

7httpsgithubcomalexkaskoopenjdk-unofficial-builds8httpwwworaclecomtechnetworkjavajavasedownloadsjdk8-downloads-2133151html

v

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java vi

GeanyUna vez que el lector ha superado la barrera de escribir sus primeros programasrecomendamos utilizar el entorno de programacioacuten Geany (por ejemplo a partirdel capiacutetulo 2) Se trata de un IDE muy ligero que permite realizar aplicacionessencillas con rapidez Mediante Geany se puede escribir el coacutedigo chequearsi contiene errores compilar y ejecutar el bytecode generado Para programaspequentildeos - por ej calcular la media de varios nuacutemeros - es recomendable utilizarGeany en lugar de un IDE maacutes complejo como Netbeans Mientras con Geanyda tiempo a escribir el coacutedigo compilar y ejecutar Netbeans todaviacutea estariacuteaarrancandoInstalacioacuten de Geany (y los plugins adicionales) en Ubuntu

$ sudo apt-get install geany

$ sudo apt-get install geany-plugins

En la seccioacuten de descargas de la paacutegina oficial de Geany9 se encuentran losficheros de instalacioacuten de este programa tanto para Mac OS X como paraWindowsUna vez instalado Geany es conveniente realizar algunos ajustes en la configu-racioacuten Presiona Control + Alt + P para abrir la ventana de preferencias Hazclic en la pestantildea Editor y luego en la pestantildea Sangriacutea Establece las opcionestal y como se indican a continuacioacuten

9httpwwwgeanyorgDownloadReleases

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java vii

Figura 01 Configuracioacuten de Geany (sangriacutea)

Tambieacuten es recomendable marcar las casillas Mostrar guiacuteas de sangriacutea y Mostrarnuacutemeros de liacutenea Estas opciones se activan en la pestantildea Mostrar

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java viii

Figura 02 Configuracioacuten de Geany (guiacuteas de sangriacutea y nuacutemeros de liacutenea)

NetbeansCuando las aplicaciones a desarrollar son maacutes complejas y sobre todo cuandoeacutestas constan de varios ficheros se recomienda utilizar Netbeans de la empresaOracle En el capiacutetulo 9 el lector ya podriacutea sacarle mucho partido al uso de esteIDE Se trata de un entorno integrado muy potente y muy usado a nivel profesionalque incluye el autocompletado de sintaxis y permite una depuracioacuten avanzadapaso a paso Netbeans se puede descargar de forma gratuita y para cualquierplataforma desde httpsnetbeansorgdownloadsDespueacutes de la instalacioacuten de Netbeans procedemos a configurar el editorPara ello seleccionamos Herramientas rarr Opciones rarr Editor A continuacioacutenseleccionamos la pestantildea Formato y en el menuacute desplegable correspondiente allenguaje de programacioacuten seleccionamos Java La configuracioacuten deberiacutea quedarcomo se indica en la imagen

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java ix

Figura 03 Configuracioacuten de Netbeans

Es muy importante que los editoresIDEs que se utilicen para esribir coacutedigoen Java se configuren adecuadamente Hemos visto coacutemo configurar Geanyy Netbeans pero si el lector decide utilizar otras herramientas deberaacuteconfigurarlas igualmente En definitiva la configuracioacutenpreferencias de lasherramientas que se utilicen deben establecerse de tal forma que se cumplanestos requisitos

bull La tecla TAB debe insertar espacios no debe insertar el caraacutecter detabulacioacuten

bull La indentacioacuten debe ser de 2 caracteres (por defecto suele estar a 4)bull La condificacioacuten de caracteres debe ser UTF-8

1 iexclHola mundo - Salida de datos por pantalla

11 iexclHola mundo - Mi primer programa

El primer programa que aprende a hacer cualquier aspirante a programador es unHolamundo 1 Es seguramente el programa maacutes sencillo que se puede escribir Se trata deun programa muestra el mensaje ldquoHola mundordquo por pantalla Abre el programa GEditque como hemos comentado en la seccioacuten Instalacioacuten y configuracioacuten del entorno deprogramacioacuten Java viene instalado por defecto en Ubuntu y teclea el siguiente coacutedigo

Muestra por pantalla la frase iexclHola mundo author Luis J Saacutenchez

public class HolaMundo Clase principalpublic static void main(String[] args)

Systemoutprintln(iexclHola mundo)

Veraacutes que en principio el texto del coacutedigo no aparece en colores El coloreado desintaxis es muy uacutetil como comprobaraacutes maacutes adelante sobre todo para detectar erroresGraba el programa como HolaMundojava Al grabar con la extensioacuten java ahora elprograma GEdit siacute sabe que se trata de un programa escrito en Java y reconoce lasintaxis de este lenguaje de forma que puede colorear los distintos elementos queaparecen en el coacutedigo

1En la paacutegina httphelloworldcollectionde se muestra el programa Hola mundo escrito en maacutes de 400 lenguajes deprogramacioacuten

1

iexclHola mundo - Salida de datos por pantalla 2

Figura 11 Programa Hola mundo escrito en el editor GEdit

Fiacutejate que el nombre que le damos al fichero es exactamente igual que la clase principalseguido de la extensioacuten java Abre una ventana de terminal entra en el directoriodonde se encuentra el fichero y teclea lo siguiente

$ javac HolaMundojava

Este comando crea HolaMundoclass que es el bytecode Para ejecutar el programateclea

$ java HolaMundo

iexclEnhorabuena Acabas de realizar tu primer programa en JavaEn la siguiente captura de pantalla puedes ver la ventana de terminal y los comandosque acabamos de describir

iexclHola mundo - Salida de datos por pantalla 3

Figura 12 HolaMundoclass es el bytecode generado (1) El resultado del programa es una liacutenea de textoescrita en pantalla (2)

La instruccioacuten que hemos utilizado para mostrar una frase por pantalla es Sys-

temoutprintln() colocando la frase entre pareacutentesis Tambieacuten se puede volcar textopor pantalla mediante Systemoutprint() La uacutenica diferencia radica en que esta uacuteltimano antildeade un salto de liacutenea al final prueacutebalo en HolaMundojava y comprueacutebalo por timismo Si lo que quieres mostrar es una palabra o una frase como en este ejemploes importante que el texto esteacute entrecomillado

bull El programa propiamente dicho estaacute dentro de lo que llamamos ldquoclaseprincipalrdquo

bull El fichero debe tener el mismo nombre que la clase principal seguido porla extensioacuten java

bull Los comentarios de varias liacuteneas se colocan entre y

bull Los comentarios de liacutenea se indican mediante

bull Para mostrar informacioacuten por pantalla se utilizan Systemoutprintln() ySystemoutprint()

iexclHola mundo - Salida de datos por pantalla 4

12 Coloreado de texto

Mostrar siempre texto blanco sobre fondo negro puede resultar muy aburrido El textoque se muestra por pantalla se puede colorear para ello es necesario insertar unassecuencias de caracteres - que indican el color con el que se quiere escribir - justoantes del propio textoPrueba el siguiente programa y no te preocupes si todaviacutea no lo entiendes del todoen el proacuteximo capiacutetulo se explican los diferentes tipos de datos que se pueden utilizaren Java entre estos tipos estaacute la cadena de caracteres o String

Coloreado de texto Muestra varias palabras en el color que corresponde author Luis Joseacute Saacutenchez

public class Colores

public static void main(String[] args)

String rojo = 033[31m

String verde = 033[32m

String naranja = 033[33m

String azul = 033[34m

String morado = 033[35m

String blanco = 033[37m

Systemoutprint(naranja + mandarina + verde + hierba)

Systemoutprint(naranja + saltamontes + rojo + tomate)

Systemoutprint(blanco + saacutebanas + azul + cielo)

Systemoutprint(morado + nazareno + azul + mar)

Como puedes ver en los dos ejemplos que hemos mostrado algunas liacuteneas estaacutenligeramente desplazadas hacia la derecha es lo que se llama sangriacutea o indentacioacutenEn programacioacuten es muy importante sangrar (indentar) bien porque da una idea de queacutepartes del coacutedigo son las que contienen a otras En este uacuteltimo ejemplo tenemos unprograma que tiene unos comentarios al principio y luego la clase principal marcadapor la liacutenea public class Colores Dentro de la clase Colores estaacute el main o bloque delprograma principal que tiene sangriacutea por estar dentro de la definicioacuten de la claseColores A su vez dentro del main hay una serie de liacuteneas de coacutedigo que igualmentetienen sangriacutea

iexclHola mundo - Salida de datos por pantalla 5

En este libro tanto el coacutedigo de los ejemplos como el de las soluciones a losejercicios siguen el estaacutendar de Google para el coacutedigo fuente escrito en el lenguaje deprogramacioacuten Java2 por tanto cada vez que se aplique la sangriacutea seraacute exactamentede dos espacios

2httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

iexclHola mundo - Salida de datos por pantalla 6

13 Ejercicios

Ejercicio 1Escribe una programa que muestre tu nombre por pantalla

Ejercicio 2Modifica el programa anterior para que ademaacutes se muestre tu direccioacuten ytu nuacutemero de teleacutefono Aseguacuterate de que los datos se muestran en liacuteneasseparadas

Ejercicio 3Escribe un programa que muestre por pantalla 10 palabras en ingleacutes juntoa su correspondiente traduccioacuten al castellano Las palabras deben estardistribuidas en dos columnas y alineadas a la izquierda Pista Se puedeinsertar un tabulador mediante t

Ejercicio 4Escribe un programa que muestre tu horario de clase Puedes usar espacios otabuladores para alinear el texto

Ejercicio 5Modifica el programa anterior antildeadiendo colores Puedes mostrar cada asig-natura de un color diferente

Ejercicio 6Escribe un programa que pinte por pantalla una piraacutemide rellena a base deasteriscos La base de la piraacutemide debe estar formada por 9 asteriscos

Ejercicio 7Igual que el programa anterior pero esta vez la piraacutemide estaraacute hueca (sedebe ver uacutenicamente el contorno hecho con asteriscos)

iexclHola mundo - Salida de datos por pantalla 7

Ejercicio 8Igual que el programa anterior pero esta vez la piraacutemide debe aparecerinvertida con el veacutertice hacia abajo

Ejercicio 9Escribe un programa que pinte por pantalla alguna escena - el campo lahabitacioacuten de una casa un aula etc - o alguacuten objeto animado o inanimado- un coche un gato una taza de cafeacute etc Ten en cuenta que puedes utilizarcaracteres como + lt etc iexclEacutechale imaginacioacuten

2 Variables

21 Definicioacuten y tipos de variables

Una variable es un contenedor de informacioacuten Imagina una variable como una cajitacon una etiqueta que indica su nombre una cajita en la que se puede introducir un va-lor Las variables pueden almacenar valores enteros nuacutemeros decimales caracterescadenas de caracteres (palabras o frases) etc El contenido de las variables puedecambiar durante la ejecucioacuten del programa de ahiacute viene el nombre de ldquovariablerdquoJava es un lenguaje fuertemente tipado es decir es necesario declarar todas lasvariables que utilizaraacute el programa indicando siempre el nombre y el tipo de cadaunaEl nombre que se le da a una variable es muy importante intenta usar siemprenombres significativos que de alguna forma identifiquen el contenido Por ejemplosi usas una variable para almacenar el volumen de una figura una buena opcioacuten seriacuteallamarla volumen si tienes una variable que almacena la edad de una persona lo mejores llamarla edad y asiacute sucesivamenteUn programa se lee y se depura mucho mejor si los nombres de las variables se hanelegido de forma inteligenteiquestPodriacuteas averiguar queacute hace la siguiente liacutenea de coacutedigo

x = vIp3 Weerty - zxc

Ahora observa el mismo coacutedigo pero con otros nombres de variables

precioTotal = cantidad precio - descuento

Se entiende mucho mejor iquestverdadEscribiremos los nombres de variables en formato lowerCamelCase La primera letrase escribe en minuacutescula y a continuacioacuten si se utiliza maacutes de una palabra cada unade ellas empezariacutea con mayuacutescula Por ejemplo edadMin es un buen nombre para unavariable que almacena la edad miacutenima a la que se puede acceder a un sitio webObserva que hemos usado una mayuacutescula para diferenciar dos partes (edad y Min)Puede que en alguacuten libro tambieacuten encuentres nombres de variables con el caraacutecterde subrayado ( _ ) de tal forma que el nombre de la variable seriacutea edad_min pero comohemos comentado anteriormente en este libro nos centildeimos al estaacutendar de Google1que exige el formato lowerCamelCase

1httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

8

Variables 9

No se permiten siacutembolos como $ + - etc Puedes usar nuacutemeros en los nombresde variables pero nunca justo al principio 5x no es un nombre vaacutelido pero x5 siacute lo esNo se debe poner una letra mayuacutescula al comienzo del nombre de una variable parano confundirla con una clase (los nombres de las clases comienzan por mayuacutescula)

211 Enteros (int y long)

Las variables que van a contener nuacutemeros enteros se declaran con int Veamos unejemplo

Uso de variables enteras author Luis J Saacutenchez

public class VariablesEnteras

public static void main(String[] args)

int x Se declara la variable x como entera

x = 5 Se asigna el valor 5 a la variable xSystemoutprintln(El valor actual de mi variable es + x)

x = 7 Se asigna el valor 7 a la variable xSystemoutprintln(y ahora es + x)

Si pretendemos almacenar valores muy grandes en una variable usaremos el tipo long

en lugar de int

212 Nuacutemeros decimales (double y float)

Usamos los tipos double o float cuando queremos (o esperamos) almacenar nuacutemeroscon decimales en las variablesCintildeeacutendonos al estaacutendar de Google no daremos por vaacutelidas definiciones de variablescomo la siguiente (aunque funcionariacutea sin ninguacuten problema)

double x y

Cada variable se debe definir en una liacutenea diferente Lo siguiente siacute seriacutea correcto

Variables 10

double x

double y

A continuacioacuten tienes un ejemplo completo

Uso de variables que contienen nuacutemeros decimales author Luis J Saacutenchez

public class VariablesConDecimales

public static void main(String[] args)

double x Se declaran las variables x e ydouble y de tal forma que puedan almacenar decimales

x = 7

y = 2501

Systemoutprintln( x vale + x)

Systemoutprintln( y vale + y)

Como puedes ver tambieacuten se pueden almacenar nuacutemeros enteros en variables de tipodouble

213 Cadenas de caracteres (String)

Las cadenas de caracteres se utilizan para almacenar palabras y frases Todas lascadenas de caracteres deben ir entrecomilladas

Uso del tipo String author Luis J Saacutenchez

public class UsoDeStrings

public static void main(String[] args)

String miPalabra = cerveza

String miFrase = iquestdoacutende estaacute mi cerveza

Systemoutprintln(Una palabra que uso con frecuencia + miPalabra)

Variables 11

Systemoutprintln(Una frase que uso a veces + miFrase)

Como puedes ver en una cadena de caracteres se pueden almacenar signos depuntuacioacuten espacios y letras con tildes

Variables 12

22 Operadores artimeacuteticos

En Java se puede operar con las variables de una forma muy parecida a como se haceen matemaacuteticas Los operadores aritmeacuteticos de Java son los siguientes

OPERADOR NOMBRE EJEMPLO DESCRIPCIOacuteN+ suma 20 + x suma dos nuacutemeros- resta a - b resta dos nuacutemeros multiplicacioacuten 10 7 multiplica dos nuacutemeros divisioacuten altura 2 divide dos nuacutemeros resto (moacutedulo) 5 2 resto de la divisioacuten entera

++ incremento a++ incrementa en 1 elvalor de la variable

- - decremento a- - decrementa en 1 elvalor de la variable

A continuacioacuten tienes un programa que ilustra el uso de los operadores aritmeacuteticos

Uso de los operadores aritmeacuteticos author Luis J Saacutenchez

public class UsoDeOperadoresAritmeticos

public static void main(String[] args)

int x

x = 100

Systemoutprintln(x + + (x + 5) + + (x - 5))

Systemoutprintln((x 5) + + (x 5) + + (x 5))

23 Asignacioacuten de valores a variables

La sentencia de asignacioacuten se utiliza para dar un valor a una variable En Java (y enla mayoriacutea de lenguajes de programacioacuten) se utiliza el siacutembolo igual ( = ) para estecometido Es importante recalcar que una asignacioacuten no es una ecuacioacuten Por ejemplox = 7 + 1 es una asignacioacuten en la cual se evaluacutea la parte derecha 7 + 1 y el resultadode esa evaluacioacuten se almacena en la variable que se coloque a la izquierda del iguales decir en la x o lo que es lo mismo el nuacutemero 8 se almacena en x La sentenciax + 1 = 23 2 no es una asignacioacuten vaacutelida ya que en el lado izquierdo debemos teneruacutenicamente un nombre de variableVeamos un ejemplo con algunas operaciones y asignaciones

Variables 13

Operaciones y asignaciones author Luis J Saacutenchez

public class Asignaciones

public static void main(String[] args)

int x = 2

int y = 9

int sum = x + y

Systemoutprintln(La suma de mis variables es + sum)

int mul = x y

Systemoutprintln(La multiplicacioacuten de mis variables es + mul)

24 Conversioacuten de tipos (casting)

En ocasiones es necesario convertir una variable (o una expresioacuten en general) de untipo a otro Simplemente hay que escribir entre pareacutentesis el tipo que se quiere obtenerExperimenta con el siguiente programa y observa los diferentes resultados que seobtienen

Conversioacuten de tipos author Luis J Saacutenchez

public class ConversionDeTipos

public static void main(String[] args)

int x = 2

int y = 9

double division

division = (double)y (double)xdivision = y x Comenta esta liacutenea y

observa la diferencia

Variables 14

Systemoutprintln(El resultado de la divisioacuten es + division)

Variables 15

25 Ejercicios

Ejercicio 1Escribe un programa en el que se declaren las variables enteras x e y Asignaleslos valores 144 y 999 respectivamente A continuacioacuten muestra por pantallael valor de cada variable la suma la resta la divisioacuten y la multiplicacioacuten

Ejercicio 2Crea la variable nombre y asiacutegnale tu nombre completo Muestra su valor porpantalla de tal forma que el resultado del programa sea el mismo que en elejercicio 1 del capiacutetulo 1

Ejercicio 3Crea las variables nombre direccion y telefono y asiacutegnale los valores corres-pondientes Muestra los valores de esas variables por pantalla de tal formaque el resultado del programa sea el mismo que en el ejercicio 2

Ejercicio 4Realiza un conversor de euros a pesetas La cantidad en euros que se quiereconvertir deberaacute estar almacenada en una variable

Ejercicio 5Realiza un conversor de pesetas a euros La cantidad en pesetas que se quiereconvertir deberaacute estar almacenada en una variable

Ejercicio 6Escribe un programa que calcule el total de una factura a partir de la baseimponible (precio sin IVA) La base imponible estaraacute almacenada en unavariable

3 Lectura de datos desde tecladoHemos visto en los capiacutetulos anteriores coacutemo mostrar informacioacuten por pantalla ycoacutemo usar variables Veremos ahora algo muy importante que te permitiraacute realizarprogramas algo maacutes funcionales que tengan una utilidad real aprenderaacutes a leer lainformacioacuten que introduce un usuario mediante el tecladoEl funcionamiento de casi todos los programas se podriacutea resumir en los siguientespuntos

1 Entrada de datos desde teclado (o desde cualquier otro dispositivo de entrada)2 Procesamiento de los datos de entrada para producir un resultado3 Visualizacioacuten de los resultados por pantalla

De momento hemos visto coacutemo realizar los puntos 2 y 3 Vamos a ver a continuacioacutencoacutemo se recoge la informacioacuten desde el teclado

31 Lectura de texto

Para recoger datos por teclado usamos Systemconsole()readLine() Cuando llegamos aesta sentencia el programa se detiene y espera que el usuario introduzca informacioacutenmediante el teclado La introduccioacuten de datos termina con la pulsacioacuten de la teclaINTRO Una vez que el usuario presiona INTRO todo lo que se ha tecleado se almacenaen una variable en el siguiente ejemplo esa variable es nombre

Lectura de datos desde teclado author Luis J Sanchez

public class DimeTuNombre

public static void main(String[] args)

String nombre

Systemoutprint(Por favor dime coacutemo te llamas )

nombre = Systemconsole()readLine()

Systemoutprintln(Hola + nombre + iexclencantado de conocerte)

16

Lectura de datos desde teclado 17

Mediante Systemconsole()readLine() se recoge una liacutenea de texto introducidapor teclado

Cuando se piden datos por teclado es importante que el programa especifiqueclaramente cuaacutel es exactamente la informacioacuten que requiere por parte del usuarioDate cuenta que este programa muestra el mensaje ldquoPor favor dime coacutemo te llamasrdquoImagina que se omite este mensaje en la pantalla apareceriacutea uacutenicamente un cursorparpadeando y el usuario no sabriacutea queacute tiene que hacer o queacute dato introducirTambieacuten es importante resentildear que los datos introducidos por teclado se recogen comouna cadena de caracteres (un String)

32 Lectura de nuacutemeros

Si en lugar de texto necesitamos datos numeacutericos deberemos convertir la cadenaintroducida en un nuacutemero con el meacutetodo adecuado Como se muestra en el ejemploIntegerparseInt() convierte el texto introducido por teclado en un dato numeacutericoconcretamente en un nuacutemero entero

Lectura de datos desde teclado author Luis J Saacutenchez

public class LeeNumeros

public static void main(String[] args)

String linea

Systemoutprint(Por favor introduce un nuacutemero )

linea = Systemconsole()readLine()

int primerNumero

primerNumero = IntegerparseInt( linea )

Systemoutprint(introduce otro por favor )

linea = Systemconsole()readLine()

int segundoNumero

segundoNumero = IntegerparseInt( linea )

int total

total = (2 primerNumero) + segundoNumero

Systemoutprint(El primer nuacutemero introducido es + primerNumero)

Lectura de datos desde teclado 18

Systemoutprintln( y el segundo es + segundoNumero)

Systemoutprint(El doble del primer nuacutemero maacutes el segundo es )

Systemoutprint(total)

Este uacuteltimo programa se podriacutea acortar un poco Por ejemplo estas dos liacuteneas

int total

total = (2 primerNumero) + segundoNumero

se podriacutean quedar en una sola liacutenea

int total = (2 primerNumero) + segundoNumero

De igual modo estas tres liacuteneas

linea = Systemconsole()readLine()

int primerNumero

primerNumero = IntegerparseInt( linea )

tambieacuten se podriacutean reducir a una sola tal que asiacute

int primerNumero = IntegerparseInt( Systemconsole()readLine() )

Es muy importante que el coacutedigo de nuestros programas sea limpio y legible A vecesabreviando demasiado el coacutedigo se hace maacutes difiacutecil de leer es preferible tener unasliacuteneas de maacutes y que el coacutedigo se entienda bien a tener un coacutedigo muy compacto peromenos legible

33 La clase Scanner

El meacutetodo Systemconsole()readLine() funciona bien en modo consola (en una ventana determinal) pero puede provocar problemas cuando se trabaja con IDEs como EclipseNetbeans JavaEdit etc Para evitar estos problemas puedes usar la clase Scanner

cuando necesites recoger datos desde teclado La clase Scanner funciona tanto enentornos integrados como en una ventana de terminal

Lectura de datos desde teclado 19

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScanner01

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tu nombre )

String nombre = snextLine()

Systemoutprint(Introduce tu edad )

int edad = IntegerparseInt(snextLine())

Systemoutprintln(Tu nombre es + nombre + y tu edad es + edad)

Fiacutejate que en el programa anterior la sentencia

snextLine()

seriacutea el equivalente a

Systemconsole()readLine()`

Mediante el uso de la clase Scanner es posible leer varios datos en una misma liacutenea Enel programa anterior se pediacutea un nombre y una edad en total dos datos que habiacutea queintroducir en liacuteneas separadas Observa coacutemo en el siguiente ejemplo se piden esosdos datos en una sola liacutenea y separados por un espacio

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScanner02

Lectura de datos desde teclado 20

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tu nombre y tu edad separados por un espacio )

String nombre = snext()

int edad = snextInt()

Systemoutprintln(Tu nombre es + nombre + y tu edad es + edad)

Fiacutejate coacutemo se ha utilizado snext() para leer una cadena de caracteres y snextInt()

para leer un nuacutemero entero todo ello en la misma liacuteneaEl siguiente programa de ejemplo calcula la media de tres nuacutemeros decimales Paraleer cada uno de los nuacutemeros en la misma liacutenea se utiliza snextDouble

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScannerMedia

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tres nuacutemeros (pueden contener decimales) separados por esp

acios )

double x1 = snextDouble()

double x2 = snextDouble()

double x3 = snextDouble()

double media = (x1 + x2 + x3) 3

Systemoutprintln(La media de esos tres nuacutemeros es + media)

Lectura de datos desde teclado 21

Recuerda que iexcla programar se aprende programando Es muy importanteque pruebes los ejemplos - si los modificas y experimentas todaviacutea mejor - yque realices los ejercicios Para aprender a programar no basta con leer el libroy entenderlo es una condicioacuten necesaria pero no suficiente Igual que paraser piloto hacen falta muchas horas de vuelo para ser programador hacenfalta muchas horas picando coacutedigo probando corrigiendo erroreshellip iexclAacutenimoiexclEl esfuerzo merece la pena

Lectura de datos desde teclado 22

34 Ejercicios

Ejercicio 1Realiza un programa que pida dos nuacutemeros y que luego muestre el resultadode su multiplicacioacuten

Ejercicio 2Realiza un conversor de euros a pesetas La cantidad de euros que se quiereconvertir debe ser introducida por teclado

Ejercicio 3Realiza un conversor de pesetas a euros La cantidad de pesetas que se quiereconvertir debe ser introducida por teclado

Ejercicio 4Escribe un programa que sume reste multiplique y divida dos nuacutemerosintroducidos por teclado

Ejercicio 5Escribe un programa que calcule el aacuterea de un rectaacutengulo

Ejercicio 6Escribe un programa que calcule el aacuterea de un triaacutengulo

Ejercicio 7Escribe un programa que calcule el total de una factura a partir de la baseimponible

Ejercicio 8Escribe un programa que calcule el salario semanal de un empleado en basea las horas trabajadas a razoacuten de 12 euros la hora

Lectura de datos desde teclado 23

Ejercicio 9Escribe un programa que calcule el volumen de un cono seguacuten la foacutermula V =13πr

2h

Ejercicio 10Realiza un conversor de Mb a Kb

Ejercicio 11Realiza un conversor de Kb a Mb

Ejercicio 12Escribe un programa que calcule el precio final de un producto seguacuten subase imponible (precio antes de impuestos) el tipo de IVA aplicado (generalreducido o superreducido) y el coacutedigo promocional Los tipos de IVA generalreducido y superreducido son del 21 10 y 4 respectivamente Los coacutedi-gos promocionales pueden ser nopro mitad meno5 o 5porc que significanrespectivamente que no se aplica promocioacuten el precio se reduce a la mitadse descuentan 5 euros o se descuenta el 5 El ejercicio se da por bueno si semuestran los valores correctos aunque los nuacutemeros no esteacuten tabuladosEjemplo

Introduzca la base imponible 25

Introduzca el tipo de IVA (general reducido o superreducido) reducido

Introduzca el coacutedigo promocional (nopro mitad meno5 o 5porc) mitad

Base imponible 2500

IVA (10) 250

Precio con IVA 2750

Coacuted promo (mitad) -1375

TOTAL 1375

Lectura de datos desde teclado 24

Ejercicio 13Realiza un programa que calcule la nota que hace falta sacar en el segundoexamen de la asignatura Programacioacuten para obtener la media deseada Hayque tener en cuenta que la nota del primer examen cuenta el 40 y la delsegundo examen un 60Ejemplo 1

Introduce la nota del primer examen 7

iquestQueacute nota quieres sacar en el trimestre 85

Para tener un 85 en el trimestre necesitas sacar un 95 en el segundo examen

Ejemplo 2

Introduce la nota del primer examen 8

iquestQueacute nota quieres sacar en el trimestre 7

Para tener un 7 en el trimestre necesitas sacar un 633 en el segundo examen

4 Sentencia condicional (if y switch)Una sentencia condicional permite al programa bifurcar el flujo de ejecucioacuten deinstrucciones dependiendo del valor de una expresioacuten

41 Sentencia if

La sentencia if permite la ejecucioacuten de una serie de instrucciones en funcioacuten delresultado de una expresioacuten loacutegica El resultado de evaluar una expresioacuten loacutegica essiempre verdadero (true) o falso (false) Es muy simple en lenguaje natural seriacutea algocomo rdquosi esta condicioacuten es verdadera entonces haz esto sino haz esto otrordquoEl formato de la sentencia if es el siguiente

if (condicioacuten)

instrucciones a ejecutar si la condicioacuten es verdadera

else

instrucciones a ejecutar si la condicioacuten es falsa

A continuacioacuten se muestra un ejempo del uso de la sentencia if

Sentencia if author Luis J Saacutenchez

public class SentenciaIf01

public static void main(String[] args)

Systemoutprint(iquestCuaacutel es la capital de Kiribati )

String respuesta = Systemconsole()readLine()

if (respuestaequals(Tarawa))

Systemoutprintln(iexclLa respuesta es correcta)

else

Systemoutprintln(Lo siento la respuesta es incorrecta)

25

Sentencia condicional (if y switch) 26

En el programa se le pregunta al usuario cuaacutel es la capital de Kiriwati La respuestaintroducida por el usuario se almacena en la variable respuesta A continuacioacuten vienela sentencia condicional if

if (respuestaequals(Tarawa))

Llegado a este punto el programa evaluacutea la expresioacuten respuestaequals(Tarawa)Observa que para comparar dos cadenas de caracteres se utiliza equals() Ima-ginemos que el usuario ha introducido por teclado Madrid entonces la expresioacutenMadridequals(Tarawa) dariacutea como resultado false (falso)Si la expresioacuten hubiera dado como resultado true (verdadero) se ejecutaria la liacutenea

Systemoutprintln(iexclLa respuesta es correcta)

pero no es el caso el resultado de la expresioacuten ha sido false (falso) todo el mundosabe que la capital de Kiriwati no es Madrid por tanto se ejecutariacutea la liacutenea

Systemoutprintln(Lo siento la respuesta es incorrecta)

Vamos a ver otro ejemplo esta vez con nuacutemeros El usuario introduciraacute un nuacutemero porteclado y el programa diraacute si se trata de un nuacutemero positivo o negativo

Sentencia if author Luis J Saacutenchez

public class SentenciaIf02

public static void main(String[] args)

Systemoutprint(Por favor introduce un nuacutemero entero )

String linea = Systemconsole()readLine()

int x = IntegerparseInt( linea )

if (x lt 0)

Systemoutprintln(El nuacutemero introducido es negativo)

else

Systemoutprintln(El nuacutemero introducido es positivo)

El siguiente bloque de coacutedigo

Sentencia condicional (if y switch) 27

if (x lt 0)

Systemoutprintln(El nuacutemero introducido es negativo)

elseSystemoutprintln(El nuacutemero introducido es positivo)

compilariacutea y funcionariacutea sin problemas - fiacutejate que hemos quitado las llaves - ya queantes y despueacutes del else hay una sola sentencia y en estos casos no es obligatorioponer llaves Sin embargo nosotros siempre usaremos llaves es una exigencia delestaacutendar de Google al que nos centildeimos en este manual

Llaves egipcias (egyptian brackets)Fiacutejate en la manera de colocar las llaves dentro del coacutedigo de un programaen Java La llave de apertura de bloque se coloca justo al final de la liacutenea y lallave de cierre va justo al principio de la liacutenea Se llaman llaves egipcias1 porla similitud entre las llaves y las manos de los egipcios que aparecen en lospapiros

1httpblogcodinghorrorcomnew-programming-jargon

Sentencia condicional (if y switch) 28

42 Operadores de comparacioacuten

En el ejemplo anterior usamos el operador lt en la comparacioacuten if (x lt 0) para saber sila variable x es menor que cero Hay maacutes operadores de comparacioacuten en la siguientetabla se muestran todos

OPERADOR NOMBRE EJEMPLO DESCRIPCIOacuteN== igual a == b a es igual a b= distinto a = b a es distinto de blt menor que a lt b a es menor que bgt mayor que a gt b a es mayor que b

lt= mayor o igual que a gt = b a es mayor o igual que b

El siguiente ejemplo muestra el uso de uno de estos operadores concretamente de gt=

(mayor o igual) El usuario introduce una nota si esta nota es mayor o igual a 5 sele mostraraacute un mensaje diciendo que ha aprobado y en caso de que no se cumpla lacondicioacuten se mostraraacute un mensaje diciendo que estaacute suspenso

Sentencia if author Luis J Saacutenchez

public class SentenciaIf03

public static void main(String[] args)

Systemoutprint(iquestQueacute nota has sacado en el uacuteltimo examen )

String line = Systemconsole()readLine()

double nota = DoubleparseDouble( line )

if (nota gt= 5)

Systemoutprintln(iexclEnhorabuena iexclhas aprobado)

else

Systemoutprintln(Lo siento has suspendido)

Sentencia condicional (if y switch) 29

43 Operadores loacutegicos

Los operadores de comparacioacuten se pueden combinar con los operadores loacutegicos Porejemplo si queremos saber si la variable a es mayor que b y ademaacutes es menor que cescribiriacuteamos if ((a gt b) ampamp (a lt c)) En la siguiente tabla se muestran los operadoresloacutegicos de Java

OPERADOR NOMBRE EJEMPLO DEVUELVEVERDADEROCUANDOhellip

ampamp y (7 gt 2) ampamp (2 lt 4) las dos condicionesson verdaderas

|| o (7 gt 2) || (2 lt 4) al menos una de lascondiciones es

verdadera no (7 gt 2) la condicioacuten es falsa

Vamos a ver coacutemo funcionan los operadores loacutegicos con un ejemplo Mediante if ((n lt

1) || (n gt 100)) se pueden detectar los nuacutemeros que no estaacuten en el rango de 1 a 100literalmente seriacutea ldquosi n es menor que 1 o n es mayor que 100rdquo

Operadores loacutegicos author Luis J Saacutenchez

public class OperadoresLogicos01

public static void main(String[] args)

Systemoutprintln(Adivina el nuacutemero que estoy pensando)

Systemoutprint(Introduce un nuacutemero entre el 1 y el 100 )

String linea = Systemconsole()readLine()

int n = IntegerparseInt( linea )

if ((n lt 1) || (n gt 100))

Systemoutprintln(El nuacutemero introducido debe estar en el intervalo 1 - 100)

Systemoutprint(Tienes otra oportunidad introduce un nuacutemero )

linea = Systemconsole()readLine()

n = IntegerparseInt( linea )

if (n == 24)

Systemoutprintln(iexclEnhorabuena iexclhas acertado)

else

Systemoutprintln(Lo siento ese no es el nuacutemero que estoy pensando)

Sentencia condicional (if y switch) 30

En el siguiente programa puedes ver el uso de operadores loacutegicos combinado conoperadores relacionales (operadores de comparacioacuten) Intenta adivinar cuaacutel seraacute elresultado mirando el coacutedigo

Operadores loacutegicos y relacionales author Luis J Saacutenchez

public class OperadoresLogicos02

public static void main(String[] args)

boolean a = trueboolean b = falseSystemoutprintln(a = + a)

Systemoutprintln(b = + b)

Systemoutprintln(a ampamp b = + (a ampamp b))

Systemoutprintln(a || b = + (a || b))

Systemoutprintln(a = + a)

Systemoutprintln(a || (6 gt 10) = + (a || (6 gt 10)))

Systemoutprintln(((4 lt= 4) || false) ampamp (a) = + (((4 lt= 4) || false) ampamp (a)))

Sentencia condicional (if y switch) 31

44 Sentencia switch (seleccioacuten muacuteltiple)

A veces es necesario comparar el valor de una variable con una serie de valoresconcretos La seleccioacuten muacuteltiple es muy parecida (aunque no es exactamente igual) auna secuencia de varias sentencias ifEl formato de switch es el que se muestra a continuacioacuten En legunaje natural seriacutea algoasiacute como ldquoSi variable vale valor1 entonces entra por case valor1 si variable vale valor2

entonces entra por case valor2hellip si variable no vale ninguno de los valores que hay enlos distintos case entonces entra por default

switch(variable)

case valor1

sentencias

break

case valor2

sentencias

break

default

sentencias

A continuacioacuten tienes un ejemplo completo en Java Se pide al usuario un nuacutemero demes y el programa da el nombre del mes que corresponde a ese nuacutemero

Sentencia muacuteltiple (switch) author Luis Joseacute Saacutenchez

public class SentenciaSwitch

public static void main(String[] args)

Systemoutprint(Por favor introduzca un numero de mes )

int mes = IntegerparseInt(Systemconsole()readLine())

String nombreDelMes

switch (mes)

Sentencia condicional (if y switch) 32

case 1

nombreDelMes = enero

breakcase 2

nombreDelMes = febrero

breakcase 3

nombreDelMes = marzo

breakcase 4

nombreDelMes = abril

breakcase 5

nombreDelMes = mayo

breakcase 6

nombreDelMes = junio

breakcase 7

nombreDelMes = julio

breakcase 8

nombreDelMes = agosto

breakcase 9

nombreDelMes = septiembre

breakcase 10

nombreDelMes = octubre

breakcase 11

nombreDelMes = noviembre

breakcase 12

nombreDelMes = diciembre

breakdefault

nombreDelMes = no existe ese mes

Systemoutprintln(Mes + mes + + nombreDelMes)

Observa que es necesario introducir un break despueacutes de la asignacioacuten de la variable

Sentencia condicional (if y switch) 33

nombreDelMes En caso de no encontrarse el break el programa continuacutea la ejecucioacuten enla liacutenea siguienteEl bloque que corresponde al default se ejecuta cuando la variable no coincide conninguno de los valores de los case Escribiremos siempre el default al final de lasentencia switch aunque no sea necesarioLa sentencia switch se utiliza con frecuencia para crear menuacutes

Ejemplo de un menuacute con switch author Luis Joseacute Saacutenchez

public class MenuConSwitch

public static void main(String[] args)

Systemoutprintln( CAacuteLCULO DE AacuteREAS)

Systemoutprintln( ----------------)

Systemoutprintln( 1 Cuadrado)

Systemoutprintln( 2 Rectaacutengulo)

Systemoutprintln( 3 Triaacutengulo)

Systemoutprint(n Elija una opcioacuten (1-3) )

int opcion = IntegerparseInt(Systemconsole()readLine())

double lado

double base

double altura

switch (opcion)

case 1

Systemoutprint(nIntroduzca el lado del cuadrado en cm )

lado = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(nEl aacuterea del cuadrado es + (lado lado) + cm2)

break

case 2

Systemoutprint(nIntroduzca la base del rectaacutengulo en cm )

base = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura del rectaacutengulo en cm )

altura = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El aacuterea del rectaacutengulo es + (base altura) + cm2)

break

Sentencia condicional (if y switch) 34

case 3

Systemoutprint(nIntroduzca la base del triaacutengulo en cm )

base = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura del triaacutengulo en cm )

altura = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El aacuterea del triaacutengulo es + ((base altura) 2) + cm2)

break

default

Systemoutprint(nLo siento la opcioacuten elegida no es correcta)

Sentencia condicional (if y switch) 35

45 Ejercicios

Ejercicio 1Escribe un programa que pida por teclado un diacutea de la semana y que diga queacuteasignatura toca a primera hora ese diacutea

Ejercicio 2Realiza un programa que pida una hora por teclado y que muestre luegobuenos diacuteas buenas tardes o buenas noches seguacuten la hora Se utilizaraacuten lostramos de 6 a 12 de 13 a 20 y de 21 a 5 respectivamente Soacutelo se tienen encuenta las horas los minutos no se deben introducir por teclado

Ejercicio 3Escribe un programa en que dado un nuacutemero del 1 a 7 escriba el correspon-diente nombre del diacutea de la semana

Ejercicio 4Vamos a ampliar uno de los ejercicios de la relacioacuten anterior para considerarlas horas extras Escribe un programa que calcule el salario semanal de untrabajador teniendo en cuenta que las horas ordinarias (40 primeras horas detrabajo) se pagan a 12 euros la hora A partir de la hora 41 se pagan a 16euros la hora

Ejercicio 5Realiza un programa que resuelva una ecuacioacuten de primer grado (del tipo ax+b = 0)

Ejercicio 6Realiza un programa que calcule el tiempo que tardaraacute en caer un objeto desdeuna altura h Aplica la foacutermula t =

radic2hg siendo g = 981ms2

Ejercicio 7Realiza un programa que calcule la media de tres notas

Sentencia condicional (if y switch) 36

Ejercicio 8Ampliacutea el programa anterior para que diga la nota del boletiacuten (insuficientesuficiente bien notable o sobresaliente)

Ejercicio 9Realiza un programa que resuelva una ecuacioacuten de segundo grado (del tipoax2 + bx+ c = 0)

Ejercicio 10Escribe un programa que nos diga el horoacutescopo a partir del diacutea y el mes denacimiento

Ejercicio 11Escribe un programa que dada una hora determinada (horas y minutos)calcule los segundos que faltan para llegar a la medianoche

Ejercicio 12Realiza un minicuestionario con 10 preguntas tipo test sobre las asignaturasque se imparten en el curso Cada pregunta acertada sumaraacute un punto Elprograma mostraraacute al final la calificacioacuten obtenida Paacutesale el minicuestionarioa tus compantildeeros y piacutedeles que lo hagan para ver queacute tal andan de conoci-mientos en las diferentes asignaturas del curso

Ejercicio 13Escribe un programa que ordene tres nuacutemeros enteros introducidos porteclado

Ejercicio 14Realiza un programa que diga si un nuacutemero introducido por teclado es par yodivisible entre 5

Ejercicio 15Escribe un programa que pinte una piraacutemide rellena con un caraacutecter introdu-cido por teclado que podraacute ser una letra un nuacutemero o un siacutembolo como +- $ amp etc El programa debe permitir al usuario mediante un menuacute elegir siel veacutertice de la piraacutemide estaacute apuntando hacia arriba hacia abajo hacia laizquierda o hacia la derecha

Sentencia condicional (if y switch) 37

Ejercicio 16Realiza un programa que nos diga si hay probabilidad de que nuestra parejanos estaacute siendo infiel El programa iraacute haciendo preguntas que el usuariocontestaraacute con verdadero o falso Cada pregunta contestada como verdaderosumaraacute 3 puntos Las preguntas contestadas con falso no suman puntos Utili-za el fichero test_infidelidadtxt para obtener las preguntas y las conclusionesdel programa

Ejercicio 17Escribe un programa que diga cuaacutel es la uacuteltima cifra de un nuacutemero enterointroducido por teclado

Ejercicio 18Escribe un programa que diga cuaacutel es la primera cifra de un nuacutemero enterointroducido por teclado Se permiten nuacutemeros de hasta 5 cifras

Ejercicio 19Realiza un programa que nos diga cuaacutentos diacutegitos tiene un nuacutemero entero quepuede ser positivo o negativo Se permiten nuacutemeros de hasta 5 diacutegitos

Ejercicio 20Realiza un programa que diga si un nuacutemero entero positivo introducido porteclado es capicuacutea Se permiten nuacutemeros de hasta 5 cifras

Sentencia condicional (if y switch) 38

Ejercicio 21Calcula la nota de un trimestre de la asignatura Programacioacuten El programapediraacute las dos notas que ha sacado el alumno en los dos primeros controlesSi la media de los dos controles da un nuacutemero mayor o igual a 5 el alumnoestaacute aprobado y se mostraraacute la media En caso de que la media sea un nuacutemeromenor que 5 el alumno habraacute tenido que hacer el examen de recuperacioacutenque se califica como apto o no apto por tanto se debe preguntar al usuarioiquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) Si elresultado de la recuperacioacuten es apto la nota seraacute un 5 en caso contrario semantiene la nota media anteriorEjemplo 1

Nota del primer control 7

Nota del segundo control 10

Tu nota de Programacioacuten es 85

Ejemplo 2

Nota del primer control 6

Nota del segundo control 3

iquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) apto

Tu nota de Programacioacuten es 5

Ejemplo 3

Nota del primer control 6

Nota del segundo control 3

iquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) no apto

Tu nota de Programacioacuten es 45

Ejercicio 22Realiza un programa que dado un diacutea de la semana (de lunes a viernes) y unahora (horas y minutos) calcule cuaacutentos minutos faltan para el fin de semanaSe consideraraacute que el fin de semana comienza el viernes a las 1500h Se dapor hecho que el usuario introduciraacute un diacutea y hora correctos anterior al viernesa las 1500h

5 BuclesLos bucles se utilizan para repetir un conjunto de sentencias Por ejemplo imagina quees necesario introducir la notas de 40 alumnos con el fin de calcular la media la notamaacutexima y la nota miacutenima Podriacuteamos escribir 40 veces la intruccioacuten que pide un datopor teclado Systemconsole()readLine() y convertir cada uno de esos datos a un nuacutemerocon decimales con 40 instrucciones DoubleparseDouble() no parece algo muy eficienteEs mucho maacutes praacutectico meter dentro de un bucle aquellas sentencias que queremosque se repitanNormalmente existe una condicioacuten de salida que hace que el flujo del programaabandone el bucle y continuacutee justo en la siguiente sentencia Si no existe condicioacuten desalida o si esta condicioacuten no se cumple nunca se produciriacutea lo que se llama un bucleinfinito y el programa no terminariacutea nunca

51 Bucle for

Se suele utilizar cuando se conoce previamente el nuacutemero exacto de iteraciones(repeticiones) que se van a realizar La sintaxis es la siguiente

for (expresion1 expresion2 expresion3)

sentencias

Justo al principio se ejecuta expresion1 normalmente se usa para inicializar una variableEl bucle se repite mientras se cumple expresion2 y en cada iteraccioacuten del bucle seejecuta expresion3 que suele ser el incremento o decremento de una variable Conun ejemplo se veraacute mucho maacutes claro

Bucle for author Luis Joseacute Saacutenchez

public class EjemploFor

public static void main(String[] args)

for (int i = 1 i lt 11 i++)

Systemoutprintln(i)

39

Bucles 40

En este ejemplo int i = 1 se ejecuta solo una vez antes que cualquier otra cosa comoves esta expresioacuten se utiliza para inicializar la variable i a 1 Mientra se cumpla lacondicioacuten i lt 11 el contenido del bucle o sea Systemoutprintln(i) se va a ejecutarEn cada iteracioacuten del bucle i++ hace que la variable i se incremente en 1 El resultadodel ejemplo es la impresioacuten en pantalla de los nuacutemeros del 1 al 10Intenta seguir mentalmente el flujo del programa Experimenta inicializando la variablei con otros valores cambia la condicioacuten con gt o lt= y observa lo que sucede Pruebatambieacuten a cambiar el incremento de la variable i por ejemplo con i = i + 2

52 Bucle while

El bucle while se utiliza para repetir un conjunto de sentencias siempre que se cumplauna determinada condicioacuten Es importante resentildear que la condicioacuten se comprueba alcomienzo del bucle por lo que se podriacutea dar el caso de que dicho bucle no se ejecutasenunca La sintaxis es la siguiente

while (expresion)

sentencias

Las sentencias se ejecutan una y otra vez mientras expresion sea verdadera El siguienteejemplo produce la misma salida que el ejemplo anterior muestra coacutemo cambian losvalores de i del 1 al 10

Bucle while author Luis Joseacute Saacutenchez

public class EjemploWhile

public static void main(String[] args)

int i = 1

while (i lt 11)

Systemoutprintln(i)

Bucles 41

i++

En el siguiente ejemplo se cuentan y se suman los nuacutemeros que se van introduciendopor teclado Para indicarle al programa que debe dejar de pedir nuacutemeros el usuariodebe introducir un nuacutemero negativo esa seraacute la condicioacuten de salida del bucle Observaque el bucle se repite mientras el nuacutemero introducido sea mayor o igual que cero

Bucle while que termina cuando se introduce por teclado un nuacutemero negativo author Luis Joseacute Saacutenchez

public class CuentaPositivos

public static void main(String[] args)

Systemoutprintln(Por favor vaya introduciendo nuacutemeros y pulsando INTRO)

Systemoutprintln(Para terminar introduzca un nuacutemero negativo)

int numeroIntroducido = 0

int cuentaNumeros = 0

int suma = 0

while (numeroIntroducido gt= 0)

numeroIntroducido = IntegerparseInt(Systemconsole()readLine())

cuentaNumeros++ Incrementa en uno la variablesuma += numeroIntroducido Equivale a suma = suma + NumeroIntroducido

Systemoutprintln(Has introducido + (cuentaNumeros - 1) + nuacutemeros positivos)

Systemoutprintln(La suma total de ellos es + (suma - numeroIntroducido))

53 Bucle do-while

El bucle do-while funciona de la misma manera que el bucle while con la salvedad deque expresion se evaluacutea al final de la iteraccioacuten Las sentencias que encierran el bucledo-while por tanto se ejecutan como miacutenimo una vez La sintaxis es la siguiente

Bucles 42

do

sentencias

while (expresion)

El siguiente ejemplo es el equivalente do-while a los dos ejemplos anteriores quecuentan del 1 al 10

Bucle do-while author Luis Joseacute Saacutenchez

public class EjemploDoWhile

public static void main(String[] args)

int i = 1

do

Systemoutprintln(i)

i++

while (i lt 11)

Veamos otro ejemplo En este caso se van a ir leyendo nuacutemeros de teclado mientrasel nuacutemero introducido sea par el programa pararaacute por tanto cuando se introduzcaun nuacutemero impar

Bucle do-while que termina cuando se introduce por teclado un nuacutemero impar author Luis Joseacute Saacutenchez

public class TerminaCuandoEsImpar

public static void main(String[] args)

int numero

Bucles 43

do

Systemoutprint(Dime un nuacutemero )

numero = IntegerparseInt(Systemconsole()readLine())

if (numero 2 == 0) comprueba si el nuacutemero introducido es parSystemoutprintln(Queacute bonito es el + numero)

else

Systemoutprintln(No me gustan los nuacutemeros impares adioacutes)

while (numero 2 == 0)

Te invito a que realices una modificacioacuten sobre este uacuteltimo ejemplo Despueacutes de pedirun nuacutemero haz que el programa diga iquestQuiere continuar (sn) Si el usuario introduceuna s o una S el programa deberaacute continuar pidiendo nuacutemerosCualquier bucle que un programador quiera realizar en Java lo puede implementar confor while o do-while por tanto con una sola de estas tres opciones tendriacutea suficienteNo obstante seguacuten el programa en cuestioacuten una u otra posibilidad se adapta mejorque las otras y resulta maacutes elegante Con la experiencia te iraacutes dando cuenta cuaacutendoes mejor utilizar cada una

Bucles 44

54 Ejercicios

Ejercicio 1Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle for

Ejercicio 2Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle while

Ejercicio 3Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle do-while

Ejercicio 4Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 hacia atraacutesutilizando un bucle for

Ejercicio 5Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 hacia atraacutesutilizando un bucle while

Ejercicio 6Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 utilizando un bucledo-while

Ejercicio 7Realiza el control de acceso a una caja fuerte La combinacioacuten seraacute unnuacutemero de 4 cifras El programa nos pediraacute la combinacioacuten para abrirla Si noacertamos se nos mostraraacute el mensaje ldquoLo siento esa no es la combinacioacutenrdquoy si acertamos se nos diraacute ldquoLa caja fuerte se ha abierto satisfactoriamenterdquoTendremos cuatro oportunidades para abrir la caja fuerte

Ejercicio 8Muestra la tabla de multiplicar de un nuacutemero introducido por teclado

Bucles 45

Ejercicio 9Realiza un programa que nos diga cuaacutentos diacutegitos tiene un nuacutemero introducidopor teclado

Ejercicio 10Escribe un programa que calcule la media de un conjunto de nuacutemeros positivosintroducidos por teclado A priori el programa no sabe cuaacutentos nuacutemeros seintroduciraacuten El usuario indicaraacute que ha terminado de introducir los datoscuando meta un nuacutemero negativo

Ejercicio 11Escribe un programa que muestre en tres columnas el cuadrado y el cubo delos 5 primeros nuacutemeros enteros a partir de uno que se introduce por teclado

Ejercicio 12Escribe un programa que muestre los n primeros teacuterminos de la serie deFibonacci El primer teacutermino de la serie de Fibonacci es 0 el segundo es 1y el resto se calcula sumando los dos anteriores por lo que tendriacuteamos quelos teacuterminos son 0 1 1 2 3 5 8 13 21 34 55 89 144hellip El nuacutemero n sedebe introducir por teclado

Ejercicio 13Escribe un programa que lea una lista de diez nuacutemeros y determine cuaacutentosson positivos y cuaacutentos son negativos

Ejercicio 14Escribe un programa que pida una base y un exponente (entero positivo) yque calcule la potencia

Ejercicio 15Escribe un programa que dados dos nuacutemeros uno real (base) y un enteropositivo (exponente) saque por pantalla todas las potencias con base elnumero dado y exponentes entre uno y el exponente introducido No se debenutilizar funciones de exponenciacioacuten Por ejemplo si introducimos el 2 y el 5se deberaacuten mostrar 21 22 23 24 y 25

Bucles 46

Ejercicio 16Escribe un programa que diga si un nuacutemero introducido por teclado es o noprimo Un nuacutemero primo es aquel que soacutelo es divisible entre eacutel mismo y launidad

Ejercicio 17Realiza un programa que sume los 100 nuacutemeros siguientes a un nuacutemero enteroy positivo introducido por teclado Se debe comprobar que el dato introducidoes correcto (que es un nuacutemero positivo)

Ejercicio 18Escribe un programa que obtenga los nuacutemeros enteros comprendidos entredos nuacutemeros introducidos por teclado y validados como distintos el programadebe empezar por el menor de los enteros introducidos e ir incrementando de7 en 7

Ejercicio 19Realiza un programa que pinte una piraacutemide por pantalla La altura se debepedir por teclado El caraacutecter con el que se pinta la piraacutemide tambieacuten se debepedir por teclado

Ejercicio 20Igual que el ejercicio anterior pero esta vez se debe pintar una piraacutemide hueca

Ejercicio 21Realiza un programa que vaya pidiendo nuacutemeros hasta que se introduzca unnumero negativo y nos diga cuantos nuacutemeros se han introducido la media delos impares y el mayor de los pares El nuacutemero negativo soacutelo se utiliza paraindicar el final de la introduccioacuten de datos pero no se incluye en el coacutemputo

Ejercicio 22Muestra por pantalla todos los nuacutemeros primos entre 2 y 100 ambos incluidos

Bucles 47

Ejercicio 23Escribe un programa que permita ir introduciendo una serie indeterminadade nuacutemeros mientras su suma no supere el valor 10000 Cuando esto uacuteltimoocurra se debe mostrar el total acumulado el contador de los nuacutemerosintroducidos y la media

Ejercicio 24Escribe un programa que lea un nuacutemero n e imprima una piraacutemide de nuacutemeroscon n filas como en la siguiente figura

1

121

12321

1234321

Ejercicio 25Realiza un programa que pida un nuacutemero por teclado y que luego muestre esenuacutemero al reveacutes

Ejercicio 26Realiza un programa que pida primero un nuacutemero y a continuacioacuten un diacutegitoEl programa nos debe dar la posicioacuten (o posiciones) contando de izquierda aderecha que ocupa ese diacutegito en el nuacutemero introducido

Ejercicio 27Escribe un programa que muestre cuente y sume los muacuteltiplos de 3 que hayentre 1 y un nuacutemero leiacutedo por teclado

Ejercicio 28Escribe un programa que calcule el factorial de un nuacutemero entero leiacutedo porteclado

Ejercicio 29Escribe un programa que muestre por pantalla todos los nuacutemeros enterospositivos menores a uno leiacutedo por teclado que no sean divisibles entre otrotambieacuten leiacutedo de igual forma

Bucles 48

Ejercicio 30Realiza una programa que calcule las horas transcurridas entre dos horas dedos diacuteas de la semana No se tendraacuten en cuenta los minutos ni los segundosEl diacutea de la semana se puede pedir como un nuacutemero (del 1 al 7) o comouna cadena (de ldquolunesrdquo a ldquodomingordquo) Se debe comprobar que el usuariointroduce los datos correctamente y que el segundo diacutea es posterior al primeroA continuacioacuten se muestra un ejemplo

Por favor introduzca la primera hora

Diacutea lunes

Hora 18

Por favor introduzca la segunda hora

Diacutea martes

Hora 20

Entre las 1800h del lunes y las 2000h del martes hay 26 horas

Ejercicio 31Realiza un programa que pinte la letra L por pantalla hecha con asteriscos Elprograma pediraacute la altura El palo horizontal de la L tendraacute una longitud de lamitad (divisioacuten entera entre 2) de la altura maacutes unoEjemplo

Introduzca la altura de la L 5

Bucles 49

Ejercicio 32Escribe un programa que dado un nuacutemero entero diga cuaacuteles son y cuaacutentosuman los diacutegitos pares Los diacutegitos pares se deben mostrar en orden deizquierda a derecha Usa long en lugar de int donde sea necesario para admitirnuacutemeros largosEjemplo 1

Por favor introduzca un nuacutemero entero positivo 94026782

Diacutegitos pares 4 0 2 6 8 2

Suma de los diacutegitos pares 22

Ejemplo 2

Por favor introduzca un nuacutemero entero positivo 31779

Diacutegitos pares

Suma de los diacutegitos pares 0

Ejemplo 3

Por favor introduzca un nuacutemero entero positivo 2404

Diacutegitos pares 2 4 0 4

Suma de los diacutegitos pares 10

Ejercicio 33Realiza un programa que pinte la letra U por pantalla hecha con asteriscos Elprograma pediraacute la altura Fiacutejate que el programa inserta un espacio y pintados asteriscos menos en la base para simular la curvatura de las esquinasinferioresEjemplo

Introduzca la altura de la U 5

Bucles 50

Ejercicio 34Escribe un programa que pida dos nuacutemeros por teclado y que luego mezcle endos nuacutemeros diferentes los diacutegitos pares y los impares Se van comprobandolos diacutegitos de la siguiente manera primer diacutegito del primer nuacutemero primerdiacutegito del segundo nuacutemero segundo diacutegito del primer nuacutemero segundodiacutegito del segundo nuacutemero tercer diacutegito del primer nuacutemerohellip Para facilitarel ejercicio podemos suponer que el usuario introduciraacute dos nuacutemeros de lamisma longitud y que siempre habraacute al menos un diacutegito par y uno impar Usalong en lugar de int donde sea necesario para admitir nuacutemeros largosEjemplo 1

Por favor introduzca un nuacutemero 9402

Introduzca otro nuacutemero 6782

El nuacutemero formado por los diacutegitos pares es 640822

El nuacutemero formado por los diacutegitos impares es 97

Ejemplo 2

Por favor introduzca un nuacutemero 137

Introduzca otro nuacutemero 909

El nuacutemero formado por los diacutegitos pares es 0

El nuacutemero formado por los diacutegitos impares es 19379

6 Nuacutemeros aleatoriosLos nuacutemeros aleatorios se utilizan con frecuencia en programacioacuten para emular elcomportamiento de alguacuten fenoacutemeno natural el resultado de un juego de azar o engeneral para generar cualquier valor impredecible a prioriPor ejemplo se pueden utilizar nuacutemeros aleatorios para generar tiradas de dados detal forma que de antemano no se puede saber el resultado Antes de tirar un dado nosabemos si saldraacute un 3 o un 5 se trataraacute pues de un nuacutemero impredecible lo que siacutesabemos es que saldraacute un nuacutemero entre el 1 y el 6 es decir podemos acotar el rangode los valores que vamos a obtener de forma aleatoria

61 Generacioacuten de nuacutemeros aleatorios con y sin decimales

Para generar valores aleatorios utilizaremos Mathrandom() Esta funcioacuten genera unnuacutemero con decimales (de tipo double) en el intervalo [0 - 1) es decir genera un nuacutemeromayor o igual que 0 y menor que 1El siguiente programa genera diez nuacutemeros aleatorios

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio01

public static void main(String[] args)

Systemoutprintln(Diez nuacutemeros aleatoriosn)

for (int i = 1 i lt 11 i++)

Systemoutprintln(Mathrandom())

La salida del programa puede ser algo como esto

51

Nuacutemeros aleatorios 52

030830376099567813

08330493363981046

02322483682676435

03130746053770094

034192944433558736

09636470440975567

03398896383918959

079825461825305

09868509622870223

09967893773101499

Te invito a que ejecutes varias veces el programa Podraacutes observar que cada vez salennuacutemeros diferentes aunque siempre estaacuten comprendidos entre 0 y 1 (incluyendo el0)Pensaraacutes que no es muy uacutetil generar nuacutemeros aleatorios entre 0 y 1 si lo que queremoses por ejemplo sacar una carta al azar de la baraja espantildeola pero en realidad unnuacutemero decimal entre 0 y 1 es lo uacutenico que nos hace falta para generar cualquier tipode valor aleatorio siempre y cuando se manipule ese nuacutemero de la forma adecuadaPor ejemplo si queremos generar valores aleatorios entre 0 y 10 (incluyendo el 0 y sinllegar a 10) simplemente tendremos que correr la coma un lugar o lo que es lo mismomultiplicar por 10

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio02

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 0 y 10)

Systemoutprintln( sin llegar a 10 (con decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprintln( Mathrandom()10 + )

El programa anterior genera una salida como eacutesta

Nuacutemeros aleatorios 53

007637674702636321

1025787417143682

1854993461897163

5690351111720931

382310645589797

5518007662236258

923529380254256

39201032643833376

5836554253122096

6224559064261578

7652976185871555

49922807025365135

7498156441347868

8743251697509109

9727764845406675

2929766691797686

005801413446517634

21575652936687284

Si queremos generar nuacutemeros enteros en lugar de nuacutemeros con decimales basta conhacer un casting para convertir los nuacutemeros de tipo double en nuacutemeros de tipo intRecuerda que (int)x transforma x en una variable de tipo entero si x era de tipo float

o double perderiacutea todos los decimales

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio03

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 0 y 9 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint((int)(Mathrandom()10) + )

Systemoutprintln()

La salida del programa debe ser algo muy parecido a esto

Nuacutemeros aleatorios 54

20 nuacutemeros aleatorios entre 0 y 9 (sin decimales)

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

iquestY si en lugar de generar nuacutemeros enteros entre 0 y 9 queremos generar nuacutemeros entre1 y 10 Como habraacutes podido adivinar simplemente habriacutea que sumar 1 al nuacutemerogenerado de esta forma se ldquodesplazan un pasordquo los valores generados al azar de talforma que el miacutenimo valor que se produce seriacutea el 0 + 1 = 1 y el maacuteximo seriacutea 9 + 1= 10

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio04

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 1 y 10 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint( (int)(Mathrandom()10 + 1) + )

Systemoutprintln()

Vamos a ponerlo un poco maacutes difiacutecil Ahora vamos a generar nuacutemeros enteros entre50 y 60 ambos incluidos Primero multiplicamos Mathrandom() por 11 con lo queobtenemos nuacutemeros decimales entre 0 y 109999hellip (sin llegar nunca hasta 11) Luegodesplazamos ese intervalo sumando 50 por lo que obtenemos nuacutemeros decimalesentre 50 y 609999hellip Por uacuteltimo quitamos los decimales haciendo casting y voilagraveya tenemos nuacutemeros enteros aleatorios entre 50 y 60 ambos incluidos

Nuacutemeros aleatorios 55

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio05

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 50 y 60 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint(((int)(Mathrandom()11) + 50 ) + )

Systemoutprintln()

62 Generacioacuten de palabras de forma aleatoria de un conjuntodado

Hemos visto coacutemo generar nuacutemeros aleatorios con y sin decimales y en diferentesintervalos Vamos a producir ahora de forma aleatoria una palabra - piedra papel otijera - generando primero un nuacutemero entero entre 0 y 2 y posteriormente haciendocorresponder una palabra a cada nuacutemero

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio06

public static void main(String[] args)

Systemoutprintln(Genera al azar piedra papel o tijera)

int mano = (int)(Mathrandom()3) genera un nuacutemero al azar entre 0 y 2 ambos incluidos

switch(mano)

case 0

Systemoutprintln(piedra)

Nuacutemeros aleatorios 56

breakcase 1

Systemoutprintln(papel)

breakcase 2

Systemoutprintln(tijera)

breakdefault

iquestCoacutemo podriacuteamos generar un diacutea de la semana de forma aleatoria En efecto primerogeneramos un nuacutemero entre 1 y 7 ambos inclusive y luego hacemos corresponder undiacutea de la semana a cada uno de los nuacutemeros

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio07

public static void main(String[] args)

Systemoutprintln(Muestra un diacutea de la semana al azar)

int dia = (int)(Mathrandom()7) + 1 genera un nuacutemero aleatorio entre el 1 y el 7

switch(dia)

case 1

Systemoutprintln(lunes)

breakcase 2

Systemoutprintln(martes)

breakcase 3

Systemoutprintln(mieacutercoles) breakcase 4

Systemoutprintln(jueves)

breakcase 5

Systemoutprintln(viernes)

breakcase 6

Nuacutemeros aleatorios 57

Systemoutprintln(saacutebado)

breakcase 7

Systemoutprintln(domingo)

breakdefault

Nuacutemeros aleatorios 58

63 Ejercicios

Ejercicio 1Escribe un programa que muestre la tirada de tres dados Se debe mostrartambieacuten la suma total (los puntos que suman entre los tres dados)

Ejercicio 2Realiza un programa que muestre al azar el nombre de una carta de labaraja francesa Esta baraja estaacute dividida en cuatro palos picas corazonesdiamantes y treacuteboles Cada palo estaacute formado por 13 cartas de las cuales 9cartas son numerales y 4 literales 2 3 4 5 6 7 8 9 10 J Q K y A (queseriacutea el 1) Para convertir un nuacutemero en una cadena de caracteres podemosusar StringvalueOf(n)

Ejercicio 3Igual que el ejercicio anterior pero con la baraja espantildeola Se utilizaraacute la barajade 40 cartas 2 3 4 5 6 7 sota caballo rey y as

Ejercicio 4Muestra 20 nuacutemeros enteros aleatorios entre 0 y 10 (ambos incluidos) sepa-rados por espacios

Ejercicio 5Muestra 50 nuacutemeros enteros aleatorios entre 100 y 199 (ambos incluidos)separados por espacios Muestra tambieacuten el maacuteximo el miacutenimo y la mediade esos nuacutemeros

Ejercicio 6Escribe un programa que piense un nuacutemero al azar entre 0 y 100 El usuariodebe adivinarlo y tiene para ello 5 oportunidades Despueacutes de cada intentofallido el programa diraacute cuaacutentas oportunidades quedan y si el nuacutemero intro-ducido es menor o mayor que el nuacutemero secreto

Ejercicio 7Escribe un programa que muestre tres apuestas de la quiniela en tres colum-nas para los 14 partidos y el pleno al quince (15 filas)

Nuacutemeros aleatorios 59

Ejercicio 8Modifica el programa anterior para que la probabilidad de que salga un 1 seade 12 la probabilidad de que salga x sea de 13 y la probabilidad de que salga2 sea de 16 Pista 12 = 36 y 13 = 26

Ejercicio 9Realiza un programa que vaya generando nuacutemeros aleatorios pares entre 0y 100 y que no termine de generar nuacutemeros hasta que no saque el 24 Elprograma deberaacute decir al final cuaacutentos nuacutemeros se han generado

Ejercicio 10Realiza un programa que pinte por pantalla diez liacuteneas formadas por carac-teres El caraacutecter con el que se pinta cada liacutenea se elige de forma aleatoriaentre uno de los siguientes - = | Las liacuteneas deben tener una longitudaleatoria entre 1 y 40 caracteres

Ejercicio 11Escribe un programa que muestre 20 notas generadas al azar Las notas debenaparecer de la forma suspenso suficiente bien notable o sobresaliente Alfinal apareceraacute el nuacutemero de suspensos el nuacutemero de suficientes el nuacutemerode bienes etc

Ejercicio 12Realiza un programa que llene la pantalla de caracteres aleatorios (a lo Matrix)con el coacutedigo ascii entre el 32 y el 126 Puedes hacer casting con (char) paraconvertir un entero en un caraacutecter

Ejercicio 13Escribe un programa que simule la tirada de dos dados El programa deberaacutecontinuar tirando los dados una y otra vez hasta que en alguna tirada los dosdados tengan el mismo valor

Ejercicio 14Realiza un programa que haga justo lo contrario a lo que hace el ejercicio 6El programa intentaraacute adivinar el nuacutemero que estaacutes pensando - un nuacutemeroentre 0 y 100 - teniendo para ello 5 oportunidades En cada intento fallido elprograma debe preguntar si el nuacutemero que estaacutes pensando es mayor o menorque el que te acaba de decir

Nuacutemeros aleatorios 60

Ejercicio 15Realiza un generador de melodiacutea con las siguientes condicionesa) Las notas deben estar generadas al azar Las 7 notas son do re mi fasol la y sib) Una melodiacutea estaacute formada por un nuacutemero aleatorio de notas mayor o iguala 4 menor o igual a 28 y siempre muacuteltiplo de 4 (4 8 12hellip)c) Cada grupo de 4 notas seraacute un compaacutes y estaraacute separado del siguientecompaacutes mediante la barra vertical ldquo|rdquo (Alt + 1) El final de la melodiacutea se marcacon dos barrasd) La uacuteltima nota de la melodiacutea debe coincidir con la primeraEjemplo 1

do mi fa mi | si do sol fa | fa re si do | sol mi re do ||

Ejemplo 2

la re mi sol | fa mi mi si | do la sol fa | fa re si sol | do sol mi re | fa la do la ||

Nuacutemeros aleatorios 61

Ejercicio 16Realiza un simulador de maacutequina tragaperras simplificada que cumpla lossiguientes requisitosa) El ordenador mostraraacute una tirada que consiste en mostrar 3 figuras Hay 5figuras posibles corazoacuten diamante herradura campana y limoacutenb) Si las tres figuras son diferentes se debe mostrar el mensaje ldquoLo sientoha perdidordquoc) Si hay dos figuras iguales y una diferente se debe mostrar el mensaje ldquoBienha recuperado su monedardquod) Si las tres figuras son iguales se debe mostrar ldquoEnhorabuena ha ganado10 monedasrdquoEjemplo 1

diamante diamante limoacuten

Bien ha recuperado su moneda

Ejemplo 2

herradura campana diamante

Lo siento ha perdido

Ejemplo 3

corazoacuten corazoacuten corazoacuten

Enhorabuena ha ganado 10 monedas

7 Arrays

71 Arrays de una dimensioacuten

Un array es un tipo de dato capaz de almacenar muacuteltiples valores Se utiliza paraagrupar datos muy parecidos por ejemplo si se necesita almacenar la temperaturamedia diaria en Maacutelaga durante el uacuteltimo antildeo se pueden utilizar las variables temp0temp1 temp2 temp3 temp4 hellip y asiacute hasta 365 variables distintas pero seriacutea poco praacutectico esmejor utilizar un array de nombre temp y usar un iacutendice para referanciar la temperaturade un diacutea concreto del antildeoEn matemaacuteticas un array de una dimensioacuten se llama vector En este libro noutilizaremos este teacutermino para no confundirlo con la clase Vector de JavaVeamos con un ejemplo coacutemo se crea y se utiliza un array

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array01

public static void main(String[] args)

int[] n se define n como un array de enterosn = new int[4] se reserva espacio para 4 enteros

n[0] = 26

n[1] = -30

n[2] = 0

n[3] = 100

Systemoutprint(Los valores del array n son los siguientes )

Systemoutprint(n[0] + + n[1] + + n[2] + + n[3])

int suma = n[0] + n[3]

Systemoutprintln(nEl primer elemento del array maacutes el uacuteltimo suman + suma)

Observa que el iacutendice de cada elemento de un array se indica entre corchetes de talforma que n[3] es el cuarto elemento ya que el primer iacutendice es el 0

62

Arrays 63

Array n

Iacutendice Valor0 261 -302 03 11

Fiacutejate que la definicioacuten del array y la reserva de memoria para los cuatro elementosque la componen se ha realizado en dos liacuteneas diferentes Se pueden hacer ambascosas en una sola liacutenea como veremos en el siguiente ejemplo

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array02

public static void main(String[] args)

definicioacuten del array y reserva de memoria en la misma liacuteneaint[] x = new int[5]

x[0] = 8

x[1] = 33

x[2] = 200

x[3] = 150

x[4] = 11

Systemoutprintln(El array x tiene 5 elementos iquestcuaacutel de ellos quiere ver)

Systemoutprint(Introduzca un nuacutemero del 0 al 4 )

int indice = IntegerparseInt(Systemconsole()readLine())

Systemoutprint(El elemento que se encuentra en la posicioacuten + indice)

Systemoutprintln( es el + x[indice])

El array x del ejemplo anterior se ha ido rellenando elemento a elemento Si se conocenpreviamente todos los valores iniciales del array se puede crear e inicializar en unasola liacutenea de la siguiente forma

int[] x = 8 33 200 150 11

Cada elemento del array se puede utilizar exactamente igual que cualquier otravariable es decir se le puede asignar un valor o se puede usar dentro de una

Arrays 64

expresioacuten En el siguiente ejemplo se muestran varias operaciones en las que losoperandos son elementos del array numPara recorrer todos los elementos de un array se suele utilizar un bucle for junto conun iacutendice que va desde 0 hasta el tamantildeo del array menos 1

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array03

public static void main(String[] args)

int[] num = new int[10]

num[0] = 8

num[1] = 33

num[2] = 200

num[3] = 150

num[4] = 11

num[5] = 88

num[6] = num[2] 10

num[7] = num[2] 10

num[8] = num[0] + num[1] + num[2]

num[9] = num[8]

Systemoutprintln(El array num contiene los siguientes elementos)

for (int i = 0 i lt 10 i++)

Systemoutprintln(num[i])

En Java a diferencia de otros lenguajes como Ruby o PHP todos los elementos de unarray deben ser del mismo tipo por ejemplo no puede haber un entero en la posicioacuten2 y una cadena de caracteres en la posicioacuten 7 del mismo array En el siguiente ejemplose muestra un array de caracteres

Arrays 65

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array04

public static void main(String[] args)

char[] caracter = new char[6]

caracter[0] = R

caracter[1] =

caracter[2] = amp

caracter[3] = +

caracter[4] = A

caracter[5] = 2

Systemoutprintln(El array caracter contiene los siguientes elementos)

for (int i = 0 i lt 6 i++)

Systemoutprintln(caracter[i])

En el siguiente ejemplo se muestra un array de nuacutemeros de tipo double que almacenanotas de alumnos

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array05

public static void main(String[] args)

double[] nota = new double[4]

Systemoutprintln(Para calcular la nota media necesito saber la )

Systemoutprintln(nota de cada uno de tus exaacutemenes)

for (int i = 0 i lt 4 i++)

Arrays 66

Systemoutprint(Nota del examen nordm + (i + 1) + )

nota[i] = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(Tus notas son )

double suma = 0

for (int i = 0 i lt 4 i++)

Systemoutprint(nota[i] + )

suma += nota[i]

Systemoutprintln(nLa media es + suma 4)

72 Arrays bidimensionales

Un array bidimensional utiliza dos iacutendices para localizar cada elemento Podemos vereste tipo de dato como un array que a su vez contiene otros arrays Tambieacuten se puedever como una cuadriacutecula en la que los datos quedan distribuidos en filas y columnasEn el siguiente ejemplo se muestra la definicioacuten y el uso de un array de dosdimensiones

author Luis Joseacute Saacutenchez Ejemplo de uso de arrays bidimensionales

public class ArrayBi01

public static void main(String[] args)

throws InterruptedException Se antildeade esta liacutenea para poder usar sleep

int[][] n = new int[3][2] array de 3 filas por 2 columnas

n[0][0]=20

n[1][0]=67

n[1][1]=33

n[2][1]=7

int fila columna

Arrays 67

for(fila = 0 fila lt 3 fila++)

Systemoutprint(Fila + fila)

for(columna = 0 columna lt 2 columna++)

Systemoutprintf(10d n[fila][columna])

Threadsleep(1000) retardo de un segundo

Systemoutprintln()

Mediante la liacutenea int[][] n = new int[3][2] se define un array bidimensional de 3 filaspor 2 columnas pero bien podriacutean ser 2 filas por 3 columnas seguacuten el objetivo y eluso que del array haga el programadorLos valores del array bidimensional se pueden proporcionar en la misma liacutenea de ladefinicioacuten como se muestra en el siguiente ejemplo

author Luis Joseacute Saacutenchez Ejemplo de uso de arrays bidimensionales

public class ArrayBi02

public static void main(String[] args)

throws InterruptedException Se antildeade esta liacutenea para poder usar sleep

int fila columna

int[][] n = 20 4 67 33 07

for(fila = 0 fila lt 3 fila++)

Systemoutprint(Fila + fila)

for(columna = 0 columna lt 2 columna++)

Systemoutprintf(10d n[fila][columna])

Threadsleep(1000) retardo de un segundo

Systemoutprintln()

Arrays 68

Los arrays bidimensionales se utilizan con frecuencia para situar objetos en un planocomo por ejemplo las piezas de ajedrez en un tablero o un personaje de video-juegoen un laberintoEn el siguiente programa se colocan una mina y un tesoro de forma aleatoria en uncuadrante de cuatro filas por cinco columnas El usuario intentaraacute averiguar doacutendeestaacute el tesoro indicando las coordenadas (x y)

Minijuego Busca el tesoro Se colocan una mina y un tesoro de forma aleatoria en un cuadrante de cuatro filas por cinco columnas El usuario intentaraacute averiguar doacutende estaacute el tesoro author Luis Joseacute Saacutenchez

public class BuscaTesoro

se definen constantes para representar el contenido de las celdasstatic final int VACIO = 0

static final int MINA = 1

static final int TESORO = 2

static final int INTENTO = 3

public static void main(String[] args)

int x

int y

int[][] cuadrante = new int[5][4]

inicializa el arrayfor(x = 0 x lt 4 x++)

for(y = 0 y lt 3 y++)

cuadrante[x][y] = VACIO

coloca la minaint minaX = (int)(Mathrandom()4)int minaY = (int)(Mathrandom()3)cuadrante[minaX][minaY] = MINA

coloca el tesoroint tesoroX

Arrays 69

int tesoroY

do

tesoroX = (int)(Mathrandom()4)tesoroY = (int)(Mathrandom()3)

while ((minaX == tesoroX) ampamp (minaY == tesoroY))

cuadrante[tesoroX][tesoroY] = TESORO

juegoSystemoutprintln(iexclBUSCA EL TESORO)

boolean salir = falseString c =

do

pinta el cuadrantefor(y = 3 y gt= 0 y--)

Systemoutprint(y + |)

for(x = 0 x lt 5 x++)

if (cuadrante[x][y] == INTENTO)

Systemoutprint(X )

elseSystemoutprint( )

Systemoutprintln()

Systemoutprintln( ----------n 0 1 2 3 4n)

pide las coordenadasSystemoutprint(Coordenada x )

x = IntegerparseInt(Systemconsole()readLine())

Systemoutprint(Coordenada y )

y = IntegerparseInt(Systemconsole()readLine())

mira lo que hay en las coordenadas indicadas por el usuarioswitch(cuadrante[x][y])

case VACIO

cuadrante[x][y] = INTENTO

breakcase MINA

Systemoutprintln(Lo siento has perdido)

salir = truebreak

case TESOROSystemoutprintln(Enhorabuena has encontrado el tesoro)

salir = truebreak

default

Arrays 70

while (salir)

pinta el cuadrantefor(y = 3 y gt= 0 y--)

Systemoutprint(y + )

for(x = 0 x lt 5 x++)

switch(cuadrante[x][y])

case VACIO

c =

breakcase MINA

c =

breakcase TESORO

c = euro

breakcase INTENTO

c = x

breakdefault

Systemoutprint(c)

Systemoutprintln()

Systemoutprintln( ----------n 0 1 2 3 4n)

73 Recorrer arrays con for al estilo foreach

Al trabajar con arrays es muy frecuente cometer errores utilizando los iacutendices El errormaacutes tiacutepico consiste en intentar acceder a un elemento mediante un iacutendice que se salede los liacutemites Por ejemplo si tenemos el array n definido de la siguiente forma int[] n =

new int[10] cuando intentamos acceder a n[-1] o a n[10] obtenemos un error en tiempode ejecucioacutenPara recorrer un array de un modo maacutes praacutectico y sencillo sin que tengamos quepreocuparnos de los liacutemites podemos utilizar el bucle for con el formato foreach Deesta forma indicamos simplemente el nombre del array que queremos recorrer y enqueacute variable se va a ir colocando cada elemento con cada iteraccioacuten del bucle No hayque especificar con queacute iacutendice comienza y termina el bucle de eso se encarga JavaA continuacioacuten se muestra el ejemplo Array05java visto anteriormente pero esta vezutilizando el for a la manera foreach

Arrays 71

Recorre un array con un for al estilo foreach author Luis Joseacute Saacutenchez

public class ArrayForEach

public static void main(String[] args)

double[] nota = new double[4]

Systemoutprintln(Para calcular la nota media necesito saber la )

Systemoutprintln(nota de cada uno de tus exaacutemenes)

for (int i = 0 i lt 4 i++)

Systemoutprint(Nota del examen nordm + (i + 1) + )

nota[i] = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(Tus notas son )

double suma = 0

for (double n nota) for al estilo foreachSystemoutprint(n + )

suma += n

Systemoutprintln(nLa media es + suma 4)

Fiacutejate en el segundo for en este caso no se utiliza ninguacuten iacutendice simplemente decimosldquove sacando uno a uno los elementos del array nota y deposita cada uno de esoselementos en la variable n que es de tipo doublerdquo

Arrays 72

74 Ejercicios

741 Arrays de una dimensioacuten

Ejercicio 1Define un array de 12 nuacutemeros enteros con nombre num y asigna los valoresseguacuten la tabla que se muestra a continuacioacuten Muestra el contenido de todoslos elementos del array iquestQueacute sucede con los valores de los elementos que nohan sido inicializados

Ejercicio 2Define un array de 10 caracteres con nombre simbolo y asigna valores a loselementos seguacuten la tabla que se muestra a continuacioacuten Muestra el contenidode todos los elementos del array iquestQueacute sucede con los valores de los elementosque no han sido inicializados

Ejercicio 3Escribe un programa que lea 10 nuacutemeros por teclado y que luego los muestreen orden inverso es decir el primero que se introduce es el uacuteltimo enmostrarse y viceversa

Ejercicio 4Define tres arrays de 20 nuacutemeros enteros cada una con nombres numerocuadrado y cubo Carga el array numero con valores aleatorios entre 0 y 100 En elarray cuadrado se deben almacenar los cuadrados de los valores que hay en elarray numero En el array cubo se deben almacenar los cubos de los valores quehay en numero A continuacioacuten muestra el contenido de los tres arrays dispuestoen tres columnas

Arrays 73

Ejercicio 5Escribe un programa que pida 10 nuacutemeros por teclado y que luego muestrelos nuacutemeros introducidos junto con las palabras ldquomaacuteximordquo y ldquomiacutenimordquo al ladodel maacuteximo y del miacutenimo respectivamente

Ejercicio 6Escribe un programa que lea 15 nuacutemeros por teclado y que los almacene en unarray Rota los elementos de ese array es decir el elemento de la posicioacuten 0debe pasar a la posicioacuten 1 el de la 1 a la 2 etc El nuacutemero que se encuentra enla uacuteltima posicioacuten debe pasar a la posicioacuten 0 Finalmente muestra el contenidodel array

Ejercicio 7Escribe un programa que genere 100 nuacutemeros aleatorios del 0 al 20 y que losmuestre por pantalla separados por espacios El programa pediraacute entoncespor teclado dos valores y a continuacioacuten cambiaraacute todas las ocurrencias delprimer valor por el segundo en la lista generada anteriormente Los nuacutemerosque se han cambiado deben aparecer entrecomillados

Ejercicio 8Realiza un programa que pida la temperatura media que ha hecho en cada mesde un determinado antildeo y que muestre a continuacioacuten un diagrama de barrashorizontales con esos datos Las barras del diagrama se pueden dibujar a basede asteriscos o cualquier otro caraacutecter

Ejercicio 9Realiza un programa que pida 8 nuacutemeros enteros y que luego muestre esosnuacutemeros junto con la palabra ldquoparrdquo o ldquoimparrdquo seguacuten proceda

Ejercicio 10Escribe un programa que genere 20 nuacutemeros enteros aleatorios entre 0 y 100y que los almacene en un array El programa debe ser capaz de pasar todoslos nuacutemeros pares a las primeras posiciones del array (del 0 en adelante) ytodos los nuacutemeros impares a las celdas restantes Utiliza arrays auxiliares sies necesario

Arrays 74

Ejercicio 11Realiza un programa que pida 10 nuacutemeros por teclado y que los almacene enun array A continuacioacuten se mostraraacute el contenido de ese array junto al iacutendice(0 ndash 9) utilizando para ello una tabla Seguidamente el programa pasaraacute losprimos a las primeras posiciones desplazando el resto de nuacutemeros (los queno son primos) de tal forma que no se pierda ninguno Al final se debe mostrarel array resultantePor ejemplo

Array inicial

Array final

Ejercicio 12Realiza un programa que pida 10 nuacutemeros por teclado y que los almacene enun array A continuacioacuten se mostraraacute el contenido de ese array junto al iacutendice(0 ndash 9) Seguidamente el programa pediraacute dos posiciones a las que llamaremosldquoinicialrdquo y ldquofinalrdquo Se debe comprobar que inicial es menor que final y queambos nuacutemeros estaacuten entre 0 y 9 El programa deberaacute colocar el nuacutemero dela posicioacuten inicial en la posicioacuten final rotando el resto de nuacutemeros para que nose pierda ninguno Al final se debe mostrar el array resultantePor ejemplo para inicial = 3 y final = 7

Array inicial

Array final

Arrays 75

Ejercicio 13Escribe un programa que rellene un array de 100 elementos con nuacutemeros ente-ros aleatorios comprendidos entre 0 y 500 (ambos incluidos) A continuacioacutenel programa mostraraacute el array y preguntaraacute si el usuario quiere destacar elmaacuteximo o el miacutenimo Seguidamente se volveraacute a mostrar el array escribiendoel nuacutemero destacado entre dobles asteriscosEjemplo

459 204 20 250 178 90 353 32 229 357 224 454 260 310 140 249 332 426 423 413 96 447 465 29

8 459 411 118 480 302 417 42 82 126 82 474 362 76 190 104 21 257 88 21 251 6 383 47 78 392

394 244 494 87 253 376 379 98 364 237 13 299 228 409 402 225 426 267 330 243 209 426 435

309 356 173 130 416 15 477 34 28 377 193 481 368 466 262 422 275 384 399 397 87 218 84 312

480 207 68 108

iquestQueacute quiere destacar (1 ndash miacutenimo 2 ndash maacuteximo) 1

459 204 20 250 178 90 353 32 229 357 224 454 260 310 140 249 332 426 423 413 96 447 465 29

8 459 411 118 480 302 417 42 82 126 82 474 362 76 190 104 21 257 88 21 251 6 383 47 78

392 394 244 494 87 253 376 379 98 364 237 13 299 228 409 402 225 426 267 330 243 209 426

435 309 356 173 130 416 15 477 34 28 377 193 481 368 466 262 422 275 384 399 397 87 218 84

312 480 207 68 108

Ejercicio 14Escribe un programa que pida 8 palabras y las almacene en un array Acontinuacioacuten las palabras correspondientes a colores se deben almacenar alcomienzo y las que no son colores a continuacioacuten Puedes utilizar tantos arraysauxiliares como quieras Los colores que conoce el programa deben estar enotro array y son los siguientes verde rojo azul amarillo naranja rosa negroblanco y moradoEjemplo

Array original

0 1 2 3 4 5 6 7

casa azul verde orden morado bombillabici rosa

Array resultado

0 1 2 3 4 5 6 7

azul verde morado rosa casa orden bombillabici

Arrays 76

Ejercicio 15Un restaurante nos ha encargado una aplicacioacuten para colocar a los clientes ensus mesas En una mesa se pueden sentar de 0 (mesa vaciacutea) a 4 comensales(mesa llena) Cuando llega un cliente se le pregunta cuaacutentos son De momentoel programa no estaacute preparado para colocar a grupos mayores a 4 por tantosi un cliente dice por ejemplo que son un grupo de 6 el programa daraacute elmensaje ldquoLo siento no admitimos grupos de 6 haga grupos de 4personas como maacuteximo e intente de nuevordquo Para el grupo que llegase busca siempre la primera mesa libre (con 0 personas) Si no quedan mesaslibres se busca donde haya un hueco para todo el grupo por ejemplo si elgrupo es de dos personas se podraacute colocar donde haya una o dos personasInicialmente las mesas se cargan con valores aleatorios entre 0 y 4 Cadavez que se sientan nuevos clientes se debe mostrar el estado de las mesasLos grupos no se pueden romper aunque haya huecos sueltos suficientes Elfuncionamiento del programa se ilustra a continuacioacutenEjemplo

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 0 2 4 1 0 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 2

Por favor sieacutentense en la mesa nuacutemero 3

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 1 0 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 4

Por favor sieacutentense en la mesa nuacutemero 7

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 1 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 3

Tendraacuten que compartir mesa Por favor sieacutentense en la mesa nuacutemero 6

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 4 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 4

Lo siento en estos momentos no queda sitio

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 4 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) -1

Gracias Hasta pronto

Arrays 77

Ejercicio 16Escribe un programa que rellene un array de 20 elementos con nuacutemeros ente-ros aleatorios comprendidos entre 0 y 400 (ambos incluidos) A continuacioacutenel programa mostraraacute el array y preguntaraacute si el usuario quiere resaltar losmuacuteltiplos de 5 o los muacuteltiplos de 7 Seguidamente se volveraacute a mostrar elarray escribiendo los nuacutemeros que se quieren resaltar entre corchetesEjemplo ldquolsquoconsole159 204 20 250 178 90 353 32 229 357 224 54 260 310 140 249 335 326 22313 iquestQueacute nuacutemeros quiere resaltar (1 ndash los muacuteltiplos de 5 2 ndash los muacuteltiplos de7) 1 159 204 [20] [250] 178 [90] 353 32 229 357 224 54 [260] [310] [140]249 [335] 326 223 13 ldquolsquo

742 Arrays bidimensionales

Ejercicio 1Define un array de nuacutemeros enteros de 3 filas por 6 columnas con nombre num

y asigna los valores seguacuten la siguiente tabla Muestra el contenido de todoslos elementos del array dispuestos en forma de tabla como se muestra en lafigura

Ejercicio 2Escribe un programa que pida 20 nuacutemeros enteros Estos nuacutemeros se debenintroducir en un array de 4 filas por 5 columnas El programa mostraraacute lassumas parciales de filas y columnas igual que si de una hoja de caacutelculo setratara La suma total debe aparecer en la esquina inferior derecha

Arrays 78

Ejercicio 3Modifica el programa anterior de tal forma que los nuacutemeros que se introducenen el array se generen de forma aleatoria (valores entre 100 y 999)

Ejercicio 4Modifica el programa anterior de tal forma que las sumas parciales y la sumatotal aparezcan en la pantalla con un pequentildeo retardo dando la impresioacuten deque el ordenador se queda ldquopensandordquo antes de mostrar los nuacutemeros

Ejercicio 5Realiza un programa que rellene un array de 6 filas por 10 columnas connuacutemeros enteros positivos comprendidos entre 0 y 1000 (ambos incluidos)A continuacioacuten el programa deberaacute dar la posicioacuten tanto del maacuteximo comodel miacutenimo

Ejercicio 6Modifica el programa anterior de tal forma que no se repita ninguacuten nuacutemero enel array

Ejercicio 7Mejora el juego ldquoBusca el tesorordquo de tal forma que si hay una mina a una casillade distancia el programa avise diciendo iexclCuidado iexclHay una mina cerca

Ejercicio 8Escribe un programa que dada una posicioacuten en un tablero de ajedrez nos digaa queacute casillas podriacutea saltar un alfil que se encuentra en esa posicioacuten Como seindica en la figura el alfil se mueve siempre en diagonal El tablero cuenta con64 casillas Las columnas se indican con las letras de la ldquoardquo a la ldquohrdquo y las filasse indican del 1 al 8

Arrays 79

Ejemplo

Introduzca la posicioacuten del alfil d5

El aacutelfil puede moverse a las siguientes posiciones

h1 a2 g2 b3 e3 c4 e4 c6 e6 b7 f7 a8 g8

Ejercicio 9Realiza un programa que sea capaz de rotar todos los elementos de unamatriz cuadrada una posicioacuten en el sentido de las agujas del reloj La matrizdebe tener 12 filas por 12 columnas y debe contener nuacutemeros generados alazar entre 0 y 100 Se debe mostrar tanto la matriz original como la matrizresultado ambas con los nuacutemeros convenientemente alineados

Ejercicio 10Realiza el juego de las tres en raya

8 Funciones

81 Implementando funciones para reutilizar coacutedigo

En programacioacuten es muy frecuente reutilizar coacutedigo es decir usar coacutedigo ya exis-tente Cuando una parte de un programa requiere una funcionalidad que ya estaacuteimplementada en otro programa no tiene mucho sentido emplear tiempo y energiacuteaen implementarla otra vezUna funcioacuten es un trozo de coacutedigo que realiza una tarea muy concreta y que se puedeincluir en cualquier programa cuando hace falta resolver esa tarea Opcionalmentelas funciones aceptan una entrada (paraacutemetros de entrada) y devuelven una salidaObserva el siguiente ejemplo Se trata de un programa que pide un nuacutemero por tecladoy luego dice si el nuacutemero introducido es o no es primo

Dice si un nuacutemero es o no es primo (sin funciones) author Luis Joseacute Saacutenchez

public class NumeroPrimo

public static void main(String[] args)

Systemoutprint(Introduce un nuacutemero entero positivo )

int n = IntegerparseInt(Systemconsole()readLine())

boolean esPrimo = truefor (int i = 2 i lt n i++)

if ((n i) == 0)

esPrimo = false

if (esPrimo)

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

80

Funciones 81

Podemos intuir que la tarea de averiguar si un nuacutemero es o no primo seraacute algo queutilizaremos con frecuencia maacutes adelante asiacute que podemos aislar el trozo de coacutedigoque realiza ese cometido para usarlo con comodidad en otros programas

Dice si un nuacutemero es o no es primo usando una funcioacuten author Luis Joseacute Saacutenchez

public class NumeroPrimoConFuncion

Programa principal

public static void main(String[] args)

Systemoutprint(Introduzca un nuacutemero entero positivo )

int n = IntegerparseInt(Systemconsole()readLine())

if (esPrimo(n))

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

Funciones

Comprueba si un nuacutemero entero positivo es primo o no Un nuacutemero es primo cuando uacutenicamente es divisible entre eacutel mismo y la unidad param x un nuacutemero entero positivo return ltcodegttrueltcodegt si el nuacutemero es primo return ltcodegtfalseltcodegt en caso contrario

public static boolean esPrimo(int x)

for (int i = 2 i lt x i++)

if ((x i) == 0)

return false

Funciones 82

return true

Cada funcioacuten tiene una cabecera y un cuerpo En el ejemplo anterior la cabecera es

public static boolean esPrimo(int x)

De momento no vamos a explicar queacute significa public static lo dejaremos para cuandoveamos el capiacutetulo 9 ldquoProgramacioacuten orientada a objetosrdquo por ahora lo escribiremos talcual cada vez que definamos una funcioacuten A continuacioacuten se escribe el tipo de dato quedevuelve la funcioacuten en este caso es boolean porque la funcioacuten devolveraacute siempre true

(verdadero) o false falso Lo uacuteltimo que lleva la cabecera son los paraacutemetros encerradosentre pareacutentesis Esos paraacutemetros son los valores que se le pasan a la funcioacuten paraque realice los caacutelculos En este caso concreto el paraacutemetro que se pasa es x o seael nuacutemero que queremos saber si es primo o no Es necesario indicar siempre el tipode cada paraacutemetro en esta ocasioacuten el paraacutemetro que se pasa es de tipo entero (int)

82 Comentarios de funciones

Los comentarios tienen un papel muy importante en los programas ya que aunque nose compilan ni se ejecutan permiten describir aclarar o dar informacioacuten relevantesobre queacute hace exactamente el coacutedigo Un programa bien comentado es muchomaacutes faacutecil de corregir mantener y mejorar que un programa mal comentado o quesimplemente no tiene comentariosExiste una herramienta llamada javadoc que crea unos documentos en HTML coninformacioacuten sobre programas escritos en Java Para ello javadoc utiliza los comentariosque se han hecho y ademaacutes la meta-informacioacuten que se incluye en esos comentariosEsta meta-informacioacuten es muy faacutecil de distinguir pues va precedida siempre de uncaraacutecter Te habraacutes dado cuenta que en los comentarios de los programas que hemos visto eneste manual se indica el nombre del autor mediante authorSi los comentarios de los programas en general son importantes debemos prestarespecial atencioacuten a los comentarios de las funciones ya que posiblemente seraacutenusadas por otros programadores que querraacuten saber exactamente coacutemo se utilizanCon la etiqueta param seguida de un nombre de paraacutemetro se indica queacute paraacutemetroespera como entrada la funcioacuten Si una funcioacuten acepta varios paraacutemetros se especifi-caraacuten varias etiquetas param en los comentariosMediante la etiqueta return especificamos queacute devuelve exactamente la funcioacutenAunque el tipo de dato que se devuelve ya viene indicado en la cabecera de la funcioacutenmediante la etiqueta return podemos explicarlo con maacutes detalle

Funciones 83

En los comentarios se pueden incluir elementos de HTML como ltcodegt ampnbsp etc yaque los entiende perfectamente javadocPuedes hacer una prueba generando la documentacioacuten del ejemplo ejecutando lasiguiente liacutenea en una ventana de terminal Como tenemos tildes en los comentariossi queremos que salgan bien en las paacuteginas de documentacioacuten debemos indicar lacodificacioacuten de caracteres

javadoc -encoding UTF-8 -charset UTF-8 -docencoding UTF-8 NumeroPrimoConFuncionjava

Para aprender maacutes sobre javadoc puedes consultar la documentacioacuten oficial de Oracle1

83 Creacioacuten de bibliotecas de rutinas mediante paquetes

Si la funcioacuten esPrimo() va a ser usada en tres programas diferentes se puede copiary pegar su coacutedigo en cada uno de los programas pero hay una solucioacuten mucho maacuteselegante y praacutecticaLas funciones de un determinado tipo (por ejemplo funciones matemaacuteticas) se puedenagrupar para crear un paquete (package) que luego se importaraacute desde el programa quenecesite esas funcionesCada paquete se corresponde con un directorio Por tanto si hay un paquete connombre matematicas debe haber un directorio llamado tambieacuten matematicas en la mismaubicacioacuten del programa que importa ese paquete (normalmente el programa princi-pal)Las funciones se pueden agrupar dentro de un paquete de dos maneras diferentesPuede haber subpaquetes dentro de un paquete por ejemplo si quisieacuteramos dividirlas funciones matemaacuteticas en funciones relativas al caacutelculo de aacutereas y voluacutemenesde figuras geomeacutetricas y funciones relacionadas con caacutelculos estadiacutesticos podriacuteamoscrear dos directorios dentro de matematicas con nombres geometria y estadistica respecti-vamente Estos subpaquetes se llamariacutean matematicasgeometria y matematicasestadisticaOtra manera de agrupar las funciones dentro de un mismo paquete consiste en crearvarios ficheros dentro de un mismo directorio En este caso se podriacutean crear los ficherosGeometriajava y EstadisticajavaEntenderemos mejor todos estos conceptos con un ejemplo completo Vamos a crearun paquete con nombre matematicas que contenga dos clases Varias (para funcionesmatemaacuteticas de propoacutesito general) y Geometria Por tanto en el disco duro tendremosuna carpeta con nombre matematicas que contiene los ficheros Variasjava y GeometriajavaEl contenido de estos ficheros se muestra a continuacioacuten

1httpwwworaclecomtechnetworkjavajavasedocumentationindex-137868html

Funciones 84

Funciones matemaacuteticas de propoacutesito general author Luis Joseacute Saacutenchez

package matematicas

public class Varias

Comprueba si un nuacutemero entero positivo es primo o no Un nuacutemero es primo cuando uacutenicamente es divisible entre eacutel mismo y la unidad param x un nuacutemero entero positivo return ltcodegttrueltcodegt si el nuacutemero es primo return ltcodegtfalseltcodegt en caso contrario

public static boolean esPrimo(int x)

for (int i = 2 i lt x i++)

if ((x i) == 0)

return false

return true

Devuelve el nuacutemero de diacutegitos que contiene un nuacutemero entero param x un nuacutemero entero return la cantidad de diacutegitos que contiene el nuacutemero

public static int digitos(int x)

if (x == 0)

return 1

else

int n = 0

while (x gt 0)

x = x 10

n++

Funciones 85

return n

Se incluye a continuacioacuten Geometriacuteajava Recuerda que tanto Variasjava como Geome-

triacuteajava se encuentran dentro del directorio matematicas

Funciones geomeacutetricas author Luis Joseacute Saacutenchez

package matematicas

public class Geometria

Calcula el volumen de un cilindro Tanto el radio como la altura se deben proporcionar en las mismas unidades para que el resultado sea congruente param r radio del cilindro param h altura del cilindro return volumen del cilindro

public static double volumenCilindro(double r double h)

return MathPI r r h

Calcula la longitud de una circunferencia a partir del radio param r radio de la circunferencia return longitud de la circunferencia

public static double longitudCircunferencia(double r)

return 2 MathPI r

Observa que en ambos ficheros se especifica que las clases declaradas (y por tantolas funciones que se definen dentro) pertenecen al paquete matematicas mediante la

Funciones 86

liacutenea package matematicas Ahora ya podemos probar las funciones desde un programaexterno El programa PruebaFuncionesjava estaacute fuera de la carpeta matematicas justo enun nivel superior en la estructura de directorios

Dice si un nuacutemero es o no es primo usando una funcioacuten author Luis Joseacute Saacutenchez

import matematicasVariasimport matematicasGeometria

public class PruebaFunciones

public static void main(String[] args)

int n

Prueba esPrimo()

Systemoutprint(Introduzca un nuacutemero entero positivo )

n = IntegerparseInt(Systemconsole()readLine())

if (matematicasVariasesPrimo(n))

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

Prueba digitos()

Systemoutprint(Introduzca un nuacutemero entero positivo )

n = IntegerparseInt(Systemconsole()readLine())

Systemoutprintln(n + tiene + matematicasVariasdigitos(n) + diacutegitos)

Prueba volumenCilindro()

double r h

Systemoutprintln(Caacutelculo del volumen de un cilindro)

Systemoutprint(Introduzca el radio en metros )

r = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura en metros )

Funciones 87

h = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El volumen del cilindro es + matematicasGeometriavolumenCilind

ro(r h) + m3)

Las liacuteneas

import matematicasVariasimport matematicasGeometria

cargan las clases contenidas en el paquete matematicas y por tanto todas las funcionescontenidas en ellas No vamos a utilizar el comodiacuten de la forma import matematicas yaque estaacute desaconsejado su uso en el estaacutendar de codificacioacuten en Java de GoogleEl uso de una funcioacuten es muy sencillo hay que indicar el nombre del paquete el nom-bre de la clase y finalmente el nombre de la funcioacuten con los paraacutemetros adecuados Porejemplo como vemos en el programa anterior matematicasVariasdigitos(n) devuelve elnuacutemero de diacutegitos de n siendo matematicas el paquete Varias la clase digitos la funcioacuteny n el paraacutemetro que se le pasa a la funcioacuten

84 Aacutembito de las variables

El aacutembito de una variable es el espacio donde ldquoexisterdquo esa variable o dicho de otromodo el contexto dentro del cual la variable es vaacutelidaSeguramente has utilizado muchas veces variables con nombres como x i max o aux Elaacutembito de cada una de esas variables era el programa en el que estaban declaradasFiacutejate que la x del primer programa que aparece en este libro no interfiere para nadacon la x del siguiente programa que usa una variable con ese mismo nombre Aunquese llamen igual son variables diferentesCuando se implementan funciones hay que tener muy claro que las variables utilizadascomo paraacutemetros (por valor) o las variables que se definen dentro de la funcioacuten sonlocales a esa funcioacuten es decir su aacutembito es la funcioacuten y fuera de ella esas variablesno existen Presta atencioacuten al programa Variosjava y observa que las dos funcionesque hay definidas dentro de la clase utilizan sendas variables con nombre x Puesbien cada una de esas variables son completamente independientes se trata de dosvariables distintas que tienen el mismo nombre pero que son vaacutelidas cada una en supropio aacutembito

85 Paso de paraacutemetros por valor y por referencia

En Java como en la mayoriacutea de lenguajes de programacioacuten existen dos maneras depasar paraacutemetros por valor y por referencia

Funciones 88

Cuando se pasa un paraacutemetro por valor en realidad se pasa una copia de la variableuacutenicamente importa el valor Cualquier modificacioacuten que se le haga a la variable que sepasa como paraacutemetro dentro de la funcioacuten no tendraacute ninguacuten efecto fuera de la mismaVeamos un ejemplo

Paso de paraacutemetros por valor author Luis Joseacute Saacutenchez

public class PruebaParametros1

public static void main(String[] args)

int n = 10

Systemoutprintln(n)

calcula(n)

Systemoutprintln(n)

public static void calcula(int x)

x += 24

Systemoutprintln(x)

La salida del programa anterior es la siguiente

10

34

10

A pesar de que la variable que se pasa como paraacutemetro se modifica dentro de lafuncioacuten los cambios no tienen ninguacuten efecto en el programa principalCuando se pasa un paraacutemetro por referencia por el contrario si se modifica su valordentro de la funcioacuten los cambios se mantienen una vez que la funcioacuten ha terminadode ejecutarseEn la mayoriacutea de los lenguajes de programacioacuten es el programador quien decidecuaacutendo un paraacutemetro se pasa por valor y cuaacutendo se pasa por referencia En Java nopodemos elegir Todos los paraacutemetros que son de tipo int double float char o String

se pasan siempre por valor mientras que los arrays se pasan siempre por referenciaEsto quiere decir que cualquier cambio que efectuemos en un array que se pasa comoparaacutemetro permanece cuando termina la ejecucioacuten de la funcioacuten por lo que hay quetener especial cuidado en estos casos

Funciones 89

Paso de un array como paraacutemetro author Luis Joseacute Saacutenchez

public class PruebaParametrosArray

public static void main(String[] args)

int n[] = 8 33 200 150 11

int m[] = new int[5]

muestraArray(n)

incrementa(n)

muestraArray(n)

public static void muestraArray(int x[])

for (int i = 0 i lt xlength i++)

Systemoutprint(x[i] + )

Systemoutprintln()

public static void incrementa(int x[])

for (int i = 0 i lt xlength i++)

x[i]++

La salida del programa anterior es la siguiente

8 33 200 150 11

9 34 201 151 12

Comprobamos por tanto que el array que se ha pasado como paraacutemetro se hamodificado en la funcioacuten y se han conservado los cambios en el programa principalPor uacuteltimo se muestra un programa que contiene funciones que operan con arrays dedos dimensiones

Funciones 90

Paso de un array bidimensional como paraacutemetro author Luis Joseacute Saacutenchez

import matematicasVarias

public class ArrayBiFunciones

public static void main(String[] args)

int[][] n = new int[6][9]

for(int i = 0 i lt 6 i++)

for(int j = 0 j lt 9 j++)

n[i][j] = (int)(Mathrandom()100000)

muestraArrayIntBi(n)

Funciones

Devuelve el nuacutemero de filas de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return nuacutemero de filas del array

public static int filasArrayIntBi(int x[][])

return xlength

Devuelve el nuacutemero de columnas de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return nuacutemero de columnas del array

public static int columnasArrayIntBi(int x[][])

Funciones 91

return x[0]length

Devuelve el maacuteximo de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return el valor maacuteximo encontrado en el array

public static int maximoArrayIntBi(int x[][])

int maximo = IntegerMIN_VALUE

for (int f = 0 f lt filasArrayIntBi(x) f++)

for (int c = 0 c lt columnasArrayIntBi(x) c++)

if (x[f][c] gt maximo)

maximo = x[f][c]

return maximo

Muestra por pantalla el contenido de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros

public static void muestraArrayIntBi(int x[][])

String formatoNumero = + matematicasVariasdigitos(maximoArrayIntBi(x)) + d

for (int f = 0 f lt filasArrayIntBi(x) f++)

for (int c = 0 c lt columnasArrayIntBi(x) c++)

Systemoutprintf(formatoNumero + x[f][c])

Systemoutprintln()

Funciones 92

86 Ejercicios

Ejercicios 1-14Crea una biblioteca de funciones matemaacuteticas que contenga las siguientesfunciones Recuerda que puedes usar unas dentro de otras si es necesario

1 esCapicua Devuelve verdadero si el nuacutemero que se pasa como paraacute-metro es capicuacutea y falso en caso contrario

2 esPrimo Devuelve verdadero si el nuacutemero que se pasa como paraacutemetroes primo y falso en caso contrario

3 siguientePrimo Devuelve el menor primo que es mayor al nuacutemero quese pasa como paraacutemetro

4 potencia Dada una base y un exponente devuelve la potencia5 digitos Cuenta el nuacutemero de diacutegitos de un nuacutemero entero6 voltea Le da la vuelta a un nuacutemero7 digitoN Devuelve el diacutegito que estaacute en la posicioacuten n de un nuacutemero

entero Se empieza contando por el 0 y de izquierda a derecha8 posicionDeDigito Da la posicioacuten de la primera ocurrencia de un diacutegito

dentro de un nuacutemero entero Si no se encuentra devuelve -19 quitaPorDetras Le quita a un nuacutemero n diacutegitos por detraacutes (por la

derecha)10 quitaPorDelante Le quita a un nuacutemero n diacutegitos por delante (por la

izquierda)11 pegaPorDetras Antildeade un diacutegito a un nuacutemero por detraacutes12 pegaPorDelante Antildeade un diacutegito a un nuacutemero por delante13 trozoDeNumero Toma como paraacutemetros las posiciones inicial y final

dentro de un nuacutemero y devuelve el trozo correspondiente14 juntaNumeros Pega dos nuacutemeros para formar uno

Ejercicio 15Muestra los nuacutemeros primos que hay entre 1 y 1000

Ejercicio 16Muestra los nuacutemeros capicuacutea que hay entre 1 y 99999

Ejercicio 17Escribe un programa que pase de binario a decimal

Ejercicio 18Escribe un programa que pase de decimal a binario

Funciones 93

Ejercicio 19Une y ampliacutea los dos programas anteriores de tal forma que se permitaconvertir un nuacutemero entre cualquiera de las siguientes bases decimal binariohexadecimal y octal

Ejercicios 20-28Crea una biblioteca de funciones para arrays (de una dimensioacuten) de nuacutemerosenteros que contenga las siguientes funciones

1 generaArrayInt Genera un array de tamantildeo n con nuacutemeros aleatorioscuyo intervalo (miacutenimo y maacuteximo) se indica como paraacutemetro

2 minimoArrayInt Devuelve el miacutenimo del array que se pasa comoparaacutemetro

3 maximoArrayInt Devuelve el maacuteximo del array que se pasa comoparaacutemetro

4 mediaArrayInt Devuelve la media del array que se pasa como paraacute-metro

5 estaEnArrayInt Dice si un nuacutemero estaacute o no dentro de un array6 posicionEnArray Busca un nuacutemero en un array y devuelve la posicioacuten

(el iacutendice) en la que se encuentra7 volteaArrayInt Le da la vuelta a un array8 rotaDerechaArrayInt Rota n posiciones a la derecha los nuacutemeros de

un array9 rotaIzquierdaArrayInt Rota n posiciones a la izquierda los nuacutemeros de

un array

Funciones 94

Ejercicio 29-34Crea una biblioteca de funciones para arrays bidimensionales (de dos dimen-siones) de nuacutemeros enteros que contenga las siguientes funciones

1 generaArrayBiInt Genera un array de tamantildeo n x m con nuacutemerosaleatorios cuyo intervalo (miacutenimo y maacuteximo) se indica como paraacutemetro

2 filaDeArrayBiInt Devuelve la fila i-eacutesima del array que se pasa comoparaacutemetro

3 columnaDeArrayBiInt Devuelve la columna j-eacutesima del array que sepasa como paraacutemetro

4 coordenadasEnArrayBiInt Devuelve la fila y la columna (en un arraycon dos elementos) de la primera ocurrencia de un nuacutemero dentro de unarray bidimensional Si el nuacutemero no se encuentra en el array la funcioacutendevuelve el array -1 -1

5 esPuntoDeSilla Dice si un nuacutemero es o no punto de silla es decirmiacutenimo en su fila y maacuteximo en su columna

6 diagonal Devuelve un array que contiene una de las diagonales delarray bidimensional que se pasa como paraacutemetro Se pasan comoparaacutemetros fila columna y direccioacuten La fila y la columna determinanel nuacutemero que marcaraacute las dos posibles diagonales dentro del array Ladireccioacuten es una cadena de caracteres que puede ser ldquonoserdquo o ldquonesordquo Lacadena ldquonoserdquo indica que se elige la diagonal que va del noroeste haciael sureste mientras que la cadena ldquonesordquo indica que se elige la diagonalque va del noreste hacia el suroeste

9 Programacioacuten orientada a objetos

91 Clases y objetos

La programacioacuten orientada a objetos es un paradigma de programacioacuten que se basacomo su nombre indica en la utilizacioacuten de objetos Estos objetos tambieacuten se suelenllamar instanciasUn objeto en teacuterminos de POO no se diferencia mucho de lo que conocemos comoun objeto en la vida real Pensemos por ejemplo en un coche Nuestro coche seriacuteaun objeto concreto de la vida real igual que el coche del vecino o el coche de uncompantildeero de trabajo o un deportivo que vimos por la calle el fin de semana pasadohellipTodos esos coches son objetos concretos que podemos ver y tocarTanto mi coche como el coche del vecino tienen algo en comuacuten ambos son cochesEn este caso mi coche y el coche del vecino seriacutean instancias (objetos) y coche (asecas) seriacutea una clase La palabra coche define algo geneacuterico es una abstraccioacutenno es un coche concreto sino que hace referencia a unos elementos que tienen unaserie de propiedades como matriacutecula marca modelo color etc este conjunto depropiedades se denominan atributos o variables de instancia

ClaseConcepto abstracto que denota una serie de cualidades por ejemplo cocheInstanciaObjeto palpable que se deriva de la concrecioacuten de una clase por ejemplo micocheAtributosConjunto de caracteriacutesticas que comparten los objetos de una clase porejemplo para la clase coche tendriacuteamos matriacutecula marca modelo color ynuacutemero de plazas

En Java los nombres de las clases se escriben con la primera letra en mayuacutesculamientras que los nombres de las instancias comienzan con una letra en minuacutesculaPor ejemplo la clase coche se escribe en Java como Coche y el objeto ldquomi cocherdquo sepodriacutea escribir como miCocheDefiniremos cada clase en un fichero con el mismo nombre maacutes la extensioacuten java portanto la definicioacuten de la clase Coche debe estar contenida en un fichero con nombreCochejava

Vamos a definir a continuacioacuten la clase Libro con los atributos isbn autor titulo ynumeroPaginas

95

Programacioacuten orientada a objetos 96

Librojava Definicioacuten de la clase Libro author Luis Joseacute Saacutenchez

public class Libro

atributosString isbn

String titulo

String autor

int numeroPaginas

A continuacioacuten creamos varios objetos de esta clase

PruebaLibrojava Programa que prueba la clase Libro author Luis Joseacute Saacutenchez

public class PruebaLibro

public static void main(String[] args)

Libro lib = new Libro()

Libro miLibrito = new Libro()

Libro quijote = new Libro()

Hemos creado tres instancias de la clase libro lib miLibrito y quijote Ya sabemos definiruna clase indicando sus atributos y crear instancias

Las variables de instancia (atributos) determinan las cualidades de losobjetos

92 Encapsulamiento y ocultacioacuten

Uno de los pilares en los que se basa la Programacioacuten Orientada a Objetos es elencapsulamiento Baacutesicamente el encapsulamiento consiste en definir todas las

Programacioacuten orientada a objetos 97

propiedades y el comportamiento de una clase dentro de esa clase es decir en laclase Coche estaraacute definido todo lo concerniente a la clase Coche y en la clase Libro

estaraacute definido todo lo que tenga que ver con la clase LibroEl encapsulamiento parece algo obvio casi de perogrullo pero hay que tenerlosiempre muy presente al programar utilizando clases y objetos En alguna ocasioacutenpuede que estemos tentados a mezclar parte de una clase con otra clase distintapara resolver un problema puntual No hay que caer en esa trampa Se deben escribirlos programas de forma que cada cosa esteacute en su sitio Sobre todo al principiocuando definimos nuestras primeras clases debemos estar pendientes de que todoestaacute definido donde correspondeLa ocultacioacuten es una teacutecnica que incorporan algunos lenguajes (entre ellos Java) quepermite esconder los elementos que definen una clase de tal forma que desde otraclase distinta no se pueden ldquover las tripasrdquo de la primera La ocultacioacuten facilita comoveremos maacutes adelante el encapsulamiento

93 Meacutetodos

Un coche arranca para se aparca hace sonar el claxon se puede llevar a repararhellipUn gato puede comer dormir maullar ronronearhellipLas acciones asociadas a una clase se llaman meacutetodos Estos meacutetodos se definendentro del cuerpo de la clase y se suelen colocar a continuacioacuten de los atributos

Los meacutetodos determinan el comportamiento de los objetos

931 Creiacute haber visto un lindo gatito

Vamos a crear la clase GatoSimple La llamamos asiacute porque maacutes adelante crearemos otraclase algo maacutes elaborada que se llamaraacute Gato Para saber queacute atributos debe tener estaclase hay que preguntarse queacute caracteriacutesticas tienen los gatos Todos los gatos son deun color determinado pertenecen a una raza tienen una edad tienen un determinadosexo - son machos o hembras - y tienen un peso que se puede expresar en kilogramosEacutestos seraacuten por tanto los atributos que tendraacute la clase GatoSimplePara saber queacute metodos debemos implementar hay que preguntarse queacute accionesestaacuten asociadas a los gatos Bien pues los gatos maullan ronronean comen y si sonmachos se pelean entre ellos para disputarse el favor de las hembras Esos seraacuten losmeacutetodos que definamos en la clase

Programacioacuten orientada a objetos 98

GatoSimplejava Definicioacuten de la clase GatoSimple author Luis Joseacute Saacutenchez

public class GatoSimple

atributos

String color raza sexo

int edad

double peso

meacutetodos

constructorGatoSimple (String s)

thissexo = s

getterString getSexo()

return thissexo

Hace que el gato maulle

void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute

Programacioacuten orientada a objetos 99

param comida la comida que se le ofrece al gato

void come(String comida)

if (comidaequals(pescado))

Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Pone a pelear dos gatos Solo se van a pelear dos machos entre siacute param contrincante es el gato contra el que pelear

void peleaCon(GatoSimple contrincante)

if (thissexoequals(hembra))

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo()equals(hembra))

Systemoutprintln(no peleo contra gatitas)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

ConstructorEl meacutetodo constructor tiene siempre el mismo nombre que la clase y se utilizanormalmente para inicializar los atributos

Los atributos de la clase GatoSimple - color raza sexo edad y peso - se declaran igual quelas variables que hemos venido usando hasta ahora pero hay una gran diferenciaentre estos atributos y las variables que aparecen en el main (programa principal) Unavariable definida en el cuerpo del programa principal es uacutenica sin embargo cada unode los objetos que se crean en el programa principal tienen sus propios atributos esdecir si en el programa principal se crean 20 objetos de la clase GatoSimple cada unotiene sus valores para los atributos color raza etcFiacutejate en la cabecera del meacutetodo peleaCon

Programacioacuten orientada a objetos 100

void peleaCon(GatoSimple contrincante)

Como puedes comprobar es posible pasar un objeto como paraacutemetro A continuacioacutense muestra un programa que prueba la clase GatoSimple Te recomiendo seguir elprograma liacutenea a liacutenea y observar atentamente la salida que produce

PruebaGatoSimplejava Programa que prueba la clase GatoSimple author Luis Joseacute Saacutenchez

public class PruebaGatoSimple

public static void main(String[] args)

GatoSimple garfield = new GatoSimple(macho)

Systemoutprintln(hola gatito)

garfieldmaulla()

Systemoutprintln(toma tarta)

garfieldcome(tarta selva negra)

Systemoutprintln(toma pescado a ver si esto te gusta)

garfieldcome(pescado)

GatoSimple tom = new GatoSimple(macho)

Systemoutprintln(Tom toma sopita de verduras)

tomcome(sopa de verduras)

GatoSimple lisa = new GatoSimple(hembra)

Systemoutprintln(gatitos a ver coacutemo maullaacuteis)

garfieldmaulla()

tommaulla()

lisamaulla()

garfieldpeleaCon(lisa)

lisapeleaCon(tom)

tompeleaCon(garfield)

Observa coacutemo al crear una instancia se llama al constructor que como deciacuteamos antestiene el mismo nombre de la clase y sirve para inicializar los atributos En este casose inicializa el atributo sexo Maacutes adelante veremos constructores que inicializan variosatributos e incluso definiremos distintos constructores en la misma clase

Programacioacuten orientada a objetos 101

GatoSimple garfield = new GatoSimple(macho)

Como puedes ver hay meacutetodos que no toman ninguacuten paraacutemetro

garfieldmaulla()

Y hay otros meacutetodos que deben tomar paraacutemetros obligatoriamente

garfieldcome(tarta selva negra)

932 Meacutetodos getter y setter

Vamos a crear la clase Cubo Para saber queacute atributos se deben definir nos preguntamosqueacute caracteriacutesticas tienen los cubos - igual que hicimos con la clase GatoSimple Todos loscubos tienen una determinada capacidad un color estaacuten hechos de un determinadomaterial - plaacutestico latoacuten etc - y puede que tengan asa o puede que no Un cubo sefabrica con el propoacutesito de contener liacutequido por tanto otra caracteriacutestica es la cantidadde litros de liacutequido que contiene en un momento determinado Por ahora solo nosinteresa saber la capacidad maacutexima y los litros que contiene el cubo en cada momentoasiacute que esos seraacuten los atributos que tendremos en cuenta

Cubojava Definicioacuten de la clase Cubo author Luis Joseacute Saacutenchez

public class Cubo

atributos

int capacidad capacidad maacutexima en litrosint contenido contenido actual en litros

meacutetodos

constructorCubo (int c)

thiscapacidad = c

meacutetodos getterint getCapacidad()

return thiscapacidad

Programacioacuten orientada a objetos 102

int getContenido()

return thiscontenido

meacutetodo settervoid setContenido(int litros)

thiscontenido = litros

otros meacutetodosvoid vacia()

thiscontenido = 0

Llena el cubo al maacuteximo de su capacidad

void llena()

thiscontenido = thiscapacidad

Pinta el cubo en la pantalla Se muestran los bordes del cubo con el caraacutecter y el agua que contiene con el caraacutecter ~

void pinta()

for (int nivel = thiscapacidad nivel gt 0 nivel--)

if (thiscontenido gt= nivel)

Systemoutprintln(~~~~)

else

Systemoutprintln( )

Systemoutprintln()

Vuelca el contenido de un cubo sobre otro Antes de echar el agua se comprueba cuaacutento le cabe al cubo destino

void vuelcaEn(Cubo destino)

Programacioacuten orientada a objetos 103

int libres = destinogetCapacidad() - destinogetContenido()

if (libres gt 0)

if (thiscontenido lt= libres)

destinosetContenido(destinogetContenido() + thiscontenido)thisvacia()

else

thiscontenido -= libres

destinollena()

Observa estos meacutetodos extraiacutedos de la clase Cubo

int getCapacidad()

return thiscapacidad

int getContenido()

return thiscontenido

Se trata de meacutetodos muy simples su cometido es devolver el valor de un atributoPodriacutean tener cualquier nombre pero en Java es costumbre llamarlos con la palabraget (obtener) seguida del nombre del atributoFijeacutemonos ahora este otro meacutetodo

void setContenido(int litros)

thiscontenido = litros

Ahora estamos ante un setter Este tipo de meacutetodos tiene el cometido de establecerun valor para un determinado atributo Como puedes ver setContenido estaacute formadapor set (asignar) maacutes el nombre del atributoPodriacuteas preguntarte iquestpor queacute se crea un meacutetodo getter para extraer el valor de unavariable y no se accede a la variable directamenteParece maacutes loacutegico hacer esto

Systemoutprint(miCubocapacidad)

que esto otro

Programacioacuten orientada a objetos 104

Systemoutprint(miCubogetCapacidad())

Sin embargo en Java se opta casi siempre por esta uacuteltima opcioacuten Tiene su explicacioacuteny lo entenderaacutes bien cuando estudies el apartado Aacutembitovisibilidad de los elementosde una clase - public protected y privateProbamos con el siguiente ejemplo la clase Cubo que acabamos de definir Crea tuspropios cubos pasa agua de unos a otros y observa lo que se muestra por pantalla

PruebaCubojava Programa que prueba la clase Cubo author Luis Joseacute Saacutenchez

public class PruebaCubo

public static void main(String[] args)

Cubo cubito = new Cubo(2)

Cubo cubote = new Cubo(7)

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

Systemoutprintln(nLleno el cubito n)

cubitollena()

cubitopinta()

Systemoutprintln(nEl cubote sigue vaciacuteo n)

cubotepinta()

Systemoutprintln(nAhora vuelco lo que tiene el cubito en el cuboten)

cubitovuelcaEn(cubote)

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

Systemoutprintln(nAhora vuelco lo que tiene el cubote en el cubiton)

cubotevuelcaEn(cubito)

Programacioacuten orientada a objetos 105

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

933 Meacutetodo toString

La definicioacuten de la clase Cubo del apartado anterior contiene el meacutetodo pinta que comosu nombre indica permite pintar en pantalla un objeto de esa clase Se podriacutea definirel meacutetodo ficha para mostrar informacioacuten sobre objetos de la clase Alumno por ejemploTambieacuten seriacutea posible implementar el meacutetodo imprime dentro de la clase Libro con elpropoacutesito de mostrar por pantalla los datos de un libro Todos estos meacutetodos - pintaficha e imprime - hacen baacutesicamente lo mismoEn Java existe una solucioacuten muy elegante para mostrar informacioacuten sobre un objetopor pantalla Si se quiere mostrar el contenido de la variable entera x se utilizaSystemoutprint(x) y si se quiere mostrar el valor de la variable de tipo cadena decaracteres nombre se escribe Systemoutprint(nombre) De la misma manera si se quieremostrar el objeto miPiramide que pertenece a la clase Piramide tambieacuten se podriacutea usarSystemoutprint(miPiramide) Java sabe perfectamente coacutemo mostrar nuacutemeros y cadenasde caracteres pero no sabe a priori coacutemo se pintan piraacutemides Para indicar a Java coacutemodebe pintar un objeto de la clase Piramide basta con implementar el meacutetodo toString

dentro de la claseVeamos un ejemplo muy sencillo de implementacioacuten de toString Definiremos la claseCuadrado con el atributo lado el constructor y el meacutetodo toString

Cuadradojava Definicioacuten de la clase Cuadrado author Luis Joseacute Saacutenchez

public class Cuadrado

int lado

public Cuadrado(int l)

thislado = l

public String toString()

Programacioacuten orientada a objetos 106

int i espacios

String resultado =

for (i = 0 i lt thislado i++)

resultado +=

resultado += n

for (i = 1 i lt thislado - 1 i++)

resultado +=

for (espacios = 1 espacios lt thislado - 1 espacios++)

resultado +=

resultado += n

for (i = 0 i lt thislado i++)

resultado +=

resultado += n

return resultado

Observa que el meacutetodo toString() devuelve una cadena de caracteres Esa cadena esprecisamente la que mostraraacute por pantalla Systemoutprint() En el programa que semuestra a continuacioacuten y que prueba la clase Cuadrado puedes comprobar que se pintaun cuadrado igual que si se tratara de cualquier otra variable

PruebaCuadradojava Programa que prueba la clase Cuadrado author Luis Joseacute Saacutenchez

public class PruebaCuadrado

public static void main(String[] args)

Cuadrado miCuadradito = new Cuadrado(5)

Systemoutprintln(miCuadradito)

Programacioacuten orientada a objetos 107

94 Aacutembitovisibilidad de los elementos de una clase - publicprotected y private

Al definir los elementos de una clase se pueden especificar sus aacutembitos (scope) devisibilidad o accesibilidad Un elemento public (puacuteblico) es visible desde cualquierclase un elemento protected (protegido) es visible desde la clase actual y desde todassus subclases y finalmente un elemento private (privado) uacutenicamente es visible dentrode la clase actualEn el siguiente apartado veremos queacute son las subclases De momento fiacutejate en elaacutembito del atributo y de los meacutetodos en la definicioacuten de la clase Animal

Animaljava Definicioacuten de la clase Animal author Luis Joseacute Saacutenchez

public abstract class Animal

private Sexo sexo

public Animal ()

sexo = SexoMACHO

public Animal (Sexo s)

sexo = s

public Sexo getSexo()

return sexo

public String toString()

return Sexo + thissexo + n

Hace que el animal se eche a dormir

public void duerme()

Systemoutprintln(Zzzzzzz)

Programacioacuten orientada a objetos 108

Fiacutejate que el atributo sexo se ha definido como private

private Sexo sexo

Eso quiere decir que a ese atributo uacutenicamente se tiene acceso dentro de la claseAnimal Sin embargo todos los meacutetodos se han definido public lo que significa quese podraacuten utilizar desde cualquier otro programa por ejemplo como veremos maacutesadelante desde el programa PurebaAnimaljava

Salvo casos puntuales se seguiraacute la regla de declarar private las variables deinstancia y public los meacutetodos

El sexo de un animal solo puede ser macho hembra o hermafrodita Una forma dedelimitar los valores que puede tomar un atributo es definir un tipo enumerado

Tipo enumeradoMediante enum se puede definir un tipo enumerado de esta forma un atributosolo podraacute tener uno de los posibles valores que se dan como opcioacuten Losvalores que se especifican en el tipo enumerado se suelen escribir con todaslas letras en mayuacutescula

Sexojava Definicioacuten del tipo enumerado Sexo author Luis Joseacute Saacutenchez

public enum Sexo

MACHO HEMBRA HERMAFRODITA

95 Herencia

La herencia es una de las caracteriacutesticas maacutes importantes de la POO Si definimosuna serie de atributos y meacutetodos para una clase al crear una subclase todos estosatributos y meacutetodos siguen siendo vaacutelidosEn el apartado anterior se define la clase Animal Uno de los meacutetodos de esta clase esduerme A continuacioacuten podemos crear las clases Gato y Perro como subclases de AnimalDe forma automaacutetica se puede utilizar el meacutetodo duerme con las instancias de las clasesGato y Perro iquestno es fantaacutestico

Programacioacuten orientada a objetos 109

La clase Ave es subclase de Animal y la clase Pinguino a su vez seriacutea subclase de Ave ypor tanto hereda todos sus atributos y meacutetodos

Clase abstracta (abstract)Una clase abstracta es aquella que no va a tener instancias de forma directaaunque siacute habraacute instancias de las subclases (siempre que esas subclasesno sean tambieacuten abstractas) Por ejemplo si se define la clase Animal comoabstracta no se podraacuten crear objetos de la clase Animal es decir no se podraacutehacer Animal mascota = new Animal() pero siacute se podraacuten crear instancias de la claseGato Ave o Pinguino que son subclases de Animal

Para crear en Java una subclase de otra clase existente se utiliza la palabra reservadaextends A continuacioacuten se muestra el coacutedigo de las clases Gato Ave y Pinguino asiacutecomo el programa que prueba estas clases creando instancias y aplicaacutendoles meacutetodosRecuerda que la definicioacuten de la clase Animal se muestra en el apartado anterior

Gatojava Definicioacuten de la clase Gato author Luis Joseacute Saacutenchez

public class Gato extends Animal

private String raza

public Gato (Sexo s String r)

super(s)raza = r

public Gato (Sexo s)

super(s)raza = siameacutes

public Gato (String r)

super(SexoHEMBRA)raza = r

public Gato ()

super(SexoHEMBRA)

Programacioacuten orientada a objetos 110

raza = siameacutes

public String toString()

return supertoString()+ Raza + thisraza+ nn

Hace que el gato maulle

public void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

public void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al gato

public void come(String comida)

if (comidaequals(pescado))

Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Pone a pelear dos gatos Solo se van a pelear dos machos entre siacute param contrincante es el gato contra el que pelear

public void peleaCon(Gato contrincante)

Programacioacuten orientada a objetos 111

if (thisgetSexo() == SexoHEMBRA)

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo() == SexoHEMBRA)

Systemoutprintln(no peleo contra gatitas)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

Observa que se definen nada menos que cuatro constructores en la clase Gato Desdeel programa principal se dilucida cuaacutel de ellos se utiliza en funcioacuten del nuacutemero y tipode paraacutemetros que se pasa al meacutetodo Por ejemplo si desde el programa principal secrea un gato de esta forma

Gato gati = new Gato()

entonces se llamariacutea al constructor definido como

public Gato ()

super(SexoHEMBRA)raza = siameacutes

Por tanto gati seriacutea una gata de raza siameacutes Si por el contrario creamos gati de estaotra manera desde el programa principal

Gato gati = new Gato(SexoMACHO siberiano)

se llamariacutea al siguiente constructor

public Gato (Sexo s String r)

super(s)raza = r

y gati seriacutea en este caso un gato macho de raza siberianoEl meacutetodo super() hace una llamada al meacutetodo equivalente de la superclase Fiacutejate quese utiliza tanto en el constructor como en el meacutetodo toString() Por ejemplo al llamara super() dentro del meacutetodo toString() se estaacute llamando al toString() que hay definidoen la clase Animal justo un nivel por encima de Gato en la jerarquiacutea de clasesA continuacioacuten tenemos la definicioacuten de la clase Ave que es una subclase de Animal

Programacioacuten orientada a objetos 112

Avejava Definicioacuten de la clase Ave author Luis Joseacute Saacutenchez

public class Ave extends Animal

public Ave(Sexo s)

super(s)

public Ave()

super()

Hace que el ave se limpie

public void aseate()

Systemoutprintln(Me estoy limpiando las plumas)

Hace que el ave levante el vuelo

public void vuela()

Systemoutprintln(Estoy volando)

951 Sobrecarga de meacutetodos

Un meacutetodo se puede redefinir (volver a definir con el mismo nombre) en una subclasePor ejemplo el meacutetodo vuela que estaacute definido en la clase Ave se vuelve a definir enla clase Pinguino En estos casos indicaremos nuestra intencioacuten de sobreescribir unmeacutetodo mediante la etiqueta OverrideSi no escribimos esta etiqueta la sobreescritura del meacutetodo se realizaraacute de todasformas ya que Override indica simplemente una intencioacuten Ahora imagina que quieressobreescribir el meacutetodo come de Animal declarando un come especiacutefico para los gatos enla clase Gato Si escribes Override y luego te equivocas en el nombre del meacutetodo yescribes comer entonces el compilador diriacutea algo como ldquoiexclCuidado algo no estaacute bienme has dicho que ibas a sobreescribir un meacutetodo de la superclase y sin embargo comer

no estaacute definidordquoA continuacioacuten tienes la definicioacuten de la clase Pinguino

Programacioacuten orientada a objetos 113

Pinguinojava Definicioacuten de la clase Pinguino author Luis Joseacute Saacutenchez

public class Pinguino extends Ave

public Pinguino()

super()

public Pinguino(Sexo s)

super(s)

El pinguumlino se siente triste porque no puede volar

Override

public void vuela()

Systemoutprintln(No puedo volar)

Con el siguiente programa se prueba la clase Animal y todas las subclases que derivande ella Observa cada liacutenea y comprueba queacute hace el programa

PruebaAnimaljava Programa que prueba la clase Animal y sus subclases author Luis Joseacute Saacutenchez

public class PruebaAnimal

public static void main(String[] args)

Gato garfield = new Gato(SexoMACHO romano)

Gato tom = new Gato(SexoMACHO)

Gato lisa = new Gato(SexoHEMBRA)

Gato silvestre = new Gato()

Systemoutprintln(garfield)

Systemoutprintln(tom)

Systemoutprintln(lisa)

Programacioacuten orientada a objetos 114

Systemoutprintln(silvestre)

Ave miLoro = new Ave()

miLoroaseate()

miLorovuela()

Pinguino pingu = new Pinguino(SexoHEMBRA)

pinguaseate()

pinguvuela()

En el ejemplo anterior los objetos miLoro y pingu actuacutean de manera polimoacuterfica porquea ambos se les aplican los meacutetodos aseate y vuela

PolimorfismoEn Programacioacuten Orientada a Objetos se llama polimorfismo a la capacidadque tienen los objetos de distinto tipo (de distintas clases) de responder almismo meacutetodo

96 Atributos y meacutetodos de clase (static)

Hasta el momento hemos definido atributos de instancia como raza sexo o color ymeacutetodos de instancia como maulla come o vuela De tal modo que si en el programa secrean 20 gatos cada uno de ellos tiene su propia raza y puede haber potencialmente20 razas diferentes Tambieacuten podriacutea aplicar el meacutetodo maulla a todos y cada uno deesos 20 gatosNo obstante en determinadas ocasiones nos puede interesar tener atributos de clase(variables de clase) y meacutetodos de clase Cuando se define una variable de clase soloexiste una copia del atributo para toda la clase y no una para cada objeto Esto es uacutetilcuando se quiere llevar la cuenta global de alguacuten paraacutemetro Los meacutetodos de clase seaplican a la clase y no a instancias concretasA continuacioacuten se muestra un ejemplo que contiene la variable de clase kilometra-

jeTotal Si bien cada coche tiene un atributo kilometraje donde se van acumulando loskiloacutemetros que va recorriendo en la variable de clase kilometrajeTotal se lleva la cuentade los kiloacutemetros que han recorrido todos los coches que se han creadoTambieacuten se crea un meacutetodo de clase llamado getKilometrajeTotal que simplemente esun getter para la variable de clase kilometrajeTotal

Programacioacuten orientada a objetos 115

Cochejava Definicioacuten de la clase Coche author Luis Joseacute Saacutenchez

public class Coche

atributo de claseprivate static int kilometrajeTotal = 0

meacutetodo de clasepublic static int getKilometrajeTotal()

return kilometrajeTotal

private String marca

private String modelo

private int kilometraje

public Coche(String ma String mo)

marca = ma

modelo = mo

kilometraje = 0

public int getKilometraje()

return kilometraje

Recorre una determinada distancia param km distancia a recorrer en kiloacutemetros

public void recorre(int km)

kilometraje += km

kilometrajeTotal += km

Como ya hemos comentado el atributo kilometrajeTotal almacena el nuacutemero total dekiloacutemetros que recorren todos los objetos de la clase Coche es un uacutenico valor por esose declara como static Por el contrario el atributo kilometraje almacena los kiloacutemetrosrecorridos por un objeto concreto y tendraacute un valor distinto para cada uno de ellos

Programacioacuten orientada a objetos 116

Si en el programa principal se crean 20 objetos de la clase Coche cada uno tendraacute supropio kilometrajeA continuacioacuten se muestra el programa que prueba la clase Coche

PruebaCochejava Programa que prueba la clase Coche author Luis Joseacute Saacutenchez

public class PruebaCoche

public static void main(String[] args)

Coche cocheDeLuis = new Coche(Saab 93)

Coche cocheDeJuan = new Coche(Toyota Avensis)

cocheDeLuisrecorre(30)

cocheDeLuisrecorre(40)

cocheDeLuisrecorre(220)

cocheDeJuanrecorre(60)

cocheDeJuanrecorre(150)

cocheDeJuanrecorre(90)

Systemoutprintln(El coche de Luis ha recorrido + cocheDeLuisgetKilometraje() +

Km)

Systemoutprintln(El coche de Juan ha recorrido + cocheDeJuangetKilometraje() +

Km)

Systemoutprintln(El kilometraje total ha sido de + CochegetKilometrajeTotal() +

Km)

El meacutetodo getKilometrajeTotal() se aplica a la clase Coche por tratarse de un meacutetodo declase (meacutetodo static) Este meacutetodo no se podriacutea aplicar a una instancia de la mismamanera que un meacutetodo que no sea static no se puede aplicar a la clase sino a losobjetos

97 Interfaces

Una interfaz contiene uacutenicamente la cabecera de una serie de meacutetodos (opcional-mente tambieacuten puede contener constantes) Por tanto se encarga de especificar uncomportamiento que luego tendraacute que ser implementado La interfaz no especificael ldquocoacutemordquo ya que no contiene el cuerpo de los meacutetodos solo el ldquoqueacuterdquoUna interfaz puede ser uacutetil en determinadas circunstancias En principio separala definicioacuten de la implementacioacuten o como deciacuteamos antes el ldquoqueacuterdquo del ldquocoacutemordquo

Programacioacuten orientada a objetos 117

Tendremos entonces la menos dos ficheros la interfaz y la clase que implementaesa interfaz Se puede dar el caso que un programador escriba la interfaz y luegose la pase a otro programador para que sea eacuteste uacuteltimo quien la implementeHay que destacar que cada interfaz puede tener varias implementaciones asociadasPara ilustrar el uso de interfaces utilizaremos algunas clases ya conocidas La super-clase que va a estar por encima de todas las demaacutes seraacute la clase Animal vista conanterioridad El coacutedigo de esta clase no variacutea por lo tanto no lo vamos a reproduciraquiacute de nuevoDefinimos la interfaz Mascota

Mascotajava Definicioacuten de la interfaz Mascota author Luis Joseacute Saacutenchez

public interface Mascota

String getCodigo()

void hazRuido()

void come(String comida)

void peleaCon(Animal contrincante)

Como puedes ver uacutenicamente se escriben las cabeceras de los meacutetodos que debetener las clases que implementen la interfaz MascotaUna de las implementaciones de Mascota seraacute Gato

Gatojava Definicioacuten de la clase Gato author Luis Joseacute Saacutenchez

public class Gato extends Animal implements Mascota

private String codigo

public Gato (Sexo s String c)

super(s)thiscodigo = c

Override

Programacioacuten orientada a objetos 118

public String getCodigo()

return thiscodigo

Hace que el gato emita sonidos

Override

public void hazRuido()

thismaulla()thisronronea()

Hace que el gato maulle

public void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

public void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al gato

Override

public void come(String comida)

if (comidaequals(pescado))

supercome()Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Programacioacuten orientada a objetos 119

Pone a pelear al gato contra otro animal Solo se van a pelear dos machos entre siacute param contrincante es el animal contra el que pelear

Override

public void peleaCon(Animal contrincante)

if (thisgetSexo() == SexoHEMBRA)

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo() == SexoHEMBRA)

Systemoutprintln(no peleo contra hembras)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

Mediante la siguiente liacutenea

public class Gato extends Animal implements Mascota

estamos diciendo que Gato es una subclase de Animal y que ademaacutes es una im-plementacioacuten de la interfaz Mascota Fiacutejate que no es lo mismo la herencia que laimplementacioacutenObserva que los meacutetodos que se indicaban en Mascota uacutenicamente con la cabeceraahora estaacuten implementados completamente en Gato Ademaacutes Gato contiene otrosmeacutetodos que no se indicaban en Mascota como maulla y ronroneaLos meacutetodos de Gato que implementan meacutetodos especificados en Mascota deben tenerla anotacioacuten OverrideComo dijimos anteriormente una interfaz puede tener varias implementaciones Acontinuacioacuten se muestra Perro otra implementacioacuten de Mascota

Programacioacuten orientada a objetos 120

Perrojava Definicioacuten de la clase Perro author Luis Joseacute Saacutenchez

public class Perro extends Animal implements Mascota

private String codigo

public Perro (Sexo s String c)

super(s)thiscodigo = c

Override

public String getCodigo()

return thiscodigo

Hace que el Perro emita sonidos

Override

public void hazRuido()

thisladra()

Hace que el Perro ladre

public void ladra()

Systemoutprintln(Guau guau)

Hace que el Perro coma A los Perros les gusta la carne si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al Perro

Override

public void come(String comida)

if (comidaequals(carne))

Programacioacuten orientada a objetos 121

supercome()Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como carne)

Pone a pelear el perro contra otro animal Solo se van a pelear si los dos son perros param contrincante es el animal contra el que pelear

Override

public void peleaCon(Animal contrincante)

if (contrincantegetClass()getSimpleName()equals(Perro))

Systemoutprintln(ven aquiacute que te vas a enterar)

else

Systemoutprintln(no me gusta pelear)

Por uacuteltimo mostramos el programa que prueba Mascota y sus implementaciones Gato yPerro

PruebaMascotajava Programa que prueba la interfaz Mascota author Luis Joseacute Saacutenchez

public class PruebaMascota

public static void main(String[] args)

Mascota garfield = new Gato(SexoMACHO 34569)

Mascota lisa = new Gato(SexoHEMBRA 96059)

Mascota kuki = new Perro(SexoHEMBRA 234678)

Mascota ayo = new Perro(SexoMACHO 778950)

Systemoutprintln(garfieldgetCodigo())

Systemoutprintln(lisagetCodigo())

Systemoutprintln(kukigetCodigo())

Systemoutprintln(ayogetCodigo())

garfieldcome(pescado)

Programacioacuten orientada a objetos 122

lisacome(hamburguesa)

kukicome(pescado)

lisapeleaCon((Gato)garfield)

ayopeleaCon((Perro)kuki)

Observa que para crear una mascota que es un gato escribimos lo siguiente

Mascota garfield = new Gato(SexoMACHO 34569)

Una interfaz no se puede instanciar por tanto la siguiente liacutenea seriacutea incorrecta

Mascota garfield = new Mascota(SexoMACHO 34569)

InterfacesLa interfaz indica ldquoqueacuterdquo hay que hacer y la implementacioacuten especifica ldquocoacutemordquose haceUna interfaz puede tener varias implementacionesUna interfaz no se puede instanciarLa implementacioacuten puede contener meacutetodos adicionales cuyas cabeceras noestaacuten en su interfaz

98 Arrays de objetos

Del mismo modo que se pueden crear arrays de nuacutemeros enteros decimales o cadenasde caracteres tambieacuten es posible crear arrays de objetosVamos a definir la clase Alumnopara luego crear un array de objetos de esta clase

Alumnojava Definicioacuten de la clase Alumno author Luis Joseacute Saacutenchez

public class Alumno

private String nombre

private double notaMedia = 00

public String getNombre()

Programacioacuten orientada a objetos 123

return nombre

public void setNombre(String nombre)

thisnombre = nombre

public double getNotaMedia()

return notaMedia

public void setNotaMedia(double notaMedia)

thisnotaMedia = notaMedia

A continuacioacuten se define un array de cinco alumnos que posteriormente se rellena Poruacuteltimo se muestran los datos de los alumnos por pantallaObserva que la siguiente liacutenea uacutenicamente define la estructura del array pero no crealos objetos

Alumno[] alum = new Alumno[5]

Cada objeto concreto se crea de forma individual mediante

alum[i] = new Alumno()

Aquiacute tienes el ejemplo completo

ArrayDeAlumnosPrincipaljava Programa que prueba un array de la clase Alumno author Luis Joseacute Saacutenchez

public class ArrayDeAlumnosPrincipal

public static void main(String[] args)

Define la estructura un array de 5 alumnos pero no crea los objetosAlumno[] alum = new Alumno[5]

Pide los datos de los alumnos

Programacioacuten orientada a objetos 124

Systemoutprintln(A continuacion debera introducir el nombre y la nota media de 5 al

umnos)

String nombreIntroducido

double notaIntroducida

for(int i = 0 i lt 5 i++)

alum[i] = new Alumno()

Systemoutprintln(Alumno + i)

Systemoutprint(Nombre )

nombreIntroducido = Systemconsole()readLine()

(alum[i])setNombre(nombreIntroducido)

Systemoutprint(Nota media )

notaIntroducida = DoubleparseDouble(Systemconsole()readLine())

alum[i]setNotaMedia(notaIntroducida)

for i

Muestra los datos de los alumnos

Systemoutprintln(Los datos introducidos son los siguientes)

double sumaDeMedias = 0

for(int i = 0 i lt 5 i++)

Systemoutprintln(Alumno + i)

Systemoutprintln(Nombre + alum[i]getNombre())

Systemoutprintln(Nota media + alum[i]getNotaMedia())

Systemoutprintln(----------------------------)

sumaDeMedias += alum[i]getNotaMedia()

for i

Systemoutprintln(La media global de la clase es + sumaDeMedias 5)

Veamos ahora un ejemplo algo maacutes complejo Se trata de una gestioacuten tiacutepica - altabaja listado y modificacioacuten - de una coleccioacuten de discos Este tipo de programas sesuele denominar CRUD (Create Read Update Delete)Primero se define la clase Disco

Programacioacuten orientada a objetos 125

Discojava Definicioacuten de la clase Disco author Luis Joseacute Saacutenchez

public class Disco

private String codigo = LIBRE

private String autor

private String titulo

private String genero

private int duracion duracioacuten total en minutos

public String getCodigo()

return codigo

public void setCodigo(String codigo)

thiscodigo = codigo

public String getAutor()

return autor

public void setAutor(String autor)

thisautor = autor

public String getGenero()

return genero

public void setGenero(String genero)

thisgenero = genero

public String getTitulo()

return titulo

public void setTitulo(String titulo)

thistitulo = titulo

Programacioacuten orientada a objetos 126

public int getDuracion()

return duracion

public void setDuracion(int duracion)

thisduracion = duracion

public String toString()

String cadena = n------------------------------------------

cadena += nCoacutedigo + thiscodigocadena += nAutor + thisautorcadena += nTiacutetulo + thistitulocadena += nGeacutenero + thisgenerocadena += nDuracioacuten + thisduracioncadena += n------------------------------------------

return cadena

A continuacioacuten se crea el programa principal Cada elemento de la coleccioacuten seraacuteun objeto de la clase Disco Se trata como veraacutes de una gestioacuten muy simple perototalmente funcionalNo se incluye en el manual porque ocupariacutea varias paacuteginas El coacutedigo del programa sepuede descargar desde el siguiente enlace httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos09_POOColeccionDeDiscosColeccionDeDiscosPrincipaljava

Programacioacuten orientada a objetos 127

99 Ejercicios

991 Conceptos de POO

Ejercicio 1iquestCuaacuteles seriacutean los atributos de la clase PilotoDeFormula1 iquestSe te ocurren algunasinstancias de esta clase

Ejercicio 2A continuacioacuten tienes una lista en la que estaacuten mezcladas varias clases coninstancias de esas clases Para ponerlo un poco maacutes difiacutecil todos los elementosestaacuten escritos en minuacutescula Di cuaacuteles son las clases cuaacuteles las instanciasa queacute clase pertenece cada una de estas instancias y cuaacutel es la jerarquiacuteaentre las clases paula goofy gardfiel perro mineral caballo tom silvestrepirita rocinante milu snoopy gato pluto animal javier bucefalo pegasoayudante_de_santa_claus cuarzo laika persona pato_lucas

Ejercicio 3iquestCuaacuteles seriacutean los atributos de la clase Vivienda iquestQueacute subclases se te ocurren

Ejercicio 4Piensa en la liga de baloncesto iquestqueacute 5 clases se te ocurren para representar5 elementos distintos que intervengan en la liga

Ejercicio 5Haz una lista con los atributos que podriacutea tener la clase caballo A continuacioacutenhaz una lista con los posibles meacutetodos (acciones asociadas a los caballos)

Ejercicio 6Lista los atributos de la clase Alumno iquestSeriacutea nombre uno de los atributos de laclase Razona tu respuesta

Ejercicio 7iquestCuaacuteles seriacutean los atributos de la clase Ventana (de ordenador) iquestcuaacuteles seriacuteanlos meacutetodos Piensa en las propiedades y en el comportamiento de unaventana de cualquier programa

Programacioacuten orientada a objetos 128

992 POO en Java

Ejercicio 1Implementa la clase Caballo vista en un ejercicio anterior Prueacutebala creandoinstancias y aplicaacutendole algunos meacutetodos

Ejercicio 2Crea la clase Vehiculo asiacute como las clases Bicicleta y Coche como subclases dela primera Para la clase Vehiculo crea los atributos de clase vehiculosCreadosykilometrosTotales asiacute como el atributo de instancia kilometrosRecorridos Creatambieacuten alguacuten meacutetodo especiacutefico para cada una de las subclases Prueba lasclases creadas mediante un programa con un menuacute como el que se muestraa continuacioacuten

VEHIacuteCULOS

=========

1 Anda con la bicicleta

2 Haz el caballito con la bicicleta

3 Anda con el coche

4 Quema rueda con el coche

5 Ver kilometraje de la bicicleta

6 Ver kilometraje del coche

7 Ver kilometraje total

8 Salir

Elige una opcioacuten (1-8)

Ejercicio 3Crea las clases Animal Mamifero Ave Gato Perro Canario Pinguino y Lagarto Creaal menos tres meacutetodos especiacuteficos de cada clase y redefne ellos meacutetodoscuando sea necesario Prueba las clases creadas en un programa en el que seinstancien objetos y se les apliquen meacutetodos

Ejercicio 4Crea la clase Fraccioacuten Los atributos seraacuten numerador y denominador Y algunos delos meacutetodos pueden ser invierte simplifica multiplica divide etc

Programacioacuten orientada a objetos 129

Ejercicio 5Crea la clase Pizza con los atributos y meacutetodos necesarios Sobre cada pizzase necesita saber el tamantildeo - mediana o familiar - el tipo - margarita cuatroquesos o funghi - y su estado - pedida o servida La clase debe almacenarinformacioacuten sobre el nuacutemero total de pizzas que se han pedido y que sehan servido Siempre que se crea una pizza nueva su estado es ldquopedidardquoEl siguiente coacutedigo del programa principal debe dar la salida que se muestra

public class PedidosPizza

public static void main(String[] args)

Pizza p1 = new Pizza(margarita mediana)

Pizza p2 = new Pizza(funghi familiar)

p2sirve()

Pizza p3 = new Pizza(cuatro quesos mediana)

Systemoutprintln(p1)

Systemoutprintln(p2)

Systemoutprintln(p3)

p2sirve()

Systemoutprintln(pedidas + PizzagetTotalPedidas())

Systemoutprintln(servidas + PizzagetTotalServidas())

pizza margarita mediana pedida

pizza funghi familiar servida

pizza cuatro quesos mediana pedida

esa pizza ya se ha servido

pedidas 3

servidas 1

Ejercicio 6Crea la clase Tiempo con los meacutetodos suma y resta Los objetos de la clase Tiempo

son intervalos de tiempo y se crean de la forma Tiempo t = new Tiempo(1 20

30) donde los paraacutemetros que se le pasan al constructor son las horas losminutos y los segundos respectivamente Crea el meacutetodo toString para ver losintervalos de tiempo de la forma 10h 35m 5s Si se suman por ejemplo 30m 40s y35m 20s el resultado deberiacutea ser 1h 6m 0s Realiza un programa de prueba paracomprobar que la clase funciona bien

Programacioacuten orientada a objetos 130

Ejercicio 7Queremos gestionar la venta de entradas (no numeradas) de ExpocochesCampanillas que tiene 3 zonas la sala principal con 1000 entradas dispo-nibles la zona de compra-venta con 200 entradas disponibles y la zona vipcon 25 entradas disponibles Hay que controlar que existen entradas antes devenderlasLa clase Zona con sus atributos y meacutetodos se muestra a continuacioacuten

Definicioacuten de la clase Zona author Luis Joseacute Saacutenchez

public class Zona

private int entradasPorVender

public Zona(int n)

entradasPorVender = n

public int getEntradasPorVender()

return entradasPorVender

Vende un nuacutemero de entradas ltpgt Comprueba si quedan entradas libres antes de realizar la venta param n nuacutemero de entradas a vender

public void vender(int n)

if (thisentradasPorVender == 0)

Systemoutprintln(Lo siento las entradas para esa zona estaacuten agotadas)

else if (thisentradasPorVender lt n)

Systemoutprintln(Soacutelo me quedan + thisentradasPorVender+ entradas para esa zona)

if (thisentradasPorVender gt= n)

entradasPorVender -= n

Systemoutprintln(Aquiacute tiene sus + n + entradas gracias)

El menuacute del programa debe ser el que se muestra a continuacioacuten Cuandoelegimos la opcioacuten 2 se nos debe preguntar para queacute zona queremos lasentradas y cuaacutentas queremos Loacutegicamente el programa debe controlar queno se puedan vender maacutes entradas de la cuenta

1 Mostrar nuacutemero de entradas libres

2 Vender entradas

3 Salir

Programacioacuten orientada a objetos 131

993 Arrays de objetos

Ejercicio 1Utiliza la clase Gato para crear un array de cuatro gatos e introduce los datosde cada uno de ellos mediante un bucle Muestra a continuacioacuten los datos detodos los gatos utilizando tambieacuten un bucle

Ejercicio 2Cambia el programa anterior de tal forma que los datos de los gatos se intro-duzcan directamente en el coacutedigo de la forma gatito[2]setColor(ldquomarroacutenrdquo) o bienmediante el constructor de la forma gatito[3] = new Gato(ldquoGarfieldrdquo ldquonaranjardquo

ldquomachordquo) Muestra a continuacioacuten los datos de todos los gatos utilizando unbucle

Ejercicio 3Realiza el programa ldquoColeccioacuten de discosrdquo por tu cuenta mirando lo menosposible el ejemplo que se proporciona Prueacutebalo primero para ver coacutemofunciona y luego intenta implementarlo tuacute mismo

Ejercicio 4Modifica el programa ldquoColeccioacuten de discosrdquo como se indica a continuacioacutena) Mejora la opcioacuten ldquoNuevo discordquo de tal forma que cuando se llenen todas lasposiciones del array el programa muestre un mensaje de error No se permitiraacuteintroducir los datos de ninguacuten disco hasta que no se borre alguno de la listab) Mejora la opcioacuten ldquoBorrarrdquo de tal forma que se verifique que el coacutedigointroducido por el usuario existec) Modifica el programa de tal forma que el coacutedigo del disco sea uacutenico es decirque no se pueda repetird) Crea un submenuacute dentro dentro de ldquoListadordquo de tal forma que exista unlistado completo un listado por autor (todos los discos que ha publicado undeterminado autor) un listado por geacutenero (todos los discos de un geacutenero de-terminado) y un listado de discos cuya duracioacuten esteacute en un rango determinadopor el usuario

Programacioacuten orientada a objetos 132

Ejercicio 5Crea el programa GESTISIMAL (GESTIoacuten SIMplificada de Almaceacuten) para llevarel control de los artiacuteculos de un almaceacuten De cada artiacuteculo se debe saberel coacutedigo la descripcioacuten el precio de compra el precio de venta y el stock(nuacutemero de unidades) El menuacute del programa debe tener al menos lassiguientes opciones

1 Listado

2 Alta

3 Baja

4 Modificacioacuten

5 Entrada de mercanciacutea

6 Salida de mercanciacutea

7 Salir

La entrada y salida de mercanciacutea supone respectivamente el incremento ydecremento de stock de un determinado artiacuteculo Hay que controlar que no sepueda sacar maacutes mercanciacutea de la que hay en el almaceacuten

10 Colecciones y diccionarios

101 Colecciones la clase ArrayList

Una coleccioacuten en Java es una estructura de datos que permite almacenar muchosvalores del mismo tipo por tanto conceptualmente es praacutecticamente igual que unarray Seguacuten el uso y seguacuten si se permiten o no repeticiones Java dispone de un ampliocataacutelogo de colecciones ArrayList (lista) ArrayBlockingQueue (cola) HashSet (conjunto)Stack (pila) etc En este manual estudiaremos la coleccioacuten ArrayListUn ArrayList es una estructura en forma de lista que permite almacenar elementos delmismo tipo (pueden ser incluso objetos) su tamantildeo va cambiando a medida que seantildeaden o se eliminan esos elementosNos podemos imaginar un ArrayList como un conjunto de celdas o cajoncitos donde seguardan los valores exactamente igual que un array convencional En la praacutectica seraacutemaacutes faacutecil trabajar con un ArrayListEn capiacutetulos anteriores hemos podido comprobar la utilidad del array es un recursoimprescindible que cualquier programador debe manejar con soltura No obstante elarray presenta algunos inconvenientes Uno de ellos es la necesidad de conocer eltamantildeo exacto en el momento de su creacioacuten Una coleccioacuten sin embargo se crea sinque se tenga que especificar el tamantildeo posteriormente se van antildeadiendo y quitandoelementos a medida que se necesitanTrabajando con arrays es frecuente cometer errores al utilizar los iacutendices por ejemploal intentar guardar un elemento en una posicioacuten que no existe (iacutendice fuera de rango)Aunque las colecciones permiten el uso de iacutendices no es necesario indicarlos siemprePor ejemplo en una coleccioacuten del tipo ArrayList cuando hay que antildeadir el elementoAmapola se puede hacer simplemente floresadd(Amapola) Al no especificar iacutendice elelemento Amapola se antildeadiriacutea justo al final de flores independientemente del tamantildeoy del nuacutemero de elementos que se hayan introducido yaLa clase ArrayList es muy similar a la clase Vector Eacutesta uacuteltima estaacute obsoleta y por tantono se recomienda su uso

1011 Principales meacutetodos de ArrayList

Las operaciones maacutes comunes que se pueden realizar con un objeto de la claseArrayList son las siguientes

add(elemento)Antildeade un elemento al final de la lista

133

Colecciones y diccionarios 134

add(indice elemento)Inserta un elemento en una posicioacuten determinada desplazando el resto deelementos hacia la derecha

clear()Elimina todos los elementos pero no borra la lista

contains(elemento)Devuelve true si la lista contiene el elemento que se especifica y false en casocontrario

get(indice)Devuelve el elemento de la posicioacuten que se indica entre pareacutentesis

indexOf(elemento)Devuelve la posicioacuten de la primera ocurrencia del elemento que se indica entrepareacutentesis

isEmpty()Devuelve true si la lista estaacute vaciacutea y false en caso de tener alguacuten elemento

remove(indice)Elimina el elemento que se encuentra en una posicioacuten determinada

remove(elemento)Elimina la primera ocurrencia de un elemento

set(indice elemento)Machaca el elemento que se encuentra en una determinada posicioacuten con elelemento que se pasa como paraacutemetro

size()Devuelve el tamantildeo (nuacutemero de elementos) de la lista

toArray()Devuelve un array con todos y cada uno de los elementos que contiene la lista

Puedes consultar todos los meacutetodos disponibles en la documentacioacuten oficial de la claseArrayList1

1httpdocsoraclecomjavase7docsapijavautilArrayListhtml

Colecciones y diccionarios 135

1012 Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de suselementos

A continuacioacuten se muestra un ejemplo en el que se puede ver coacutemo se declara unArrayList y coacutemo se insertan y se extraen elementos

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList01

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

Systemoutprintln(Nordm de elementos + asize())

aadd(rojo)

aadd(verde)

aadd(azul)

Systemoutprintln(Nordm de elementos + asize())

aadd(blanco)

Systemoutprintln(Nordm de elementos + asize())

Systemoutprintln(El elemento que hay en la posicioacuten 0 es + aget(0))

Systemoutprintln(El elemento que hay en la posicioacuten 3 es + aget(3))

Observa que al crear un objeto de la clase ArrayList hay que indicar el tipo de dato quese almacenaraacute en las celdas de esa lista Para ello se utilizan los caracteres lt y gt Nohay que olvidar los pareacutentesis del final

Es necesario importar la clase ArrayList para poder crear objetos de estaclase para ello debe aparecer al principio del programa la liacutenea import

javautilArrayList Algunos IDEs (por ej Netbeans) insertan esta liacutenea decoacutedigo de forma automaacutetica

En el siguiente ejemplo se muestra un ArrayList de nuacutemeros enteros

Colecciones y diccionarios 136

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList011

public static void main(String[] args)

ArrayListltIntegergt a = new ArrayListltIntegergt()

aadd(18)

aadd(22)

aadd(-30)

Systemoutprintln(Nordm de elementos + asize())

Systemoutprintln(El elemento que hay en la posicioacuten 1 es + aget(1))

Se define la estructura de la siguiente manera

ArrayListltIntegergt a = new ArrayListltIntegergt()

Fiacutejate que no se utiliza el tipo simple int sino el wrapper Integer Recuerda quelos wrapper son clases que engloban a los tipos simples y les antildeaden nuevasfuncionalidades (p ej permiten tratar a las variables numeacutericas como objetos) Elwrapper de int es Integer el de float es Float el de double es Double el de long es Longel de boolean es Boolean y el de char es CharacterEn el siguiente ejemplo podemos ver coacutemo extraer todos los elementos de una lista ala manera tradicional con un bulce for

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList02

Colecciones y diccionarios 137

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(int i=0 i lt asize() i++)

Systemoutprintln(aget(i))

Si estaacutes acostumbrado al for claacutesico habraacutes visto que es muy sencillo recorrer todoslos elementos del ArrayList No obstante al trabajar con colecciones es recomendableusar el for al estilo foreach como se muestra en el siguiente ejemplo Como puedes verla sintaxis es maacutes corta y no se necesita crear un iacutendice para recorrer la estructura

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList03

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(String color a)

Colecciones y diccionarios 138

Systemoutprintln(color)

Fiacutejate en estas liacuteneas

for(String color a)

Systemoutprintln(color)

El significado de este coacutedigo seriacutea el siguiente

for(String color a)

rarr Saca uno a uno todos los elementos de a y ve metieacutendolos en una variable de nombrecolor

Systemoutprintln(color)

rarr Muestra por pantalla el contenido de la variable colorVeamos ahora en otro ejemplo coacutemo eliminar elementos de un ArrayList Se utiliza elmeacutetodo remove() y se puede pasar como paraacutemetro el iacutendice del elemento que se quiereeliminar o bien el valor del elemento O sea aremove(2) elimina el elemento que seencuentra en la posicioacuten 2 de a mientras que aremove(blanco) elimina el valor blancoEs importante destacar que el ArrayList se reestructura de forma automaacutetica despueacutesdel borrado de cualquiera de sus elementos

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList04

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

Colecciones y diccionarios 139

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

aadd(blanco)

Systemoutprintln(Contenido de la lista )

for(String color a)

Systemoutprintln(color)

if (acontains(blanco))

Systemoutprintln(El blanco estaacute en la lista de colores)

aremove(blanco)

Systemoutprintln(Contenido de la lista despueacutes de quitar la +

primera ocurrencia del color blanco )

for(String color a)

Systemoutprintln(color)

aremove(2)

Systemoutprintln(Contenido de la lista despueacutes de quitar el +

elemento de la posicioacuten 2 )

for(String color a)

Systemoutprintln(color)

A continuacioacuten se muestra un ejemplo en el que se ldquomachacardquo una posicioacuten delArrayList Al hacer aset(2 turquesa) se borra lo que hubiera en la posicioacuten 2 y secoloca el valor turquesa Seriacutea equivalente a hacer a[2] = turquesa en caso de que a

fuese un array tradicional en lugar de un ArrayList

Colecciones y diccionarios 140

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList05

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido del vector )

for(String color a)

Systemoutprintln(color)

aset(2 turquesa)

Systemoutprintln(Contenido del vector despueacutes de machacar la posicioacuten 2 )

for(String color a)

Systemoutprintln(color)

El meacutetodo add permite antildeadir elementos a un ArrayList como ya hemos visto Porejemplo aadd(amarillo) antildeade el elemento amarillo al final de a Este meacutetodo sepuede utilizar tambieacuten con un iacutendice de la forma aadd(1 turquesa) En este caso loque se hace es insertar en la poscioacuten indicada Lo mejor de todo es que el ArrayList sereestructura de forma automaacutetica desplazando el resto de elementos

Colecciones y diccionarios 141

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList06

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(String color a)

Systemoutprintln(color)

aadd(1 turquesa)

Systemoutprintln(Contenido del vector despueacutes de insertar en la posicioacuten 1 )

for(String color a)

Systemoutprintln(color)

1013 ArrayList de objetos

Una coleccioacuten ArrayList puede contener objetos que son instancias de clases definidaspor el programador Esto es muy uacutetil sobre todo en aplicaciones de gestioacuten paraguardar datos de alumnos productos libros etcEn el siguiente ejemplo definimos una lista de gatos En cada celda de la lista sealmacenaraacute un objeto de la clase Gato

Colecciones y diccionarios 142

Uso de un ArrayList de objetos author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList07

public static void main(String[] args)

ArrayListltGatogt g = new ArrayListltGatogt()

gadd(new Gato(Garfield naranja mestizo))

gadd(new Gato(Pepe gris angora))

gadd(new Gato(Mauri blanco manx))

gadd(new Gato(Ulises marroacuten persa))

Systemoutprintln(nDatos de los gatosn)

for (Gato gatoAux g)

Systemoutprintln(gatoAux+n)

En el siguiente apartado se muestra la definicioacuten de la clase Gato

1014 Ordenacioacuten de un ArrayList

Los elementos de una lista se pueden ordenar con el meacutetodo sort El formato es elsiguiente

Collectionssort(lista)

Observa que sort es un meacutetodo de clase que estaacute definido en Collections Para poderutilizar este meacutetodo es necesario incluir la liacutenea

import javautilCollections

al principio del programa A continuacioacuten se muestra un ejemplo del uso de sort

Colecciones y diccionarios 143

Ordenacioacuten de un ArrayList author Luis Joseacute Saacutenchez

import javautilCollectionsimport javautilArrayList

public class EjemploArrayList071

public static void main(String[] args)

ArrayListltIntegergt a = new ArrayListltIntegergt()

aadd(67)

aadd(78)

aadd(10)

aadd(4)

Systemoutprintln(nNuacutemeros en el orden original)

for (int numero a)

Systemoutprintln(numero)

Collectionssort(a)

Systemoutprintln(nNuacutemeros ordenados)

for (int numero a)

Systemoutprintln(numero)

Tambieacuten es posible ordenar una lista de objetos En este caso es necesario indicar elcriterio de ordenacioacuten en la definicioacuten de la clase En el programa principal se utilizael meacutetodo sort igual que si se tratase de una lista de nuacutemeros o de palabras como semuestra a continuacioacuten

Colecciones y diccionarios 144

Ordenacioacuten de un ArrayList de objetos author Luis Joseacute Saacutenchez

import javautilCollectionsimport javautilArrayList

public class EjemploArrayList08

public static void main(String[] args)

ArrayListltGatogt g = new ArrayListltGatogt()

gadd(new Gato(Garfield naranja mestizo))

gadd(new Gato(Pepe gris angora))

gadd(new Gato(Mauri blanco manx))

gadd(new Gato(Ulises marroacuten persa))

gadd(new Gato(Adaacuten negro angora))

Collectionssort(g)

Systemoutprintln(nDatos de los gatos ordenados por nombre)

for (Gato gatoAux g)

Systemoutprintln(gatoAux+n)

Ahora bien en la definicioacuten de la clase Gato hay que indicar de alguna manera coacutemo sedebe realizar la ordenacioacuten ya que Java no sabe de antemano si los gatos se ordenanseguacuten el color el nombre el peso etcLo primero que hay que hacer es indicar que los objetos de la clase Gato se puedencomparar unos con otros Para ello cambiamos la siguiente liacutenea

public class Gato

por esta otra

public class Gato implements ComparableltGatogt

Lo siguiente y no menos importante es definir el meacutetodo compareTo Este meacutetodo debedevolver un 0 si los elementos que se comparan son iguales un nuacutemero negativo si

Colecciones y diccionarios 145

el primer elemento que se compara es menor que el segundo y un nuacutemero positivoen caso contrario Afortunadamente las clases String Integer Double etc ya tienenimplementado su propio meacutetodo compareTo asiacute que tenemos hecho lo maacutes difiacutecil Louacutenico que deberemos escribir en nuestro coacutedigo es un compareTo con los atributos quequeremos compararEn el caso que nos ocupa si queremos ordenar los gatos por nombre tendremos queimplementar el compareTo de la clase Gato de tal forma que nos devuelva el resultadodel compareTo de los nombres de los gatos que estamos comparando de la siguientemanera

public int compareTo(Gato g)

return (thisnombre)compareTo(ggetNombre())

Si en lugar de ordenar por nombre quisieacuteramos ordenar por raza el meacutetodo compareTo

de la clase Gato seriacutea el siguiente

public int compareTo(Gato g)

return (thisraza)compareTo(ggetRaza())

A continuacioacuten se muestra la definicioacuten completa de la clase Gato

Definicioacuten de la clase Gato author

public class Gato implements ComparableltGatogt

private String nombre

private String color

private String raza

public Gato(String nombre String color String raza)

thisnombre = nombre

thiscolor = color

thisraza = raza

public String getNombre()

return nombre

Colecciones y diccionarios 146

public String getRaza()

return raza

public String toString()

return Nombre + thisnombre + nColor + thiscolor + nRaza + thisraza

public int compareTo(Gato g)

return (thisnombre)compareTo(ggetNombre())

public boolean equals(Gato g)

return (thisnombre)equals(ggetNombre())

102 Diccionarios la clase HashMap

Imagina un diccionario ingleacutes-espantildeol Queremos saber queacute significa la palabra ldquostiffrdquoSabemos que en el diccionario hay muchas entradas y en cada entrada tenemos unapalabra en ingleacutes y su correspondiente traduccioacuten al espantildeol Buscando por la ldquosrdquoencontramos que ldquostiffrdquo significa ldquoagujetasrdquoUn diccionario en Java funciona exactamente igual Contiene una serie de elementosque son las entradas que a su vez estaacuten formadas por un par (clave valor) La clave(key) permite acceder al valor No puede haber claves duplicadas En el ejemploanterior la clave seriacutea ldquostiffrdquo y el valor ldquoagujetasrdquoJava dispone de varios tipos de diccionarios HashMap EnumMap Hashtable IdentityHashMapLinkedHashMap etc Nosotros estudiaremos el diccionario HashMap

1021 Principales meacutetodos de HashMap

Algunos de los meacutetodos maacutes importantes de la clase HasMap son

get(clave)Obtiene el valor correspondiente a una clave Devuelve null si no existe esa claveen el diccionario

put(clave valor)Antildeade un par (clave valor) al diccionario Si ya habiacutea un valor para esa clave semachaca

keySet()Devuelve un conjunto (set) con todas las claves

Colecciones y diccionarios 147

values()Devuelve una coleccioacuten con todos los valores (los valores pueden estar duplicadosa diferencia de las claves)

entrySet()Devuelve una coleccioacuten con todos los pares (clave valor)

containsKey(clave)Devuelve true si el diccionario contiene la clave indicada y false en caso contrario

getKey()Devuelve la clave de la entrada Se aplica a una sola entrada del diccionario (noal diccionario completo) es decir a una pareja (clave valor)

Por ejemplo

for (MapEntry pareja mentrySet())

Systemoutprintln(parejagetKey())

getValue()Devuelve el contenido de la entrada Se aplica a una entrada del diccionario (noal diccionario completo) es decir a una pareja (clave valor)

Por ejemplo

for (MapEntry pareja mentrySet())

Systemoutprintln(parejagetValue())

1022 Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas

Al declarar un diccionario hay que indicar los tipos tanto de la clave como del valorEn el siguiente ejemplo definimos el diccionario m que tendraacute como clave un nuacutemeroentero y una cadena de caracteres como valor Este diccionario se declara de estaforma

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

No hay que olvidar importar la clase al principio del programa

import javautilHashMap

Para insertar una entrada en el diccionario se utiliza el meacutetodo put indicando siemprela clave y el valor Veamos un ejemplo completo

Colecciones y diccionarios 148

Ejemplo de uso de la clase HasMap author Luis Joseacute Saacutenchez

import javautilHashMap

public class EjemploHashMap01

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(Los elementos de m son n + m)

Para extraer valores se utiliza el meacutetodo get Se proporciona una clave y el diccionarionos devuelve el valor igual que un diccionario de verdad Si no existe ninguna entradacon la clave que se indica se devuelve null

Ejemplo de uso de la clase HasMap author Luis Joseacute Saacutenchez

import javautilHashMap

public class EjemploHashMap011

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

Colecciones y diccionarios 149

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(mget(921))

Systemoutprintln(mget(605))

Systemoutprintln(mget(888))

iquestY si queremos extraer todas las entradas Tenemos varias opciones Podemos usar elmeacutetodo print directamente sobre el diccionario de la forma Systemoutprint(diccionario)

como vimos en un ejemplo anterior de esta manera se muestran por pantalla todaslas entradas encerradas entre llaves Tambieacuten podemos convertir el diccionario enun entrySet (conjunto de entradas) y mostrarlo con print de esta forma se obtieneuna salida por pantalla muy parecida a la primera (en lugar de llaves se muestrancorchetes) Otra opcioacuten es utilizar un for para recorrer una a una todas las entradasEn este uacuteltimo caso hay que convertir el diccionario en un entrySet ya que no se puedensacar las entradas directamente del diccionario Estas dos uacuteltimas opciones se ilustranen el siguiente ejemplo

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautilHashMapimport javautilMap

public class EjemploHashMap02

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(Todas las entradas del diccionario extraiacutedas con entrySet)

Systemoutprintln(mentrySet())

Systemoutprintln(nEntradas del diccionario extraiacutedas una a una)

Colecciones y diccionarios 150

for (MapEntry pareja mentrySet())

Systemoutprintln(pareja)

A continuacioacuten se muestra el uso de los meacutetodos getKey y getValue que extraen la clavey el valor de una entrada respectivamente

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautil

public class EjemploHashMap03

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(CoacutedigotNombren------t-------------)

for (MapEntry pareja mentrySet())

Systemoutprint(parejagetKey() + t)

Systemoutprintln(parejagetValue())

En el uacuteltimo programa de ejemplo hacemos uso del meacutetodo containsKey que nos serviraacutepara saber si existe o no una determinada clave en un diccionario y del meacutetodo get

que como ya hemos visto sirve para extraer un valor a partir de su clave

Colecciones y diccionarios 151

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautil

public class EjemploHashMap04

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprint(Por favor introduzca un coacutedigo )

int codigoIntroducido = IntegerparseInt(Systemconsole()readLine())

if (mcontainsKey(codigoIntroducido))

Systemoutprint(El coacutedigo + codigoIntroducido + corresponde a )

Systemoutprintln(mget(codigoIntroducido))

else

Systemoutprint(El coacutedigo introducido no existe)

Colecciones y diccionarios 152

103 Ejercicios

Ejercicio 1Crea un ArrayList con los nombres de 6 compantildeeros de clase A continuacioacutenmuestra esos nombres por pantalla Utiliza para ello un bucle for que recorratodo el ArrayList sin usar ninguacuten iacutendice

Ejercicio 2Realiza un programa que introduzca valores aleatorios (entre 0 y 100) en unArrayList y que luego calcule la suma la media el maacuteximo y el miacutenimo de esosnuacutemeros El tamantildeo de la lista tambieacuten seraacute aleatorio y podraacute oscilar entre 10y 20 elementos ambos inclusive

Ejercicio 3Escribe un programa que ordene 10 nuacutemeros enteros introducidos por tecladoy almacenados en un objeto de la clase ArrayList

Ejercicio 4Realiza un programa equivalente al anterior pero en esta ocasioacuten el programadebe ordenar palabras en lugar de nuacutemeros

Ejercicio 5Realiza de nuevo el ejercicio de la coleccioacuten de discos pero utilizando esta vezuna lista para almacenar la informacioacuten sobre los discos en lugar de un arrayconvencional Comprobaraacutes que el coacutedigo se simplifica notablemente iquestCuaacutentoocupa el programa original hecho con un array iquestCuaacutento ocupa este nuevoprograma hecho con una lista

Ejercicio 6Implementa el control de acceso al aacuterea restringida de un programa Se debepedir un nombre de usuario y una contrasentildea Si el usuario introduce losdatos correctamente el programa diraacute ldquoHa accedido al aacuterea restringidardquo Elusuario tendraacute un maacuteximo de 3 oportunidades Si se agotan las oportunidadesel programa diraacute ldquoLo siento no tiene acceso al aacuterea restringidardquo Los nombresde usuario con sus correspondientes contrasentildeas deben estar almacenadosen una estructura de la clase HashMap

Colecciones y diccionarios 153

Ejercicio 7La maacutequina Eurocoin genera una moneda de curso legal cada vez que se pulsaun botoacuten siguiendo la siguiente pauta o bien coincide el valor con la monedaanteriormente generada - 1 ceacutentimo 2 ceacutentimos 5 ceacutentimos 10 ceacutentimos 25ceacutentimos 50 ceacutentimos 1 euro o 2 euros - o bien coincide la posicioacuten ndash cara ocruz Simula mediante un programa la generacioacuten de 6 monedas aleatoriassiguiendo la pauta correcta Cada moneda generada debe ser una instanciade la clase Moneda y la secuencia se debe ir almacenando en una lista

Ejemplo

2 ceacutentimos ndash cara

2 ceacutentimos ndash cruz

50 ceacutentimos ndash cruz

1 euro ndash cruz

1 euro ndash cara

10 ceacutentimos ndash cara

Ejercicio 8Realiza un programa que escoja al azar 10 cartas de la baraja espantildeola(10 objetos de la clase Carta) Emplea un objeto de la clase ArrayList paraalmacenarlas y aseguacuterate de que no se repite ninguna

Ejercicio 9Modifica el programa anterior de tal forma que las cartas se muestren orde-nadas Primero se ordenaraacuten por palo bastos copas espadas oros Cuandocoincida el palo se ordenaraacute por nuacutemero as 2 3 4 5 6 7 sota caballo rey

Ejercicio 10Crea un mini-diccionario espantildeol-ingleacutes que contenga al menos 20 palabras(con su correspondiente traduccioacuten) Utiliza un objeto de la clase HashMap paraalmacenar las parejas de palabras El programa pediraacute una palabra en espantildeoly daraacute la correspondiente traduccioacuten en ingleacutes

Ejercicio 11Realiza un programa que escoja al azar 5 palabras en espantildeol del mini-diccionario del ejercicio anterior El programa iraacute pidiendo que el usuarioteclee la traduccioacuten al ingleacutes de cada una de las palabras y comprobaraacute sison correctas Al final el programa deberaacute mostrar cuaacutentas respuestas sonvaacutelidas y cuaacutentas erroacuteneas

Colecciones y diccionarios 154

Ejercicio 12Escribe un programa que genere una secuencia de 5 cartas de la barajaespantildeola y que sume los puntos seguacuten el juego de la brisca El valor de lascartas se debe guardar en una estructura HashMap que debe contener parejas(figura valor) por ejemplo (ldquocaballordquo 3) La secuencia de cartas debe ser unaestructura de la clase ArrayList que contiene objetos de la clase Carta El valorde las cartas es el siguiente as rarr 11 tres rarr 10 sota rarr 2 caballo rarr 3 rey rarr4 el resto de cartas no vale nada

Ejemplo

as de oros

cinco de bastos

caballo de espadas

sota de copas

tres de oros

Tienes 26 puntos

Ejercicio 13Modifica el programa Gestisimal realizado anteriormente antildeadiendo lassiguientes mejoras

bull Utiliza una lista en lugar de un array para el almacenamiento de los datosbull Comprueba la existencia del coacutedigo en el alta la baja y la modificacioacuten

de artiacuteculos para evitar erroresbull Cambia la opcioacuten ldquoSalida de stockrdquo por ldquoVentardquo Esta nueva opcioacuten

permitiraacute hacer una venta de varios artiacuteculos y emitir la factura corres-pondiente Se debe preguntar por los coacutedigos y las cantidades de cadaartiacuteculo que se quiere comprar Aplica un 21 de IVA

11 Ficheros de texto y paso de paraacutemetrospor liacutenea de comandos

Mediante un programa en Java se puede acceder al contenido de un fichero grabadoen un dispositivo de almacenamiento (por ejemplo en el disco duro) tanto para leercomo para escribir (grabar) datosLa informacioacuten contenida en las variables los arrays los objetos o cualquier otraestructura de datos es volaacutetil es decir se pierde cuando se cierra el programaLos ficheros permiten tener ciertos datos almacenados y disponibles en cualquiermomento para cuando nuestro programa los necesitePensemos por ejemplo en un juego Podriacuteamos utilizar un fichero para guardar elranking de jugadores con las mejores puntuaciones De esta manera estos datos nose perderiacutean al salir del juego De igual forma en un programa de gestioacuten puede seruacutetil tener un fichero de configuracioacuten con datos como el nuacutemero maacuteximo de elementosque se muestran en un listado o los distintos tipos de IVA aplicables a las facturas Almodificar esta informacioacuten quedaraacute almacenada en el fichero correspondiente y nose perderaacute cuando se cierre el programa

Cuando un programa se cierra se pierde la informacioacuten almacenada envariables arrays objetos o cualquier otra estructura Si queremos conservarciertos datos debemos guardarlos en ficheros

Hay programas que hacen un uso intensivo de datos Por ejemplo la aplicacioacutenSeacuteneca- que por cierto estaacute hecha en Java - lleva el control de la matriculacioacuten de cientosde miles de alumnos y la gestioacuten de decenas de miles de profesores En este caso yen otros similares se utiliza un sistema gestor de bases de datos El acceso a bases dedatos mediante Java lo estudiaremos en el capiacutetulo 13

La creacioacuten y uso de ficheros desde un programa en Java se lleva a cabocuando hay poca informacioacuten que almacenar o cuando esa informacioacuten esheterogeacutenea En los casos en que la informacioacuten es abundante y homogeacuteneaes preferible usar una base de datos relacional (por ejemplo MySQL) en lugarde ficheros

En este capiacutetulo estudiaremos ademaacutes del acceso a ficheros desde un programa enJava el paso de paraacutemetros desde la liacutenea de comandos Son cosas diferentes y nohay que utilizarlas juntas necesariamente pero como podraacutes comprobar se combinanmuy bien por eso hemos incluido estos dos recursos de Java en un mismo capiacutetulo

155

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 156

111 Lectura de un fichero de texto

Aunque Java puede manejar tambieacuten ficheros binarios vamos a centrarnos exclusi-vamente en la utilizacioacuten de ficheros de texto Los ficheros de texto tienen una granventaja se pueden crear y manipular mediante cualquier editor como por ejemploGEditSiempre que vayamos a usar ficheros deberemos incluir al principio del programa unao varias liacuteneas para cargar las clases necesarias Anque se pueden cargar varias clasesen una sola liacutenea usando el asterisco de la siguiente manera

import javaio

nosotros no lo haremos asiacute ya que nuestro coacutedigo sigue las normas del estaacutendar deGoogle y estas normas lo prohiben taxativamente Se importaraacuten las clases usandovarias liacuteneas una liacutenea por cada clase que se importa en el programa de esta forma

import javaioBufferedReaderimport javaioFileReader

No es necesario saber de memoria los nombres de las clases el entorno de desarrolloNetbeans detecta queacute clases hacen falta cargar y antildeade los import de forma automaacute-ticaTodas las operaciones que se realicen sobre ficheros deberaacuten estar incluidas en unbloque try-catch Esto nos permitiraacute mostrar mensajes de error y terminar el programade una forma ordenada en caso de que se produzca alguacuten fallo - el fichero no existeno tenemos permiso para acceder a eacutel etcEl bloque try-catch tiene el siguiente formato

try

Operaciones_con_fichero

catch (tipo_de_error nombre_de_variable)

Mensaje_de_error

Tanto para leer como para escribir utilizamos lo que en programacioacuten se llama unldquomanejador de ficherordquo Es algo asiacute como una variable que hace referencia al ficherocon el que queremos trabajarEn nuestro ejemplo el manejador de fichero se llama bf y se crea de la siguientemanera

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 157

BufferedReader bf = new BufferedReader(new FileReader(malaga1txt))

El fichero con el que vamos a trabajar tiene por nombre malaga1txt y contieneinformacioacuten extraiacuteda de la Wikipedia sobre la bonita ciudad de Maacutelaga1 A partir deaquiacute siempre que queramos realizar una operacioacuten sobre ese archivo utilizaremos sumanejador de fichero asociado es decir bfEn el ejemplo que se muestra a continuacioacuten el programa lee el contenido del ficheromalaga1txt y lo muestra tal cual en pantalla igual que si hicieacuteramos en una ventanade terminal cat malaga1txtObserva que se va leyendo el fichero liacutenea a liacutenea mediante bfreadLine() hasta que seacaban las liacuteneas Cuando no quedan maacutes liacuteneas por leer se devuelve el valor null

Ejemplo de uso de la clase File Lectura de un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileNotFoundExceptionimport javaioFileReaderimport javaioIOException

class EjemploFichero01

public static void main(String[] args)

try

BufferedReader bf = new BufferedReader(new FileReader(malaga1txt))

String linea =

while (linea = null)

Systemoutprintln(linea)

linea = bfreadLine()

bfclose()

catch (FileNotFoundException e) queacute hacer si no se encuentra el ficheroSystemoutprintln(No se encuentra el fichero malagatxt)

catch (IOException e) queacute hacer si hay un error en la lectura del fichero

1httpeswikipediaorgwikiMC3A1laga

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 158

Systemoutprintln(No se puede leer el fichero malagatxt)

Es importante ldquocerrar el ficherordquo cuando se han realizado todas las operacionesnecesarias sobre eacutel En este ejemplo esta accioacuten se ha llevado a cabo con la sentenciabfclose()A continuacioacuten se muestra un programa un poco maacutes complejo Se trata de unaaplicacioacuten que pide por teclado un nombre de fichero Previamente en ese fichero(por ejemplo numerostxt) habremos introducido una serie de nuacutemeros a razoacuten de unopor liacutenea Se podriacutean leer tambieacuten los nuacutemeros si estuvieran separados por comaso espacios aunque seriacutea un poco maacutes complicado (no mucho maacutes) Los nuacutemerospueden contener decimales ya que se van a leer como Double Cada nuacutemero que selee del fichero se va sumando de tal forma que la suma total estaraacute contenida en lavariable suma a la par se va llevando la cuenta de los elementos que se van leyendoen la variable i Finalmente dividiendo la suma total entre el nuacutemero de elementosobtenemos la media aritmeacutetica de los nuacutemeros contenidos en el fichero

Ejemplo de uso de la clase File Calcula la media de los nuacutemeros que se encuentran en un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileReaderimport javaioIOException

class EjemploFichero08

public static void main(String[] args)

Systemoutprint(Introduzca el nombre del archivo donde se encuentran los nuacutemeros )

String nombreFichero = Systemconsole()readLine()

try

BufferedReader bf = new BufferedReader(new FileReader(nombreFichero))

String linea = 0

int i = 0

double suma = 0

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 159

while (linea = null)

i++

suma += DoubleparseDouble(linea)

linea = bfreadLine()

i--

bfclose()

Systemoutprintln(La media es + suma (double)i)

catch (IOException e)

Systemoutprintln(egetMessage())

112 Escritura sobre un fichero de texto

La escritura en un fichero de texto es si cabe maacutes faacutecil que la lectura Solo hay quecambiar Systemoutprint(texto) por manejadorwrite(texto) Se pueden incluir saltosde liacutenea tabuladores y espacios igual que al mostrar un mensaje por pantallaEs importante ejecutar close() despueacutes de realizar la escritura de esta manera nosaseguramos que se graba toda la informacioacuten en el discoAl realizar escrituras en ficheros con Java hay que tener ciertas precauciones Cuandotoca dar este tema en clase es frecuente que a maacutes de un alumno le empiece a irlento el ordenador luego se le queda inutilizado y por uacuteltimo ni siquiera le arrancaiquestqueacute ha pasado Pues que ha estado escribiendo datos en ficheros y por alguna razoacutensu programa se ha metido en un bucle infinito lo que da como resultado cuelgues yficheros de varios gigabytes de basura Por eso es muy importante asegurarse biende que la informacioacuten que se va a enviar a un fichero es la correcta iquestcoacutemo muy faacutecilenviaacutendola primero a la pantalla

Primero a pantalla y luego a ficheroEnviacutea primero a la pantalla todo lo que quieras escribir en el fichero Cuandocompruebes que lo que se ve por pantalla es realmente lo que quieres grabaren el fichero entonces y solo entonces cambia Systemoutprint(texto) pormanejadorwrite(texto)

A continuacioacuten se muestra un programa de ejemplo que crea un fichero de texto yluego esribe en eacutel tres palabras una por cada liacutenea

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 160

Ejemplo de uso de la clase File Escritura en un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedWriterimport javaioFileWriterimport javaioIOException

class EjemploFichero02

public static void main(String[] args)

try

BufferedWriter bw = new BufferedWriter(new FileWriter(frutatxt))

bwwrite(naranjan)

bwwrite(mangon)

bwwrite(chirimoyan)

bwclose()

catch (IOException ioe)

Systemoutprintln(No se ha podido escribir en el fichero)

113 Lectura y escritura combinadas

Las operaciones de lectura y escritura sobre ficheros se pueden combinar de tal formaque haya un flujo de lectura y otro de escritura uno de lectura y dos de escritura tresde lectura etcEn el ejemplo que presentamos a continuacioacuten hay dos flujos de lectura y uno deescritura Observa que se declaran en total tres manejadores de fichero (dos paralectura y uno para escritura) El programa va leyendo de forma alterna una liacutenea decada fichero - una liacutenea de fichero1txt y otra liacutenea de fichero2txt - mientras quedenliacuteneas por leer en alguno de los ficheros y al mismo tiempo va guardando esas liacuteneasen otro fichero con nombre mezclatxt

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 161

Ejemplo de uso de la clase File Mezcla de dos ficheros author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioBufferedWriterimport javaioFileReaderimport javaioFileWriterimport javaioIOException

class EjemploFichero03

public static void main(String[] args)

try

BufferedReader bf1 = new BufferedReader(new FileReader(fichero1txt))

BufferedReader bf2 = new BufferedReader(new FileReader(fichero2txt))

BufferedWriter bw = new BufferedWriter(new FileWriter(mezclatxt))

String linea1 =

String linea2 =

while ( (linea1 = null) || (linea2 = null) )

linea1 = bf1readLine()

linea2 = bf2readLine()

if (linea1 = null) bwwrite(linea1 + n)

if (linea2 = null) bwwrite(linea2 + n)

bf1close()

bf2close()

bwclose()

catch (IOException ioe)

Systemoutprintln(Se ha producido un error de lecturaescritura)

Systemerrprintln(ioegetMessage())

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 162

114 Otras operaciones sobre ficheros

Ademaacutes de leer desde o escribir en un fichero hay otras operaciones relacionadas conlos archivos que se pueden realizar desde un programa escrito en JavaVeremos tan solo un par de ejemplos Si quieres profundizar maacutes eacutechale un vistazo ala documentacioacuten oficial de la clase File2El siguiente ejemplo muestra por pantalla un listado con todos los archivos quecontiene un directorio

Ejemplo de uso de la clase File Listado de los archivos del directorio actual author Luis Joseacute Saacutenchez

import javaioFile

class EjemploFichero04

public static void main(String[] args)

File fichero = new File() se indica la ruta entre comillas el punto () es el directorio actual

String[] listaArchivos = ficherolist()

for(int i = 0 i lt listaArchivoslength i++)

Systemoutprintln(listaArchivos[i])

El siguiente programa de ejemplo comprueba si un determinado archivo existe ono mediante exists() y en caso de que exista lo elimina mediante delete() Siintentaacuteramos borrar un archivo que no existe obtendriacuteamos un error

2httpdocsoraclecomjavase7docsapijavaioFilehtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 163

Ejemplo de uso de la clase File Comprobacioacuten de existencia y borrado de un fichero author Luis Joseacute Saacutenchez

import javaioFile

class EjemploFichero05

public static void main(String[] args)

Systemoutprint(Introduzca el nombre del archivo que desea borrar )

String nombreFichero = Systemconsole()readLine()

File fichero = new File(nombreFichero)

if (ficheroexists())

ficherodelete()

Systemoutprintln(El fichero se ha borrado correctamente)

else

Systemoutprintln(El fichero + nombreFichero + no existe)

115 Paso de argumentos por liacutenea de comandos

Como dijimos al comienzo de este capiacutetulo el paso de argumentos por liacutenea decomandos no estaacute directamente relacionado con los ficheros aunque es muy frecuentecombinar estos dos recursosSeguro que has usado muchas veces el paso de argumentos por liacutenea de comandossin saberlo Por ejemplo si tecleas el siguiente comando en una ventana de terminal

$ head -5 etcbashbashrc

se muestran por pantalla las 5 primeras liacuteneas del fichero bashbashrc que se encuentraen el directorio etc En este caso head es el nombre del programa que estamosejecutando y los valores -5 y etcbashbashrc son los argumentosVolvamos al comienzo al primer capiacutetulo iquestRecuerdas coacutemo ejecutaste tu primerprograma en Java iexclQueacute tiempos aqueacutellos El programa HolaMundo se ejecutaba asiacute

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 164

$ java HolaMundo

Para probar los ejemplos que te presentamos maacutes adelante deberaacutes hacer lo mismo yademaacutes antildeadir a continuacioacuten y separados por espacios los argumentos que quieresque lea el programa Vamos a verlo en detalleEl siguiente programa de ejemplo simplemente muestra por pantalla los argumentosintroducidos Compila el programa y prueba a ejecutar lo siguiente

$ java EjemploArgumentos06 hola que tal 24 12 fin

con lo que obtendraacutes el siguiente resultado

Los argumentos introducidos son

hola

que

tal

24

12

fin

Los argumentos han pasado al programa en virtud del paraacutemetro que incluimos en laliacutenea del main

public static void main(String[] args)

Fiacutejate en lo que hay entre pareacutentesis String[] args Se trata de un array de cadenasde caracteres (String) donde cada uno de los elementos seraacute un argumento que se hapasado como paraacutemetro Si has ejecutado el ejemplo tal y como se ha indicado args[0]vale ldquoholardquo args[1] vale ldquoquerdquo args[2] vale ldquotalrdquo args[3] vale ldquo24rdquo args[4] vale ldquo12rdquo yargs[5] vale ldquofinrdquo

Paso de argumentos en la liacutenea de comandos author Luis Joseacute Saacutenchez

class EjemploArgumentos06

public static void main(String[] args)

Systemoutprintln(Los argumentos introducidos son )

for (int i = 0 i lt argslength i++)

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 165

Systemoutprintln(args[i])

Hagamos algo un poco maacutes uacutetil con los argumentos En el siguiente ejemplo se sumantodos los argumentos que se pasan como paraacutemetros y se muestra por pantalla elresultado de la sumaDespueacutes de compilar deberaacutes ejecutar desde una ventana de terminal lo siguiente(puedes cambiar los nuacutemeros si quieres)

$ java EjemploArgumentos07 10 36 44

con lo que obtendraacutes este resultado

90

es decir la suma de los nuacutemeros que has pasado como paraacutemetros

Paso de argumentos en la liacutenea de comandos author Luis Joseacute Saacutenchez

class EjemploArgumentos07

public static void main(String[] args)

int suma = 0

for (int i = 0 i lt argslength i++)

suma += IntegerparseInt(args[i])

Systemoutprintln(suma)

Observa que el programa convierte en nuacutemeros enteros todos y cada uno de losargumentos mediante el meacutetodo IntegerparseInt() para poder sumarlos

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 166

Los argumentos recogidos por liacutenea de comandos se guardan siempre enun array de String Cuando sea necesario realizar operaciones matemaacuteticascon esos argumentos habriacutea que convertirlos al tipo adecuado medianteIntegerparseInt() o DoubleparseDouble()

116 Combinacioacuten de ficheros y paso de argumentos

Llegoacute el momento de combinar las operaciones con ficheros con el paso de paraacutemetrospor liacutenea de comandos El ejemplo que mostramos a continuacioacuten es parecido al quehemos visto en el apartado anterior calcula la media de una serie de nuacutemeros peroesta vez esos nuacutemeros se leen desde un fichero y lo que se pasa como paraacutemetro por laliacutenea de comandos es precisamente el nombre del fichero donde estaacuten esos nuacutemerosCrea un fichero y noacutembralo numerostxt e introduce los siguientes nuacutemeros (es impor-tante que esteacuten separados por un salto de liacutena para que el programa funcione bien)

25

100

44

17

6

8

A continuacioacuten compila el programa de ejemplo EjemploFichero09java y teclea losiguiente en la ventana de terminal

$ java EjemploFichero09 numerostxt

Apareceraacute el siguiente resultado

La media es 33333333333333336

Ejemplo de uso de la clase File Calcula la media de los nuacutemeros que se encuentran en un fichero de texto El nombre del fichero se pasa como argumento en la liacutenea de comandos author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileReader

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 167

import javaioIOException

class EjemploFichero09

public static void main(String[] args)

if (argslength = 1)

Systemoutprintln(Este programa calcula la media de los nuacutemeros contenidos en un f

ichero)

Systemoutprintln(Uso del programa java EjemploFichero09 FICHERO)

Systemexit(-1) sale del programa

try

BufferedReader bf = new BufferedReader(new FileReader(args[0]))

String linea = 0

int i = 0

double suma = 0

while (linea = null)

i++

suma += DoubleparseDouble(linea)

linea = bfreadLine()

i--

bfclose()

Systemoutprintln(La media es + suma(double)i)

catch (IOException e)

Systemoutprintln(egetMessage())

Observa que el programa comprueba el nuacutemero de argumentos que se pasan por laliacutenea de comandos mediante if (argslength = 1) y si este nuacutemero es distinto de 1muestra este mensaje

Este programa calcula la media de los nuacutemeros contenidos en un fichero

Uso del programa java EjemploFichero09 FICHERO

y sale del programa De esta manera el usuario sabe exactamente coacutemo hay queutilizar el programa y coacutemo hay que pasarle la informacioacuten

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 168

117 Procesamiento de archivos de texto

La posibilidad de realizar desde Java operaciones con ficheros abre muchas posibili-dades a la hora de procesar archivos cambiar una palabra por otra eliminar ciertoscaracteres mover de sitio una liacutenea o una palabra borrar espacios o tabulaciones alfinal de las liacuteneas o cualquier otra cosa que se nos pueda ocurrirCuando se procesa un archivo de texto los pasos a seguir son los siguientes

1 Leer una liacutenea del fichero origen mientras quedan liacuteneas por leer2 Modificar la liacutenea (normalmente utilizando los meacutetodos que ofrece la clase String)3 Grabar la liacutenea modificada en el fichero destino4 Volver al paso 1

A continuacioacuten tienes algunos meacutetodos de la clase String que pueden resultar muyuacutetiles para procesar archivos de texto

bull charAt(int n) Devuelve el caraacutecter que estaacute en la posicioacuten n-eacutesima de la cadenaRecuerda que la primera posicioacuten es la nuacutemero 0

bull indexOf(String palabra) Devuelve un nuacutemero que indica la posicioacuten en la quecomienza una palabra determinada

bull length() Devuelve la longitud de la cadenabull replace(char c1 char c2) Devuelve una cadena en la que se han cambiado

todas las ocurrencias del caraacutecter c1 por el caraacutecter c2bull substring(int inicioint fin) Devuelve una subcadenabull toLowerCase() Convierte todas las letras en minuacutesculasbull toUpperCase() Convierte todas las letras en mayuacutesculas

Puedes consultar todos los meacutetodos de la clase String en la documentacioacuten oficial3A continuacioacuten tienes un ejemplo en el que se usan los meacutetodos descritos anterior-mente

Ejemplos de uso de String author Luis Joseacute Saacutenchez

public class EjemplosString

public static void main(String[] args)

Systemoutprintln(nEjemplo 1)

Systemoutprintln(En la posicioacuten 2 de berengena estaacute la letra

3httpdocsoraclecomjavase7docsapijavalangStringhtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 169

+ berengenacharAt(2))

Systemoutprintln(nEjemplo 2)

String frase = Hola caracola

char[] trozo = new char[10]trozo[0] = z trozo[1] = z trozo[2] = z

frasegetChars(2 7 trozo 1)

Systemoutprint(El array de caracteres vale )

Systemoutprintln(trozo)

Systemoutprintln(nEjemplo 3)

Systemoutprintln(La secuencia co aparece en la frase en la posicioacuten

+ fraseindexOf(co))

Systemoutprintln(nEjemplo 4)

Systemoutprintln(La palabra murcieacutelago tiene

+ murcieacutelagolength() + letras)

Systemoutprintln(nEjemplo 5)

String frase2 = frasereplace(o u)

Systemoutprintln(frase2)

Systemoutprintln(nEjemplo 6)

frase2 = frasesubstring(3 10)

Systemoutprintln(frase2)

Systemoutprintln(nEjemplo 7)

Systemoutprintln(frasetoLowerCase())

Systemoutprintln(nEjemplo 8)

Systemoutprintln(frasetoUpperCase())

A continuacioacuten se muestra un programa que procesa archivos de texto Lo que hacees cambiar cada tabulador por dos espacios en blanco Lo hice a propoacutesito cuandoestaba escribiendo este manual ya que el estaacutendar de Google para la codificacioacuten enJava4 especifica que la sangriacutea debe ser precisamente de dos espacios Teniacutea muchosprogramas escritos en Java (ejemplos y soluciones a ejercicios) que no cumpliacutean esterequisito porque la sangriacutea estaba aplicada con el caraacutecter de tabulacioacuten teniacutea dosposibilidades abrir todos y cada uno de los ficheros y cambiarlo a mano o escribir unprograma que lo hiciera Opteacute por la segunda opcioacuten y aquiacute tienes el programa iquestverdadque es muy sencillo

4httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 170

import javaioBufferedReaderimport javaioBufferedWriterimport javaioFileimport javaioFileReaderimport javaioFileWriterimport javaioIOException

Cambia los tabuladores por 2 espacios author Luis Joseacute Saacutenchez

public class EjemploProcesamiento10

public static void main(String[] args)

for (int i = 0 i lt argslength i++)

Systemoutprint(Procesando el archivo + args[i] + )

try

renombra el fichero antildeadiendo tmpFile ficheroOriginal = new File(args[i])

File ficheroTemporal = new File(args[i] + tmp)

ficheroOriginalrenameTo(ficheroTemporal)

lee los datos del archivo temporalBufferedReader bf = new BufferedReader(new FileReader(args[i] + tmp))

crea un fichero nuevo con el nombre originalBufferedWriter bw = new BufferedWriter(new FileWriter(args[i]))

String linea =

while ( linea = null )

linea = bfreadLine()

if (linea = null)

cambia el tabulador por 2 espacioslinea = lineareplace(t )

bwwrite(linea + n)

bfclose()

bwclose()

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 171

borra el fichero temporalficheroTemporaldelete()

catch (IOException ioe)

Systemoutprintln(Se ha producido un error de lecturaescritura)

Systemerrprintln(ioegetMessage())

Systemoutprintln(hecho)

118 Ejercicios

Ejercicio 1Escribe un programa que guarde en un fichero con nombre primosdat losnuacutemeros primos que hay entre 1 y 500

Ejercicio 2Realiza un programa que lea el fichero creado en el ejercicio anterior y quemuestre los nuacutemeros por pantalla

Ejercicio 3Escribe un programa que guarde en un fichero el contenido de otros dosficheros de tal forma que en el fichero resultante aparezcan las liacuteneas de losprimeros dos ficheros mezcladas es decir la primera liacutenea seraacute del primerfichero la segunda seraacute del segundo fichero la tercera seraacute la siguiente delprimer fichero etcLos nombres de los dos ficheros origen y el nombre del fichero destino se debenpasar como argumentos en la liacutenea de comandosHay que tener en cuenta que los ficheros de donde se van cogiendo las liacuteneaspueden tener tamantildeos diferentes

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 172

Ejercicio 4Realiza un programa que sea capaz de ordenar alfabeacuteticamente las palabrascontenidas en un fichero de texto El nombre del fichero que contiene laspalabras se debe pasar como argumento en la liacutenea de comandos El nombredel fichero resultado debe ser el mismo que el original antildeadiendo la coletillasort por ejemplo palabras_sorttxt Suponemos que cada palabra ocupa unaliacutenea

Ejercicio 5Escribe un programa capaz de quitar los comentarios de un programa de JavaSe utilizariacutea de la siguiente maneraquita_commentarios PROGRAMA_ORIGINAL PROGRAMA_LIMPIO

Por ejemploquita_comentarios holajava holav2java

crea un fichero con nombre holav2java que contiene el coacutedigo de holajava perosin los comentarios

Ejercicio 6Realiza un programa que diga cuaacutentas ocurrencias de una palabra hay en unfichero Tanto el nombre del fichero como la palabra se deben pasar comoargumentos en la liacutenea de comandos

12 Aplicaciones web en Java (JSP)Hasta el momento los programas realizados funcionan en una austera ventana determinal No se trata de algo casual hemos elegido esta manera de trabajar de formadeliberada para que el estudiante se centre en resolver el problema y no se distraigadaacutendole sombra a un botoacuten o escogiendo la mejor imagen de fondo para un listadoLlegamos no obstante a un punto en que algunos programas piden a gritos unaapariencia maacutes vistosaEn este capiacutetulo vamos a aprender coacutemo utilizar paacuteginas web como interfaz paraprogramas en Java Usaremos JSP (JavaServer Pages) que nos permitiraacute mezclar coacutedigoen Java con coacutedigo HTML El coacutedigo en Java que utilizaremos seraacute muy parecido alque hemos venido utilizando hasta ahora Cambiaraacute uacutenicamente lo relativo a mostrarinformacioacuten por pantalla (ahora se volcaraacute todo a HTML) y la manera en que seintroducen los datos que se realizaraacute mediante formularios

El lector deberaacute tener unos conocimientos baacutesicos de HTML para entender bieny sacar provecho de este capiacutetulo Una web excelente para aprender HTML esW3Schools1

El estaacutendar de programacioacuten de Google para el coacutedigo fuente escrito en Java2 noespecifica ninguna regla en cuanto a la manera de nombrar los ficheros correspon-dientes a las aplicaciones JSP Por tanto vamos a adoptar las convenciones de Oracle3

en esta materia Seguacuten estas convenciones los nombres de los ficheros JSP debenestar escritos en lowerCamelCase es decir la primera letra siempre es minuacutesculay en caso de utilizar varias palabras dentro del nombre eacutestas van seguidas unade otra empezando cada una por mayuacutescula Finalmente se antildeade la extensioacuten jspPor ejemplo listadoSociosjsp es un nombre correcto mientras que ListadoSociosjsplistado_sociosjsp o Listadosociosjsp son incorrectos

121 Hola Mundo en JSP

Para desarrollar aplicaciones en JSP utilizaremos el entorno de desarrollo NetbeansEste IDE se puede descargar de forma gratuita en httpsnetbeansorgdownloadsnota12_-14

Sigue estos pasos para crear una aplicacioacuten en JSP con Netbeans1httpw3schoolscom2httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml3httpwwworaclecomtechnetworkarticlesjavasecode-convention-138726html4ParamaacutesdetallessobrelainstalacioacutenyconfiguracioacutendeNetbeansverel[ApeacutendiceB](apendiceb)

173

Aplicaciones web en Java (JSP) 174

bull En el menuacute principal selecciona Archivo y a continuacioacuten Nuevo Proyecto Sepuede hacer maacutes raacutepido con la combinacioacuten Control + Mayuacutescula + N

bull Apareceraacute una ventana emergente para elegir el tipo de proyecto SeleccionaJava Web en el apartado ldquoCategoriacuteasrdquo y Aplicacioacuten Web en el apartadoldquoProyectosrdquo Haz clic en Siguiente

bull Ahora hay que darle el nombre al proyecto lo puedes llamar por ejemploSaludo1 Recuerda no utilizar caracteres especiales ni signos de puntuacioacuten Secrearaacute una carpeta con el mismo nombre que el proyecto que contendraacute todoslos ficheros necesarios Haz clic en Siguiente

bull En la siguiente ventana tendraacutes que elegir el servidor la versioacuten de Java y laruta Elige Glass Fish Server En caso de no haber ninguacuten servidor disponibleNetbeans permite antildeadir uno sobre la marcha (se lo descarga y lo instala) Hazclic en Finalizar

A la izquierda en la ventana de proyectos debe aparecer el que acabas de crearSaludo1 Navegando por la estructura del proyecto veraacutes que hay una carpeta connombre Web Pages en esta carpeta se deberaacuten guardar los archivos correspondien-tes a la aplicacioacuten archivos jsp html css imaacutegenes archivos de audio etc Para quelos archivos esteacuten ordenados se pueden organizar a su vez en subcarpetas dentrode Web PagesPor defecto cuando se crea un proyecto JSP se crea el archivo indexhtml Elimina estearchivo de tu proyecto y luego crea indexjsp haciendo clic con el botoacuten derecho enWeb Pages rarr Nuevo rarr JSP Al indicar el nombre no hay que poner la extensioacutenYa tienes un ldquoHola Mundordquo en ingleacutes Si lo quieres en espantildeol solo tienes que cambiarldquoHello Worldrdquo por ldquoHola Mundordquo con lo que la aplicacioacuten quedariacutea como sigue

lt-- saludo1jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Mundolth1gt

En esta paacutegina se usa uacutenicamente HTML

ltbodygt

lthtmlgt

Para ejecutar la aplicacioacuten hay que hacer clic en el botoacuten verde Ejecutar Proyecto opulsar F6 En ese momento Netbeans buscaraacute un fichero con el nombre indexjsp ylo lanzaraacute en el navegador

Aplicaciones web en Java (JSP) 175

Observa que el programa del ejemplo se llama saludo1jsp y no indexjsp En estecaso para ejecutar la aplicacioacuten hay que hacer clic con el botoacuten derecho encima desaludo1jsp y seleccionar EjecutarDe momento solo hemos visto coacutedigo HTML iquestdoacutende estaacute Java Bien vamos a verlopero antes hay entender bien coacutemo funciona JSPUna aplicacioacuten JSP consistiraacute en una o varias paacuteginas web que normalmente contendraacutecoacutedigo HTML y que llevaraacuten ldquoinsertadordquo coacutedigo en Java Este coacutedigo en Java puedecolocarse en cualquier parte del archivo y se delimita mediante las etiquetas lt y gtCuando se pulsa F6 para ejecutar la aplicacioacuten sucede lo siguiente

1 Todo el coacutedigo (tanto HTML como JAVA) se enviacutea al servidor (Glass Fish o ApacheTomcat por ejemplo)

2 El servidor deja intacto el coacutedigo HTML y compila y ejecuta el coacutedigo en JavaGeneralmente el coacutedigo Java genera coacutedigo HTML mediante las instruccionesoutprint y outprintln

3 Por uacuteltimo todo el coacutedigo (ya solo queda HTML) se enviacutea al navegador que es elque muestra la paacutegina Recuerda que el navegador no entiende Java (entiendeJavascript que es otro lenguaje diferente) y es imprescindible que todo el coacutedigoJava haya sido traducido previamente

122 Mezclando Java con HTML

A continuacioacuten se muestra un ejemplo que siacute tiene Java Como ves el coacutedigo Java estaacutedelimitado por los caracteres lt y gt

lt-- saludo2jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt outprintln(lth1gtiexclHola Mundolth1gt) gt

ltbodygt

lthtmlgt

Mediante Java se puede generar cualquier contenido HTML por ejemplo para modi-ficar estilos crear tablas mostrar imaacutegenes etc Trabajando en consola lo que seincluye en un print es exactamente lo que se muestra por pantalla Ahora con JSP loque se incluye dentro del print es ldquorenderizadordquo a posteriori por el navegador En elsiguiente ejemplo se puede ver claramente este comportamiento

Aplicaciones web en Java (JSP) 176

lt-- saludo3jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Caracolalth1gt

lt outprint(ltbgtltigt) gt

Esta liacutenea se ha puesto en negrita y cursiva mediante Java

lt outprint(ltigtltbgt) gt

ltbodygt

lthtmlgt

Es muy uacutetil ver el coacutedigo fuente que se ha generado una vez que se puede visualizarla aplicacioacuten en el navegador Para ver el coacutedigo fuente tanto en Firefox como enChrome hay que hacer clic con el botoacuten derecho en la paacutegina y seleccionar la opcioacutenldquoVer coacutedigo fuente de la paacuteginardquoCuando el contenido que se quiere volcar en HTML es el resultado de una expresioacutense pueden utilizar de forma opcional las etiquetas lt= y gt

lt-- saludo4jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Caracolalth1gt

lt= ltbgtltigt gt

Esta liacutenea se ha puesto en negrita y cursiva mediante Java

lt= ltigtltbgt gt

ltbodygt

lthtmlgt

En el coacutedigo Java que se inserta en las aplicaciones JSP se pueden utilizar todos loselemento del lenguaje vistos anteriormente bucles sentencias de control arraysdiccionarios etcEn el siguiente ejemplo se utiliza un bucle for para mostrar texto en diferentestamantildeos utilizando las etiquetas desde la lth6gt (cabecera pequentildea) hasta la lth1gt

(cabecera maacutes grande)

Aplicaciones web en Java (JSP) 177

lt-- pruebaVariable1 --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

for (int i = 1 i lt 7 i++)

outprintln(lth + (7-i) + gt+ i + lth + (7-i) + gt)

gt

ltbodygt

lthtmlgt

El coacutedigo en Java se puede insertar en cualquier parte dentro del coacutedigo HTML eincluso se pueden insertar varios trozos como se puede ver en el siguiente ejemploAunque una variable se haya definido en una determinada zona su aacutembito deactuacioacuten no se ve reducido a ese fragmento de coacutedigo sino que se puede utilizarposteriormente en otro lugar de la aplicacioacutenObserva que en el siguiente ejemplo la definicioacuten e inicializacioacuten de la variable x serealiza en un bloque de coacutedigo en Java y que luego esta variable se utiliza en otros dosbloques diferentes

lt-- pruebaVariable2 --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt int x = 3 gt

lthlt outprint(x) gtgtholalthlt outprint(x) gtgt

ltbodygt

lthtmlgt

En ocasiones puede ser uacutetil recabar informacioacuten del sistema versioacuten de Java en usosistema operativo nombre de usuario etc Estos datos se pueden obtener medianteSystemgetProperty(propiedad)

Aplicaciones web en Java (JSP) 178

lt-- muestraInfojsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtInformacioacuten del entorno de trabajolth1gt

lt

outprint(Fabricante de Java + SystemgetProperty(javavendor))

outprint(ltbrgtUrl del fabricante + SystemgetProperty(javavendorurl))

outprint(ltbrgtVersioacuten + SystemgetProperty(javaversion))

outprint(ltbrgtSistema operativo + SystemgetProperty(osname))

outprint(ltbrgtUsuario + SystemgetProperty(username))

gt

ltbodygt

lthtmlgt

Para mostrar informacioacuten en una paacutegina de forma ordenada es muy frecuente utilizartablas Las tablas son especialmente uacutetiles para mostrar listados obtenidos de unabase de datos como veremos en el siguiente capiacutetuloEn el siguiente ejemplo se muestra una tabla con dos columnas en la primera columnase muestran los nuacutemeros del 0 al 9 y en la segunda sus correspondientes cuadrados

lt-- tablajsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltbodygt

lth1gtEjemplo de tablalth1gt

lttable border=2gt

lttrgt

lttdgtNuacutemerolttdgtlttdgtCuadradolttdgt

lttrgt

lt

for(int i = 0 i lt 10 i++)

outprintln(lttrgt)

outprintln(lttdgt + i + lttdgt)

outprintln(lttdgt)

outprintln(i i)

outprintln(lttdgtlttrgt)

Aplicaciones web en Java (JSP) 179

gt

lttablegt

ltbodygt

lthtmlgt

123 Recogida de datos en JSP

En cualquier aplicacioacuten web la introduccioacuten de datos se realiza mediante formulariosAunque se puede hacer todo en la misma paacutegina de momento vamos a tener dos Laprimera paacutegina contendraacute un formulario y seraacute la encargada de recoger la informacioacuteny enviarla a una segunda paacutegina Esta uacuteltima paacutegina recibiraacute los datos realizaraacute unaserie de caacutelculos u operaciones si procede y por uacuteltimo mostraraacute un resultadoEn el primer ejemplo - un proyecto que llamaremos PasoDeCadena - tenemos una paacuteginacon nombre indexjsp que contiene un formulario HTML Este formulario contiene unaentrada de texto donde el usuario introduciraacute una cadena de caracteres Es muyimportante darle un valor a la etiqueta name En el caso que nos ocupa tenemosname=cadenaIntro por tanto el dato que recoge el formulario se llama de esa maneraseriacutea el equivalente al nombre de la variable en Java No menos importante es indicarla paacutegina que recibiraacute los datos que recoge el formulario Esta informacioacuten se indicacon la etiqueta action en nuestro ejemplo action=frasejsp indica que seraacute el ficherofrasejsp el que recibiraacute cadenaIntroEl fichero indexjsp uacutenicamente contiene coacutedigo HTML por tanto se podriacutea llamarindexhtml y la aplicacioacuten funcionariacutea exactamente igual

lt-- indexjsp (proyecto PasoDeCadena) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtPaso de cadenalttitlegt

ltheadgt

ltbodygt

lth1gtPasando una cadena de caractereslth1gt

ltform method=post action=frasejspgt

Introduzca el nombre de una fruta

ltinput type=text name=cadenaIntrogt

ltinput type=submit value=OKgt

ltformgt

ltbodygt

lthtmlgt

Para recoger los datos enviados por un formulario se utiliza requestgetParameter(nombreDeVariable)

donde nombreDeVariable es el dato que se enviacutea desde el formulario En caso de que el

Aplicaciones web en Java (JSP) 180

dato enviado sea un texto que pueda contener tildes o entildees hay que especificar lacodificacioacuten mediante requestsetCharacterEncoding(UTF-8) antes de recoger el dato

lt-- frasejsp (proyecto PasoDeCadena) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtPaso de cadenalttitlegt

ltheadgt

ltbodygt

lt requestsetCharacterEncoding(UTF-8) gt

Me gusta mucho comer

lt outprint(requestgetParameter(cadenaIntro))gt

ltbodygt

lthtmlgt

En el siguiente ejemplo llamado Incrementa5 se muestra coacutemo manipular en JSP un datonumeacuterico La aplicacioacuten recoge un nuacutemero y luego muestra ese nuacutemero incrementadoen 5 unidades

lt-- indexjsp (proyecto Incrementa5) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

ltform method=get action=incrementa5jspgt

Introduzca un nuacutemero (puede tener decimales)

ltinput type=text name=numeroIntrogt

ltinput type=submit value=OKgt

ltformgt

ltbodygt

lthtmlgt

Observa en el fichero incrementa5jsp coacutemo se transforma la cadena de caracteresque se recibe en numeroIntro en un dato numeacuterico con el meacutetodo DoubleparseDoubleexactamente igual que si estuvieacuteramos leyendo un nuacutemero desde teclado en laventana de terminal

Aplicaciones web en Java (JSP) 181

lt-- incrementa5jsp (proyecto Incrementa5) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

El nuacutemero introducido maacutes cinco es

lt

double resultado

resultado = DoubleparseDouble(requestgetParameter(numeroIntro)) + 5

outprint(resultado)

gt

ltbodygt

lthtmlgt

El siguiente ejemplo ilustra la recogida y enviacuteo de dos variables x e y Observa queahora el formulario contiene dos entradas de texto una para cada variable

lt-- indexjsp (proyecto Suma) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtSumalttitlegt

ltheadgt

ltbodygt

lth1gtSupercalculadoralth1gt

ltform method=get action=resultadojspgt

x ltinput type=text name=xgtltbrgt

y ltinput type=text name=ygtltbrgt

ltinput type=submitgt

ltformgt

ltbodygt

lthtmlgt

En el fichero resultadojsp se reciben las variables recogidas en indexjsp y se sumanRecuerda que por defecto la informacioacuten enviada por un formulario es una cadenade caracteres Si queremos sumar los valores introducidos debemos transformar lascadenas de caracteres a nuacutemeros enteros con el meacutetodo IntegervalueOf()

Aplicaciones web en Java (JSP) 182

lt-- resultadojsp (proyecto Suma) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtSumalttitlegt

ltheadgt

ltbodygt

La suma es

lt

int primerNumero = IntegervalueOf(requestgetParameter(x))

int segundoNumero = IntegervalueOf(requestgetParameter(y))

outprintln(primerNumero + segundoNumero)

gt

ltbodygt

lthtmlgt

El siguiente proyecto de ejemplo es Animales En la paacutegina principal (indexjsp) se puedeseleccionar un animal - gato o caracol - y un nuacutemero Una vez introducidos los datoseacutestos se enviacutean a animalesjsp

lt-- indexjsp (proyecto Animales) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtAnimaleslttitlegt

ltheadgt

ltbodygt

ltform method=post action=animalesjspgt

Seleccione animal a visualizar

ltselect name=animalgt

ltoptiongtGatoltoptiongt

ltoptiongtCaracolltoptiongt

ltselectgt

ltbrgt

Nuacutemero de animales ltinput type=text name=numero size=3gt

ltbrgt

ltinput type=submitgt

ltformgt

ltbodygt

lthtmlgt

Aplicaciones web en Java (JSP) 183

La paacutegina animalesjsp nos mostraraacute una imagen del animal elegido repetida el nuacutemerode veces que hemos indicado

lt-- animalesjsp (proyecto Animales) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtAnimaleslttitlegt

ltheadgt

ltbodygt

lt

String nombreAnimal = requestgetParameter(animal)

String nombreImagen

if (nombreAnimalequals(Gato))

nombreImagen = gatojpg

else

nombreImagen = caracoljpg

int veces = IntegerparseInt(requestgetParameter(numero))

for (int i = 0 i lt veces i++)

outprint(ltimg src= + nombreImagen + width=20gt)

gt

ltbodygt

lthtmlgt

124 POO en JSP

En las aplicaciones realizadas en JSP se puenden incluir clases definidas por el usuariopara posteriormente crear objetos de esas clases Lo habitual es que el fichero quecontiene la definicioacuten de la clase se encuentre separado del programa principalEn un nuevo proyecto con nombre GatosConClase vamos a crear la clase Gato paraello haz clic derecho sobre el icono del proyecto selecciona Nuevo y luego seleccionaClase de Java El nombre de la clase seraacute Gato y el nombre del paquete seraacute porejemplo daw1El fichero Gatojava quedariacutea como el que se muestra a continuacioacuten

Aplicaciones web en Java (JSP) 184

Gatojava (proyecto GatosConClase)

package daw1

public class Gato

private String nombre

private String imagen

public Gato(String nombre String imagen)

thisnombre = nombre

thisimagen = imagen

public String getNombre()

return nombre

public String getImagen()

return imagen

Override

public String toString()

return ltimg src= + imagen + width=80gtHola soy + nombre + ltbrgt

public String maulla()

return ltimg src= + imagen + width=80gtMiauuuuuuuultbrgt

public String come(String comida)

return ltimg src= + imagen + width=80gtEstoy comiendo + comida + ltbrgt

Hemos creado una clase Gato muy sencilla que uacutenicamente contiene dos atributosel nombre del gato y el nombre del fichero de su foto Como meacutetodos se hanimplementado toString() maulla() y come()

Aplicaciones web en Java (JSP) 185

lt-- indexjsp (proyecto GatosConClase) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltpage import=daw1Gatogt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtGatos con claselttitlegt

ltheadgt

ltbodygt

lth1gtGatos con claselth1gt

lthrgt

lt

Gato g1 = new Gato(Pepe gatojpg)

Gato g2 = new Gato(Garfield garfieldjpg)

Gato g3 = new Gato(Tom tompng)

outprintln(g1)

outprintln(g2)

outprintln(g3)

outprintln(g1maulla())

outprintln(g2come(sardinas))

gt

ltbodygt

lthtmlgt

El coacutedigo Java del programa principal es casi ideacutentico al que tendriacuteamos en unprograma para consolaEl siguiente ejemplo - GatosConClaseYBocadillos - es una mejora del anterior Seantildeaden estilos5 para mostrar lo que dicen los gatos igual que en un coacutemic

Gatojava (proyecto GatosConClaseYBocadillos)

package daw1

public class Gato

private String nombre

private String imagen

public Gato(String nombre String imagen)

thisnombre = nombre

thisimagen = imagen

5httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos12_JSPGatosConClaseYBocadillosestiloscss

Aplicaciones web en Java (JSP) 186

public String getNombre()

return nombre

public String getImagen()

return imagen

Override

public String toString()

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspHola soy + nombre + ampnbspltdivgtltdivgt

public String maulla()

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspMiauuuuuuuuampnbspltdivgtltdivgt

public String come(String comida)

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspEstoy comiendo + comida + ampnbspltdivgtltdivgt

El uacutenico antildeadido al programa principal es una liacutenea situada en la cabecera de la paacuteginaque carga la hoja de estilos estiloscss

lt-- indexjsp (proyecto GatosConClaseYBocadillos) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltpage import=daw1Gatogt

ltDOCTYPE htmlgtlthtmlgt

ltheadgtltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gtlttitlegtGatos con clase y bocadilloslttitlegt

ltlink rel=stylesheet type=textcss href=estiloscss gtltheadgtltbodygtlth1gtGatos con claselth1gtlthrgtlt

Gato g1 = new Gato(Pepe gatojpg)

Aplicaciones web en Java (JSP) 187

Gato g2 = new Gato(Garfield garfieldjpg)

Gato g3 = new Gato(Tom tompng)

outprintln(g1)

outprintln(g2)

outprintln(g3)

outprintln(g1maulla())

outprintln(g2come(sardinas))

gt

ltbodygtlthtmlgt

Aplicaciones web en Java (JSP) 188

125 Ejercicios

Ejercicio 1Crea una aplicacioacuten web en Java que muestre tu nombre y tus datos personalespor pantalla La paacutegina principal debe ser un archivo con la extensioacuten jspComprueba que se lanzan bien el servidor y el navegador web Observa losmensajes que da el servidor Fiacutejate en la direccioacuten que aparece en la barra dedirecciones del navegador

Ejercicio 2Mejora el programa anterior de tal forma que la apariencia de la paacuteginaweb que muestra el navegador luzca maacutes bonita mediante la utilizacioacuten deCSS (utiliza siempre ficheros independientes para CSS para no mezclarlo conHTML)

Ejercicio 3Escribe una aplicacioacuten que pida tu nombre A continuacioacuten mostraraacute ldquoHolardquoseguido del nombre introducido El nombre se deberaacute recoger mediante unformulario

Ejercicio 4Realiza una aplicacioacuten que calcule la media de tres notas

Ejercicio 5Realiza un conversor de euros a pesetas

Ejercicio 6Realiza un conversor de pesetas a euros

Ejercicio 7Combina las dos aplicaciones anteriores en una sola de tal forma que en lapaacutegina principal se pueda elegir pasar de euros a pesetas o de pesetas a eurosAdorna la paacutegina con alguna foto o dibujo

Aplicaciones web en Java (JSP) 189

Ejercicio 8Realiza una aplicacioacuten que pida un nuacutemero y que luego muestre la tabla demultiplicar de ese nuacutemero El resultado se debe mostrar en una tabla (lttablegten HTML)

Ejercicio 9Realiza una aplicacioacuten que pinte una piraacutemide La altura se pediraacute en unformulario La piraacutemide estaraacute hecha de bolitas ladrillos o cualquier otraimagen

Ejercicio 10Realiza un cuestionario con 10 preguntas tipo test sobre las asignaturasque se imparten en el curso Cada pregunta acertada sumaraacute un punto Elprograma mostraraacute al final la calificacioacuten obtenida Paacutesale el cuestionario a tuscompantildeeros y piacutedeles que lo hagan para ver queacute tal andan de conocimientosen las diferentes asignaturas del curso Utiliza radio buttons en las preguntasdel cuestionario

Ejercicio 11Escribe una aplicacioacuten que genere el calendario de un mes Se pediraacute elnombre del mes el antildeo el texto que queremos que aparezca sobre elcalendario el diacutea de la semana en que cae el diacutea 1 y el nuacutemero de diacuteas quetiene el mes

Ejercicio 12Mejora la aplicacioacuten anterior de tal forma que no haga falta introducir el diacuteade la semana en que cae el diacutea 1 y el nuacutemero de diacuteas que tiene el mes Elprograma debe deducir estos datos del mes y el antildeo Pista puedes usar laclase Calendar (javautilCalendar)

Ejercicio 13Transforma el test de infidelidad realizado anteriormente para consola en unaaplicacioacuten web

Aplicaciones web en Java (JSP) 190

Ejercicio 14Escribe un programa que muestre los n primeros teacuterminos de la serie deFibonacci El primer teacutermino de la serie de Fibonacci es 0 el segundo es 1y el resto se calcula sumando los dos anteriores por lo que tendriacuteamos quelos teacuterminos son 0 1 1 2 3 5 8 13 21 34 55 89 144hellip El nuacutemero n sedebe introducir por teclado

Ejercicio 15Realiza una aplicacioacuten que genere 100 nuacutemeros aleatorios del 1 al 200 Losprimos deberaacuten aparecer en un color diferente al resto

Ejercicio 16Realiza una aplicacioacuten que muestre la tirada aleatoria de tres dados de poacutekerUtiliza imaacutegenes de dados reales

Ejercicio 17Realiza un configurador del interior de un vehiacuteculo El usuario puede elegirmediante un formulario el color de la tapiceriacutea ndash blanco negro o berengena -y el material de las molduras ndash madera o carbono Se debe mostrar el interiordel coche tal y como lo quiere el usuario

Ejercicio 18Crea la aplicacioacuten ldquoEl Trilerdquo Deben aparecer tres cubiletes por pantalla y elusuario deberaacute seleccionar uno de ellos Para dicha seleccioacuten se puede usar unformulario con radio-button una lista desplegable hacer clic en el cubilete o loque resulte maacutes faacutecil Se levantaraacuten los tres cubiletes y se veraacute si estaba o nola bolita dentro del que el usuario indicoacute asiacute mismo se mostraraacute un mensajediciendo ldquoLo siento no has acertadordquo o ldquoiexclEnhorabuena has encontrado labolitardquo La probabilidad de encontrar la bolita es de 13

Ejercicio 19Crea el juego ldquoApuesta y ganardquo El usuario debe introducir inicialmente unacantidad de dinero A continuacioacuten apareceraacute por pantalla una imagen deforma aleatoria Si sale una calavera el usuario pierde todo su dinero y terminael juego Si sale medio limoacuten el usuario pierde la mitad del dinero y puedeseguir jugando con esa cantidad o puede dejar de jugar Si sale el gato chinode la suerte el usuario multiplica por dos su dinero y puede seguir jugandocon esa cantidad o puede dejar de jugar

Aplicaciones web en Java (JSP) 191

Ejercicio 20Crea una aplicacioacuten que dibuje un tablero de ajedrez mediante una tabla HTMLgenerada con bucles usando JSP y que situacutee dentro del tablero un alfil y uncaballo en posiciones aleatorias Las dos figuras no pueden estar colocadas enla misma casilla Las filas y las columnas del tablero deben estar etiquetadascorrectamente

13 Acceso a bases de datosEn el capiacutetulo 11 vimos coacutemo almacenar informacion en ficheros de texto de tal formaque esta informacioacuten no se pierde cuando el programa se cierra Normalmente losficheros de texto se usan en casos concretos como archivos de configuracioacuten o archivosde registro (log)Las bases de datos relacionales entran en juego cuando se necesita almacenar muchainformacioacuten y ademaacutes esta informacioacuten es homogeacutenea y se puede representarmediante tablas Por ejemplo una aplicacioacuten que permita gestionar la matriculacioacutende los alumnos de un centro educativo deberaacute ser capaz de almacenar los datos degran cantidad de alumnos (puede que miles) En este caso concreto cada alumno serepresenta mediante un registro que contiene determinados datos como el nuacutemerode expediente el nombre los apellidos la nota media etc A estos datos se les llamacamposEn este capiacutetulo vamos a ver coacutemo se puede acceder mediante Java a una basede datos relacional MySQL para hacer listados insertar nuevos elementos y borrarelementos existentesLos programas de ejemplo que se muestran en este capiacutetulo son aplicaciones JSPaprovechando lo visto en el capiacutetulo anterior aunque tambieacuten se puede acceder auna base de datos desde un programa en Java escrito para la consola

131 Socios de un club de baloncesto

Para ilustrar el acceso a una base de datos mediante Java vamos a utilizar comoejemplo un club de baloncesto Nuestro club necesita tener almacenada la informacioacutende todos los socios Sobre cada socio se necesita saber su nombre completo suestatura su edad y su localidad de residencia Cada socio tendraacute ademaacutes un nuacutemerode identificacioacuten uacutenico que seraacute el nuacutemero de socioNuestra aplicacioacuten consistiraacute en varias paacuteginas JSP que van a permitir ver un listadocon los datos de todos los socios dar de alta un nuevo miembro en el club y tambieacutenborrar o modificar los datos de un determinado socioSi todaviacutea no tienes instalado en tu equipo el gestor de bases de datosMySQL deberaacutesinstalarlo Tambieacuten es recomendable instalar PHPMyAdmin que es una aplicacioacuten quepermite crear y manejar bases de datos MySQL de una forma muy sencilla medianteuna interfaz web

192

Acceso a bases de datos 193

Instalacioacuten de MySQL

sudo apt-get install mysql-server

sudo apt-get install mysql-client

Para el usuario root de MySQL deberaacutes establecer la contrasentildea root para quete funcionen correctamente los ejemplos

Instalacioacuten de PHPMyAdmin

sudo apt-get install phpmyadmin

Para acceder a PHPMyAdmin debes escribir httplocalhostphpmyadmin en labarra de direcciones del navegador

Deberaacutes crear la base de datos MySQL a la que llamaraacutes baloncesto que contendraacuteuna tabla de nombre socio con los campos socioID nombre estatura edad y localidad yluego deberaacutes antildeadir los datos de los socios Todo esto lo tienes ya preparado en unfichero con nombre baloncestosql que estaacute en GitHub en la direccioacuten httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDbaloncestosql Descaacutergate este fichero lo utilizaremos en seguidaA continuacioacuten mostramos un fragmento del fichero baloncestosql para que veas coacutemose crea la base de datos la tabla socio y coacutemo se introducen los datos de muestra

---- Base de datos `baloncesto`--CREATE DATABASE IF NOT EXISTS `baloncesto` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

USE `baloncesto`

-- --------------------------------------------------------

---- Estructura de tabla para la tabla `socio`--

CREATE TABLE IF NOT EXISTS `socio` (

`socioID` int(11) NOT NULL`nombre` varchar(40) COLLATE utf8_spanish2_ci DEFAULT NULL`estatura` int(11) DEFAULT NULL`edad` int(11) DEFAULT NULL`localidad` varchar(30) COLLATE utf8_spanish2_ci DEFAULT NULLPRIMARY KEY (`socioID`)

Acceso a bases de datos 194

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci

---- Volcado de datos para la tabla `socio`--

INSERT INTO `socio` (`socioID` `nombre` `estatura` `edad` `localidad`) VALUES(1235 Bermuacutedez Espada Ana Mariacutea 186 46 Maacutelaga)

(1236 Cano Cuenca Margarita 161 48 Maacutelaga)

En dos sencillos pasos tendraacutes preparada y lista para usar la base de datos de ejemploPara acceder a PHPMyAdmin debes escribir httplocalhostphpmyadmin en la barrade direcciones de tu navegador A continuacioacuten teclea el nombre de usuario y lacontrasentildea Si has instalado MySQL como te hemos indicado tanto el nombre deusuario como la contrasentildea deberiacutean ser root

A continuacioacuten haz clic en la pestantildea Importar y seguidamente en el botoacuten Exami-nar Selecciona el fichero baloncestosql que descargaste antes

Acceso a bases de datos 195

Si has seguido correctamente los pasos ya tienes la base de datos lista para usardesde un programa escrito en Java

132 Preparacioacuten del proyecto de ejemplo

1321 Activar la conexioacuten a MySQL

Abre el entorno Netbeans y crea un nuevo proyecto del tipo Java Web - como vimosen el capiacutetulo 12 - y noacutembralo BaloncestoAhora es necesario activar el servicio de bases de datos Haz clic en la pestantildeaServicios (estaacute junto a la pestantildea Proyectos) Haz clic con el botoacuten derecho enBasesde datos y luego selecciona Nueva conexioacuten A continuacioacuten aparece una ventanapara seleccionar el driver debes seleccionar MySQL (ConnectorJdriver)

Acceso a bases de datos 196

Una vez se haya establecido el servicio veraacutes las bases de datos disponibles en unaestructura de aacuterbol Puedes ir desplegando hasta encontrar la base de datos baloncesto

y la tabla socio que contiene los campos socioID nombre estatura edad y localidad

Una vez activada la conexioacuten a MySQL no es necesario realizarla de nuevo para cada

Acceso a bases de datos 197

proyecto

1322 Incluir la libreriacutea MySQL JDBC

Cada proyecto de aplicacioacuten en Java que haga uso de una base de datos MySQLdeberaacute incluir la libreriacutea MySQL JDBC Para incluir esta libreriacutea despliega el proyectoBaloncesto haz clic con el botoacuten derecho en Libreriacuteas selecciona Antildeadir libreriacuteay por uacuteltimo selecciona MySQL JDBC Driver

133 Listado de socios

El primer ejemplo de acceso a una base de datos mediante Java que veremos seraacute unlistado Si echas un vistazo desde PHPMyAdmin a la tabla socio de la base de datosbaloncesto veraacutes que ya contiene informacioacuten sobre maacutes de 20 socios Nuestro primerejemplo seraacute una aplicacioacuten en Java que mueste todos esos datos en una paacuteginaweb Copia el archivo listadoSociosjsp1 a la carpeta principal del proyecto (donde estaacuteindexhtml) Para ejecutarlo haz clic con el botoacuten derecho y selecciona EjecutarA continuacioacuten tienes el coacutedigo JSP del listado de socios

1httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDBaloncestolistadoSociosjsp

Acceso a bases de datos 198

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtListado Socioslttitlegt

ltheadgt

ltbodygt

lth1gtListado de Socioslth1gt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balonce

storoot root)

Statement s = conexioncreateStatement()

ResultSet listado = sexecuteQuery (SELECT FROM socio)

while (listadonext())

outprintln(listadogetString(socioID) + + listadogetString(nombre) + ltbrgt

)

conexionclose()

gt

ltbodygt

lthtmlgt

Si todo ha salido bien al ejecutar el archivo - haciendo clic con el botoacuten derecho sobreel archivo y seleccionando Ejecutar - veraacutes por pantalla un listado como el siguientecon el nuacutemero y el nombre de cada socio

Acceso a bases de datos 199

Vamos a ldquodiseccionarrdquo el coacutedigo Las siguientes tres liacuteneas son obligatorias y deberaacutescopiarlas en todas las paacuteginas JSP que accedan a una base de datos Lo uacutenico quetendraacutes que cambiar es el nombre de la base de datos - la de nuestro ejemplo sellama baloncesto - seguacuten el caso

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306baloncesto

root root)

Statement s = conexioncreateStatement()

La siguiente liacutenea ejecuta la consulta

SELECT FROM socio

sobre la base de datos y guarda el resultado en el objeto listado Esta consulta extraetodos los datos () de la tabla socio Si quisieacuteramos obtener esos datos ordenados pornombre la consulta seriacutea

SELECT FROM socio ORDER BY nombre

Aquiacute estaacute la liacutenea en cuestioacuten

Acceso a bases de datos 200

ResultSet listado = sexecuteQuery (SELECT FROM socio)

Una vez extraiacutedos los datos en bruto hace falta ir sacando cada uno de los registroses decir cada una de las liacuteneas En cada liacutenea se van a mostrar los datos de un socioPara ello usamos un while que va extrayendo liacuteneas mientras quede alguna en el objetolistado

while (listadonext())

outprintln(listadogetString(socioID) + + listadogetString(nombre) + ltbrgt)

Observa que el meacutetodo getString toma como paraacutemetro el nombre de un campoEn este ejemplo estamos mostrando uacutenicamente los nuacutemeros de socio con suscorrespondientes nombres Si quisieacuteramos mostrar tambieacuten la altura de cada sociola podemos extraer mediante listadogetString(altura)

134 Alta

Para dar de alta un nuevo socio necesitamos recoger los datos mediante un formularioque puede ser un programa JSP o simplemente una paacutegina HTML Estos datos recogidospor el formulario seraacuten enviados a otra paacutegina encargada de grabarlos en la tabla socio

de la base de datos baloncesto mediante el comando INSERT de SQLA continuacioacuten se muestra el coacutedigo de formularioSociojsp que recoge los datos delnuevo socio Como puedes comprobar es un simple formulario HTML y no contienecoacutedigo en Java

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgtlthtmlgtltheadgtltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgtltbodygtlth2gtIntroduzca los datos del nuevo sociolth2gtltform method=get action=grabaSociojspgtNordm socio ltinput type=text name=numerogtltbrgtNombre ltinput type=text name=nombregtltbrgtEstatura ltinput type=text name=estaturagtltbrgtEdad ltinput type=text name=edadgtltbrgtLocalidad ltinput type=text name=localidadgtltbrgtltinput type=submit value=Aceptargt

ltformgtltbodygt

lthtmlgt

Acceso a bases de datos 201

El siguiente programa - grabaSociojsp - se encarga de tomar los datos que enviacuteaformularioSociojsp y grabarlos en la base de datosIgual que en los programas del capiacutetulo 12 incluimos esta liacutenea para poder recogercorrectamente cadenas de caracteres que contienen tildes la letra ntilde etc

requestsetCharacterEncoding(UTF-8)

La variable insercion es una cadena de caracteres en la que se va componiendo a basede ir juntando trozos la sentencia SQL correspondiente a la insercioacuten

String insercion = INSERT INTO socio VALUES (

+ IntegervalueOf(requestgetParameter(numero))

+ + requestgetParameter(nombre)

+ + IntegervalueOf(requestgetParameter(estatura))

+ + IntegervalueOf(requestgetParameter(edad))

+ + requestgetParameter(localidad) + )

Una vez que se han recogido los datos del formulario y se ha creado la cadena en lavariable insercion deberiacutea quedar algo como esto

INSERT INTO socio VALUES (6789 Brito Fino Alan 180 40 Benalmaacutedena)

Por uacuteltimo se ejecuta la sentencia de insercioacuten mediante sexecute(insercion)A continuacioacuten tienes el coacutedigo completo de grabaSociojsp

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

requestsetCharacterEncoding(UTF-8)

Acceso a bases de datos 202

String insercion = INSERT INTO socio VALUES (

+ IntegervalueOf(requestgetParameter(numero))

+ + requestgetParameter(nombre)

+ + IntegervalueOf(requestgetParameter(estatura))

+ + IntegervalueOf(requestgetParameter(edad))

+ + requestgetParameter(localidad) + )

sexecute(insercion)

conexionclose()

gt

Socio dado de alta

ltbodygt

lthtmlgt

Al componer una sentencia SQL concatenando trozos es frecuente que seproduzcan errores porque faltan o sobran comillas pareacutentesis comas etc Sise produce un error al ejecutar la sentencia la manera maacutes faacutecil de detectarloes mostrar por pantalla la sentencia Por ejemplo si la sentencia es unainsercioacuten de datos y la cadena de caracteres que la contiene se llama insercioncomo en el ejemplo que acabamos de ver simplemente tendriacuteamos queescribir outprintln(insercion)

135 Borrado

El borrado al igual que el alta se realiza en dos pasos En el primer paso se carga lapaacutegina pideNumeroSociojsp que muestra en una tabla todos los socios cada uno en unafila Junto a cada socio se coloca un botoacuten borrar que al ser pulsado enviacutea el nuacutemerode socio a la paacutegina borraSociojsp que se encarga de ejecutar la sentencia SQL deborradoLa tabla con los socios y los botones de borrado quedariacutea como se muestra acontinuacioacuten

Acceso a bases de datos 203

A continucacioacuten se muestra el coacutedigo de pideNumeroSociojsp El fichero estiloscss2 seencuentra disponible en GitHub igual que el resto de archivos

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltlink rel=stylesheet type=textcss href=estiloscss gt

ltheadgt

ltbodygt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

2httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDBaloncestoestiloscss

Acceso a bases de datos 204

ResultSet listado = sexecuteQuery (SELECT FROM socio)

gt

lttablegt

lttrgtltthgtCoacutedigoltthgtltthgtNombreltthgtltthgtEstaturaltthgtltthgtEdadltthgtltthgtLocalidadltthgtlt

trgt

lt

while (listadonext())

outprintln(lttrgtlttdgt)

outprintln(listadogetString(socioID) + lttdgt)

outprintln(lttdgt + listadogetString(nombre) + lttdgt)

outprintln(lttdgt + listadogetString(estatura) + lttdgt)

outprintln(lttdgt + listadogetString(edad) + lttdgt)

outprintln(lttdgt + listadogetString(localidad) + lttdgt)

gt

lttdgt

ltform method=get action=borraSociojspgt

ltinput type=hidden name=codigo value=lt=listadogetString(socioID) gtgt

ltinput type=submit value=borrargt

ltformgt

lttdgtlttrgt

lt

whileconexionclose()

gt

lttablegt

ltbodygt

lthtmlgt

A continuacioacuten se muestra el coacutedigo de borraSociojsp Como puedes comprobar lasentencia SQL que borra el registro deseado es un DELETE que toma como referencia elnuacutemero de socio para realizar el borrado

ltpage import=javasqlResultSetgt

ltpage import=javasqlStatementgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

Acceso a bases de datos 205

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

sexecute (DELETE FROM socio WHERE socioID= + requestgetParameter(codigo))

gt

ltscriptgtdocumentlocation = pideNumeroSociojspltscriptgt

ltbodygt

lthtmlgt

136 CRUD completo con Bootstrap

Los programas que ofrecen la posibilidad de hacer listados y de realizar modificacionesy borrado sobre los registros de una tabla se denominan CRUD que son las siglas eningleacutes de Create Read Update y Delete en espantildeol se diriacutea que es un programa dealta listado modificacioacuten y borrado El coacutedigo fuente completo estaacute disponible en lacarpeta BaloncestoMejorado de nuestro repositorio en GitHub3

Para dar de alta un nuevo socio simplemente habriacutea que rellenar los campos delformulario que aparecen en la primera liacutenea y hacer clic en el botoacuten Antildeadir Laaplicacioacuten comprueba si el nuacutemero de socio introducido ya existe en la base de datosy en tal caso muestra un mensaje de error recuerda que el nuacutemero de socio es uacutenico

3httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciostreemasterejemplos13_JSP_y_BBDDBaloncestoMejorado

Acceso a bases de datos 206

El borrado se lleva a cabo de la misma manera que en el ejemplo del apartado anteriorEl botoacuten Modificar nos lleva a otra paacutegina que contiene un formulario con todos losdatos del socio donde podemos modificar la informacioacuten necesaria A continuacioacuten semuestra una captura

Para los estilos - colores botones iconos etc - hemos utilizado Boostrap4 Boostrapes un framework que incluye unos estilos predefinidos para que con solo incluirloen nuestro proyecto la aplicacioacuten tenga una apariencia bonita y homogeacutenea Puedesencontrar maacutes informacioacuten de coacutemo utilizar este framework en la paacutegina oficial deBoostrap5

4httpgetbootstrapcom5httpgetbootstrapcom

Acceso a bases de datos 207

137 Ejercicios

Ejercicio 1Establece un control de acceso mediante nombre de usuario y contrasentildeapara alguno de los programas de la relacioacuten anterior (por ejemplo el quepinta una piraacutemide) Lo primero que apareceraacute por pantalla seraacute un formulariopidiendo el nombre de usuario y la contrasentildea Si el usuario y la contrasentildea soncorrectos se podraacute acceder al ejercicio en caso contrario volveraacute a aparecerel formulario pidiendo los datos de acceso y no se nos dejaraacute ejecutar laaplicacioacuten hasta que iniciemos sesioacuten con un nombre de usuario y contrasentildeacorrectos Los nombres de usuario y contrasentildeas deben estar almacenados enla tabla de una base de datos

Acceso a bases de datos 208

Ejercicio 2Mejora el programa anterior de tal forma que se puedan dar de alta nuevosusuarios para acceder a la aplicacioacuten Si se introduce un nombre de usuarioque no sea el administrador (admin) y una contrasentildea correcta la aplicacioacutenfuncionaraacute exactamente igual que el ejercicio anterior Si se introduce elusuario admin y la contrasentildea correcta la aplicacioacuten entra en la gestioacuten deusuarios donde se podraacuten dar de alta nuevos usuarios indicando nombre deusuario y contrasentildea No puede haber dos nombres de usuario iguales aunquesiacute puede haber claves repetidas

Acceso a bases de datos 209

Ejercicio 3Ampliacutea el programa anterior para que se pueda asignar o quitar permiso paraejecutar las aplicaciones de la relacioacuten anterior a los distintos usuarios Porejemplo que se pueda especificar que el usuario ldquojaimitordquo pueda ejecutar losejercicios 2 3 y 5 Para ello en la base de datos deberaacute existir una tabla con lasparejas (usuario nordm ejercicio) Por ejemplo si el usuario ldquojaimitordquo tiene accesoa los ejercicios 2 3 y 5 en la tabla correspondiente estaraacuten las parejas (jaimito2) (jaimito 3) y (jaimito 5) Lo ideal es que la asignacioacuten de permisos se hagamediante el marcado de muacuteltiples ldquocheckboxrdquo

Acceso a bases de datos 210

Ejercicio 4Crea una aplicacioacuten web que permita hacer listado alta baja y modificacioacutensobre la tabla cliente de la base de datos banco Un cliente tiene su identifica-dor nombre completo direccioacuten teleacutefono y fecha de nacimiento

Acceso a bases de datos 211

Ejercicio 5Ampliacutea el programa anterior para que se pueda hacer una buacutesqueda por nom-bre El programa buscaraacute la cadena introducida dentro del campo ldquonombrerdquoy si hay varias coincidencias se mostraraacute una lista de clientes para poderseleccionar uno de ellos y ver todos los datos Si solo hay una coincidencia semostraraacuten directamente los datos del cliente en cuestioacuten

Acceso a bases de datos 212

Ejercicio 6Crea una versioacuten web del programa GESTISIMAL (GESTIoacuten SIMplifcada deAlmaceacuten) para llevar el control de los artiacuteculos de un almaceacuten De cada artiacuteculose debe saber el coacutedigo la descripcioacuten el precio de compra el precio de ventay el stock (nuacutemero de unidades) La entrada y salida de mercanciacutea suponerespectivamente el incremento y decremento de stock de un determinadoartiacuteculo Hay que controlar que no se pueda sacar maacutes mercanciacutea de la que hayen el almaceacuten Aprovecha las opciones que puede ofrecer una interfaz webpor ejemplo para eliminar un artiacuteculo ya no seraacute necesario pedir el coacutedigo sinoque se puede mostrar un listado de todos los artiacuteculos de tal forma que sepuedan borrar un artiacuteculo directamente pulsando un botoacuten

213

Apeacutendice A Ejercicios de ampliacioacuten 214

Apeacutendice A Ejercicios de ampliacioacuten

Ejercicio 1 Transcomunicacioacuten instrumental mediante ficherosde texto digitalesSe conoce la transcomunicacioacuten instrumental (TCI) como la teacutecnica decomunicacioacuten que utiliza aparatos electroacutenicos para establecer comunicacioacutencon los espiacuteritus El caso de TCI maacutes conocido es el de la psicofoniacuteaPara realizar una psicofoniacutea se pone a grabar al aire un dispositivo en unlugar donde previamente hayan ocurrido fenoacutemenos extrantildeos o simplementese invoca la entidad que queremos que se comunique mediante el ritualadecuado Posteriormente se escucha la grabacioacuten para comprobar si se hagrabado algo un mensaje una palabra un grito un lamentohellipLos sonidos extrantildeos se graban gracias a lo que se llama en teacuterminosparapsicoloacutegicos una sentildeal portadora puede ser el chasquido de una ramauna racha de viento un golpe La entidad comunicante aprovecha ese sonidopara supuestamente moldearlo y convertirlo en un mensaje inteligible Muchasde las psicofoniacuteas se realizan utilizando como portadora el ruido que produceuna radio que no estaacute sintonizadaEl ejercicio que se propone es la realizacioacuten de un programa que permitarealizar la TCI mediante la creacioacuten y el posterior anaacutelisis de ficherosde textoEn primer lugar el programa deberaacute generar la portadora que seraacute un ficherode texto creado con caracteres producidos de forma aleatoria Se podraacutenespecificar varios paraacutemetros como el nuacutemero de liacuteneas o paacuteginas que sequieren generar si se incluyen letras uacutenicamente o bien letras y nuacutemerosfrecuencia aproximada de espacios saltos de liacutenea y signos de puntuacioacutenetc Se obtienen portadoras de calidad - con maacutes probabilidad de contenermensajes - cuando la proporcioacuten de las letras que contienen eacutestas coincidecon las del idioma espantildeolFrecuencia de aparicioacuten de letrashttpeswikipediaorgwikiFrecuencia_de_apariciC3B3n_de_letras

Una vez creado el fichero de texto el programa deberaacute ser capaz de analizarloal menos de una forma superficial de modo que nos resulte faacutecil encontrar losposibles mensajes Para realizar este anaacutelisis el programa iraacute comparandouna a una todas las palabras que aparecen en el texto con las que hay enel diccionario de espantildeol En caso de coincidencia la palabra o palabrasencontradas deben aparecer resaltadas con un color diferente al resto deltexto o bien en viacutedeo inverso Opcionalmente se pueden mostrar estadiacutesticascon el nuacutemero total de palabras encontradas distancia media entre esaspalabras palabras reales por cada mil palabras generadas etcEl alumno puede encontrar ficheros con las palabras que tiene el idiomaespantildeol en formato digital en la siguiente direccioacuten Se trata de una muestrahay otros muchos diccionarios disponibles en internethttplasrcsuclaedugeoffispell-dictionarieshtmlSpanish-dicts

Apeacutendice A Ejercicios de ampliacioacuten 215

Ejercicio 2 Coleccioacuten de discos ampliado (con canciones)Este ejercicio consiste en realizar una mejora del ejercicio del capiacutetulo 10que permite gestionar una coleccioacuten de discos Ahora cada disco contienecanciones Deberaacutes crear la clase Cancion con los atributos y meacutetodos queestimes oportunos Antildeade el atributo canciones a la clase Disco Este atributocanciones debe ser un array de objetos de la clase CancionFiacutejate bien que Cancion NO ES una subclase de Disco sino que ahora cadadisco puede tener muchas canciones que estaacuten almacenadas en el atributocancionesModifica convenientemente el meacutetodo toString para que al mostrarse los datosde un disco se muestre tambieacuten la informacioacuten sobre las canciones quecontieneLa aplicacioacuten debe permitir antildeadir borrar y modificar las canciones de losdiscos

Apeacutendice B Entorno de Desarrollo IntegradoNetbeansNetbeans es un IDE (Integrated Development Environment) es decir un Entornode Desarrollo Integrado Consta de un potente editor y de todas las herramientasnecesarias para codificar compilar depurar y ejecutar una aplicacioacutenEste IDE tiene algunas caracteriacutesticas que lo hacen muy atractivo para los programa-dores

bull Es el IDE oficial para desarrollar en Java6bull Chequea errores de sintaxis y da advertencias al mismo tiempo que se escribe el

coacutedigobull Tiene autocompletado inteligente de palabras clave clases meacutetodos paraacuteme-

troshellipbull Permite depurar una aplicacioacuten ejecutaacutendola paso a paso y ver el contendido de

todas las variables en tiempo realbull Soporta muchos lenguajes de programacioacuten ademaacutes de Java PHP Groovy HTML

XML Javascript JSPhellipbull Existe una gran variedad de plugins que ampliacutean las funcionalidades del entorno

Descarga e instalacioacuten

Netbeans se puede descargar de forma gratuita y para cualquier plataforma desdehttpsnetbeansorgdownloads

6Esto no es casualidad ya que es la misma empresa - Oracle - la que estaacute detraacutes del desarrollo de Java y tambieacuten la quesoporta Netbeans

216

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 217

Figura B1 Descarga de Netbeans

El programa de instalacioacuten de Netbeans estaacute disponible en varios paquetes seguacutenel lenguaje de programacioacuten y las tecnologiacuteas que se incluyen En el momento deescribir este libro los paquetes disponibles son Java SE Java EE HTML5JavaScriptPHP CC++ All Este uacuteltimo paquete (All) instala todos los lenguajes y tecnologiacuteasdisponibles para el IDE (sin contar los plugins) Para seguir este libro es suficientecon la versioacuten Java EE sin embargo animo al lector a descargar la versioacuten completa yexperimentar con otros lenguajes diferentes a Java por ejemplo con PHP7

Configuracioacuten

En los ejemplos y soluciones a los ejercicios de este libro nos centildeimos al los estaacuten-dares de programacioacuten de Google para el coacutedigo fuente escrito en el lenguaje deprogramacioacuten Java8 Por tanto despueacutes de la instalacioacuten de Netbeans es necesariorealizar algunso ajustes en la configuracioacuten del editor para cumplir con las siguientescondiciones

7httpsleanpubcomaprendephpconejercicios8httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 218

bull La tecla TAB debe insertar espacios no debe insertar el caraacutecter de tabulacioacutenbull La indentacioacuten debe ser de 2 caracteres (por defecto suele estar a 4)bull La condificacioacuten de caracteres debe ser UTF-8

Para ello selecciona Herramientas rarr Opciones rarr Editor A continuacioacuten seleccionala pestantildea Formato y en el menuacute desplegable correspondiente al lenguaje deprogramacioacuten selecciona Java La configuracioacuten deberiacutea quedar como se indica enla imagen

Figura B2 Configuracioacuten de Netbeans

Creacioacuten de un proyecto

Sigue los pasos que damos a continuacioacuten para crear un nuevo proyecto de Java enNetbeansEn primer lugar desde el menuacute principal selecciona Archivo y a continuacioacuten NuevoProyecto Se puede hacer maacutes raacutepido con la combinacioacuten Control + Mayuacutescula + NVeraacutes que aparece una ventana emergente para elegir el tipo de proyecto SeleccionaJava en el apartado ldquoCategoriacuteasrdquo y Aplicacioacuten Java en el apartado ldquoProyectosrdquo Hazclic en Siguiente

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 219

Figura B3 Nuevo proyecto en Java

Ahora es necesario darle el nombre al proyecto lo puedes llamar por ejemplo SaludoRecuerda no utilizar caracteres especiales ni signos de puntuacioacuten Se crearaacute unacarpeta con el mismo nombre que el proyecto que contendraacute todos los ficherosnecesarios Aseguacuterate de que la casilla Crear la clase principal estaacute marcada Hazclic en Terminar

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 220

Figura B4 Proyecto ldquoSaludordquo

Veraacutes que se ha creado el ldquoesqueletordquo de la aplicacioacuten La clase principal se llamaSaludo y contiene el main que seraacute el cuerpo principal del programa Observa que en laparte de la izquierda donde estaacuten todos los proyectos que se van realizando puedesver la estructura de carpetas y ficheros El coacutedigo fuente de nuestra aplicacioacuten estaacuteen el fichero Saludojava Escribe dentro del main la siguiente liacutenea

Systemoutprintln(iexclHola mundo)

Para guardar compilar y ejecutar basta con hacer clic en el botoacuten verde con el iconode Play o bien pulsar la tecla F6

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 221

Figura B5 Ejecucioacuten del proyecto

Si todo ha salido bien veraacutes el mensaje iexclHola mundo en la ventana de terminal integradade Netbeans que hay justo debajo del editor

Depuracioacuten

El entornoNetbeans permite la depuracioacuten paso a paso de un programa En ocasioneses complicado encontrar y corregir los fallos de una aplicacioacuten y ayuda mucho tenerla posibilidad de ir ejecutando un programa liacutenea a liacutenea y ver coacutemo van cambiandolas variablesPara ilustrar la depuracioacuten paso a paso vamos a utilizar un programa de ejemplo delCapiacutetulo 7 Arrays en concreto usaremos el coacutedigo de Array03javaCrea un nuevo proyecto de Java como se ha indicado en el apartado anterior y llaacutemaloArray03 A continuacioacuten copia el contenido del main del fichero Array03java en tuproyecto Ten cuidado de no borrar la liacutenea package array03Comenzaremos la ejecucioacuten paso a paso del programa pulsando de manera sucesivala tecla F7

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 222

Figura B6 Ejecucioacuten paso a paso

Observa coacutemo Netbeans resalta una liacutenea la ejecuta se detiene y espera quesigamos pulsando F7 En la parte de abajo ha aparecido una nueva ventana que resultatremendamente uacutetil Se trata de una zona donde puedes ver en tiempo real el valorque tiene cada variable (por supuesto se incluyen los arrays)Ve pulsando F7 hasta colocarte en la liacutenea siguiente

num[2] = 200

En la ventana inferior donde aparecen todos los datos despliega el array num veraacutesque los elementos 0 y 1 ya tienen los valores 8 y 33 respectivamente Si vuelves apulsar F7 veraacutes que ahora en la posicioacuten 2 se ha almacenado el 200Para salir del modo ldquopaso a pasordquo y terminar de ejecutar el programa pulsa F5Ademaacutes de la ejecucioacuten ldquopaso a pasordquo tambieacuten resultan muy uacutetiles los puntos deruptura o breakpoints Se trata de marcas a modo de sentildeales de STOP dondeindicamos pausas en la ejecucioacuten del programa La depuracioacuten de un programa devarios cientos o miles de liacuteneas puede ser muy tediosa si se ejecuta cada liacutenea paso a

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 223

paso con F7 Los breakpoints permiten parar la ejecucioacuten en liacuteneas concretas dondequeremos ver con maacutes detalle queacute estaacute sucediendo en nuestro programaVamos a colocar varios breakpoints en nuestro coacutedigo Haz clic sobre las liacuteneas 15 20y 24 (justo encima del nuacutemero de liacutenea) Observa que estas liacuteneas quedan marcadascon un pequentildeo cuadradito

Figura B7 Breakpoints

Pulsa la combinacioacuten de teclas Control + F5 Observa coacutemo el programa empiezaa ejecutarse con normalidad y se para justo en la liacutenea 15 donde estaacute el primerbreakpoint Pulsando ahora F5 el programa continuacutea ejecutaacutendose hasta que se paraen la liacutenea 20 donde estaacute el segundo breakpoint Otra pulsacioacuten de F5 hace quecontinuacutee la ejecucioacuten hasta la liacutenea 24 Una uacuteltima pulsacioacuten de esta tecla hace que elprograma continuacutee la ejecucioacuten hasta el final

Apeacutendice C Caracteres especialesLiacuteneas para tablas

Bloques

⊞ ⊟ ⊠ ⊡

Figuras de ajedrez

Ciacuterculos

oplus ⊖ otimes ⊘ ⊙ ⊛ ⊜ ⊝ ⴱ ⴲ ⵀ ⵁ ⵔ ⵕ ⵙ ⵚ

Flechas

larr uarr rarr darr harr ↚ ↛ ↠ ↣ ↦ ↮ crarr ⇎ ⇏ lArr uArr rArr dArr hArr ⇴ ⇵ ⇶ ⇷ ⇸ ⇹ ⇺ ⇻ ⇼ ⇽ ⇾ ⇿

Nuacutemeros en ciacuterculos

❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓

Dados

Fichas de dominoacute

127024 127025 127026 127027 127028 127029 127030 127031 127032 127033 127034 127035 127036 127037 127038 127039 127040 127041 127042 127043 127044 127045 127046 127047 127048 127049127050 127051 127052 127053 127054 127055 127056 127057 127058 127059 127060 127061 127062 127063 127064 127065 127066 127067 127068 127069 127070 127071 127072 127073 127074 127075127076 127077 127078 127079 127080 127081 127082 127083 127084 127085 127086 127087 127088 127089 127090 127091 127092 127093 127094 127095 127096 127097 127098 127099 127100 127101 127102 127103 127104 127105 127106 127107 127108 127109 127110 127111 127112 127113127114 127115 127116 127117 127118 127119 127120 127121 127122 127123

224

Apeacutendice C Caracteres especiales 225

Cartas

127136 127137 127138 127139 127140 127141 127142 127143 127144 127145 127146 127147 127148 127149 127150 127153 127154 127155 127156 127157 127158 127159 127160 127161 127162 127163 127164 127165 127166 127169 127170 127171127172 127173 127174 127175 127176 127177 127178 127179 127180 127181 127182 127183 127185 127186 127187 127188 127189 127190 127191 127192 127193 127194 127195 127196 127197 127198 127199

Caras

128045 128046 128049 128053 128512 128513 128514 128515 128516 128517 128518 128519 128520 128521 128522 128523 128524 128525 128526 128527 128528 128529 128530 128531 128532 128533 128534 128535 128536128537 128538 128539 128540 128541 128542 128543 128544 128545 128546 128547 128549 128550 128551 128552 128553 128554 128555 128557 128558 128559 128560 128561 128562 128563 128564 128565 128566 128567 128568 128569128570 128571 128572 128573 128574 128575 128576

Horoacutescopo

Miscelaacutenea

Ω ꙮ

  • Tabla de contenidos
  • Sobre este libro
  • Sobre el autor
  • Centros en los que se usa este libro
  • Introduccioacuten
  • Instalacioacuten y configuracioacuten del entorno de programacioacuten Java
  • iexclHola mundo - Salida de datos por pantalla
    • iexclHola mundo - Mi primer programa
    • Coloreado de texto
    • Ejercicios
      • Variables
        • Definicioacuten y tipos de variables
          • Enteros (int y long)
          • Nuacutemeros decimales (double y float)
          • Cadenas de caracteres (String)
            • Operadores artimeacuteticos
            • Asignacioacuten de valores a variables
            • Conversioacuten de tipos (casting)
            • Ejercicios
              • Lectura de datos desde teclado
                • Lectura de texto
                • Lectura de nuacutemeros
                • La clase Scanner
                • Ejercicios
                  • Sentencia condicional (if y switch)
                    • Sentencia if
                    • Operadores de comparacioacuten
                    • Operadores loacutegicos
                    • Sentencia switch (seleccioacuten muacuteltiple)
                    • Ejercicios
                      • Bucles
                        • Bucle for
                        • Bucle while
                        • Bucle do-while
                        • Ejercicios
                          • Nuacutemeros aleatorios
                            • Generacioacuten de nuacutemeros aleatorios con y sin decimales
                            • Generacioacuten de palabras de forma aleatoria de un conjunto dado
                            • Ejercicios
                              • Arrays
                                • Arrays de una dimensioacuten
                                • Arrays bidimensionales
                                • Recorrer arrays con for al estilo foreach
                                • Ejercicios
                                  • Arrays de una dimensioacuten
                                  • Arrays bidimensionales
                                      • Funciones
                                        • Implementando funciones para reutilizar coacutedigo
                                        • Comentarios de funciones
                                        • Creacioacuten de bibliotecas de rutinas mediante paquetes
                                        • Aacutembito de las variables
                                        • Paso de paraacutemetros por valor y por referencia
                                        • Ejercicios
                                          • Programacioacuten orientada a objetos
                                            • Clases y objetos
                                            • Encapsulamiento y ocultacioacuten
                                            • Meacutetodos
                                              • Creiacute haber visto un lindo gatito
                                              • Meacutetodos getter y setter
                                              • Meacutetodo toString
                                                • Aacutembitovisibilidad de los elementos de una clase - public protected y private
                                                • Herencia
                                                  • Sobrecarga de meacutetodos
                                                    • Atributos y meacutetodos de clase (static)
                                                    • Interfaces
                                                    • Arrays de objetos
                                                    • Ejercicios
                                                      • Conceptos de POO
                                                      • POO en Java
                                                      • Arrays de objetos
                                                          • Colecciones y diccionarios
                                                            • Colecciones la clase ArrayList
                                                              • Principales meacutetodos de ArrayList
                                                              • Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de sus elementos
                                                              • ArrayList de objetos
                                                              • Ordenacioacuten de un ArrayList
                                                                • Diccionarios la clase HashMap
                                                                  • Principales meacutetodos de HashMap
                                                                  • Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas
                                                                    • Ejercicios
                                                                      • Ficheros de texto y paso de paraacutemetros por liacutenea de comandos
                                                                        • Lectura de un fichero de texto
                                                                        • Escritura sobre un fichero de texto
                                                                        • Lectura y escritura combinadas
                                                                        • Otras operaciones sobre ficheros
                                                                        • Paso de argumentos por liacutenea de comandos
                                                                        • Combinacioacuten de ficheros y paso de argumentos
                                                                        • Procesamiento de archivos de texto
                                                                        • Ejercicios
                                                                          • Aplicaciones web en Java (JSP)
                                                                            • Hola Mundo en JSP
                                                                            • Mezclando Java con HTML
                                                                            • Recogida de datos en JSP
                                                                            • POO en JSP
                                                                            • Ejercicios
                                                                              • Acceso a bases de datos
                                                                                • Socios de un club de baloncesto
                                                                                • Preparacioacuten del proyecto de ejemplo
                                                                                  • Activar la conexioacuten a MySQL
                                                                                  • Incluir la libreriacutea MySQL JDBC
                                                                                    • Listado de socios
                                                                                    • Alta
                                                                                    • Borrado
                                                                                    • CRUD completo con Bootstrap
                                                                                    • Ejercicios
                                                                                      • Apeacutendice A Ejercicios de ampliacioacuten
                                                                                      • Apeacutendice B Entorno de Desarrollo Integrado Netbeans
                                                                                        • Descarga e instalacioacuten
                                                                                        • Configuracioacuten
                                                                                        • Creacioacuten de un proyecto
                                                                                        • Depuracioacuten
                                                                                          • Apeacutendice C Caracteres especiales
                                                                                            • Liacuteneas para tablas
                                                                                            • Bloques
                                                                                            • Figuras de ajedrez
                                                                                            • Ciacuterculos
                                                                                            • Flechas
                                                                                            • Nuacutemeros en ciacuterculos
                                                                                            • Dados
                                                                                            • Fichas de dominoacute
                                                                                            • Cartas
                                                                                            • Caras
                                                                                            • Horoacutescopo
                                                                                            • Miscelaacutenea
Page 6: Aprende Java con Ejercicios - DAM

Sobre este libroldquoAprende Java con Ejerciciosrdquo es un manual praacutectico para aprender a programar enJava desde ceroNo es necesario tener conocimientos previos de programacioacuten La dificultad del libroes gradual empieza con conceptos muy baacutesicos y ejercicios muy sencillos y vaaumentando en complejidad y dificultad a medida que avanzan los capiacutetulosLa praacutectica hace al maestro Como de verdad se aprende a programar es programandodesde el principio y esa es la filosofiacutea que sigue este libro En cada capiacutetulo se explicanuna serie de conceptos de programacioacuten y se ilustran con ejemplos Al final de cadauno de los capiacutetulos se plantean ejercicios de diferente dificultadEste libro contiene maacutes de 200 ejercicios Tanto las soluciones a los ejercicios como losejemplos estaacuten disponibles en GitHub httpsgithubcomLuisJoseSanchezaprende-java-con-ejercicios y tanto los unos como los otros siguen los estaacutendares de programacioacutende Google para el coacutedigo fuente escrito en el lenguaje de programacioacuten Java1ldquoAprende Java con Ejerciciosrdquo es un libro hecho casi a medida de la asignatura ldquoProgra-macioacutenrdquo que forma parte del curriacuteculo del primer curso de los ciclos formativos DAW(Desarrollo de Aplicaciones Web) y DAM (Desarrollo de Aplicaciones Multiplataforma)pero igualmente puede ser utilizado por estudiantes de Ingenieriacutea Informaacutetica Ingenie-riacutea de Telecomunicaciones o Ciencias Matemaacuteticas en la asignatura de ldquoProgramacioacutenrdquode los primeros cursosSi tienes alguna duda o quieres hacer alguacuten comentario en relacioacuten a este libro tienesa tu disposicioacuten el grupo de Google httpsgroupsgooglecomdforumaprende-java-con-ejercicios Cualquier sugerencia para mejorar este manual seraacute bienvenida

1httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

i

Sobre el autorLuis Joseacute Saacutenchez Gonzaacutelez es Ingeniero Teacutecnico en Informaacutetica de Gestioacuten por laUniversidad de Maacutelaga (Espantildea) y funcionario de carrera de la Junta de Andaluciacuteadesde 1998 En su trabajo de profesor de Informaacutetica combina sus dos pasiones laensentildeanza y la programacioacutenEn el momento de publicar este libro es profesor del IES Campanillas (Maacutelaga) eimparte clases en el Ciclo Superior de Desarrollo de Aplicaciones WebPuedes ponerte en contacto con el autor mediante la direccioacuten de correo electroacute-nico luisjoseprofegmailcom o mediante LinkedIn (httpseslinkedincompubluis-joseacute-saacutenchez86b0834)

ii

Centros en los que se usa este librobull IES Campanillas Maacutelaga (Espantildea)bull IES Poliacutegono Sur Sevilla (Espantildea)bull IES Murgi El Ejido - Almeriacutea (Espantildea)bull IES Punta del Verde Sevilla (Espantildea)

Si eres profesor y utilizas este libro para ensentildear Java piacutedele al autor que antildeada enesta seccioacuten el nombre de tu centro educativo o empresa escribiendo un correo a ladireccioacuten luisjoseprofegmailcom indicando la localidad y el paiacutes del centro

iii

IntroduccioacutenJava es un lenguaje de programacioacuten es de hecho desde hace maacutes de 10 antildeos ellenguaje de programacioacuten maacutes utilizado en el mundo seguacuten el iacutendice PYPL2(PopularitYof Programming Language index)Los ordenadores no entienden - por ahora - el espantildeol ni el ingleacutes ni ninguacuten otroidioma natural De una forma muy simplificada podriacuteamos decir que un lenguaje deprogramacioacuten es un idioma que entiende el ordenador3 Cualquier aplicacioacuten - proce-sador de textos navegador programa de retoque fotograacutefico etc - estaacute compuesta deuna serie de instrucciones convenientemente empaquetadas en ficheros que le dicenal ordenador de una manera muy precisa queacute tiene que hacer en cada momentoJava es un lenguaje de programacioacuten estructurado y como tal hace uso de variablessentencias condicionales bucles funcioneshellip Java es tambieacuten un lenguaje de progra-macioacuten orientado a objetos y por consiguiente permite definir clases con sus meacutetodoscorrespondientes y crear instancias de esas clases Java no es un lenguaje de marcascomo HTML o XML aunque puede interactuar muy bien con ellos4Las aplicaciones Java se suelen compilar a bytecode que es independiente del sistemaoperativo no a binario que siacute depende del sistema operativo De esta forma elbytecode generado al compilar un programa escrito en Java deberiacutea funcionar encualquier sistema operativo que tenga instalada una maacutequina virtual de java (JVM)Cualquier editor simple como Nano o GEdit es suficiente para escribir coacutedigo enJava aunque se recomiendan IDEs5 como NetBeans o Eclipse ya que tienen algunascaracteriacutesticas que facilitan mucho la programacioacuten como el chequeo de erroresmientras se escribe el autocompletado de nombres de variables y funciones y muchomaacutes

2httppyplgithubioPYPLhtml3En realidad un ordenador no entiende directamente los lenguajes de programacioacuten como Java C Ruby etc Mediante una

herramienta que se llama compilador o traductor seguacuten el caso lo que hay escrito en cualquiera de estos lenguajes se convierteen coacutedigo maacutequina - secuencias de unos y ceros - que es el uacutenico lenguaje que de verdad entiende el ordenador

4El lector deberaacute tener unos conocimientos baacutesicos de HTML para entender bien y sacar provecho del capiacutetulo relativo a JSPde este mismo libro Una web excelente para aprender HTML es httpw3schoolscom

5IDE Integrated Development Enviroment (Entorno de Desarrollo Integrado)

iv

Instalacioacuten y configuracioacuten del entorno deprogramacioacuten JavaTodos los ejemplos que contiene este libro asiacute como las soluciones a los ejerciciosse han escrito sobre Linux en concreto sobre Ubuntu (httpwwwubuntucom) Noobstante todo el coacutedigo deberiacutea compilar y funcionar sin ninguacuten problema en cualquierotra plataformaEl software necesario para seguir este manual es el siguiente6

OpenJDKEl Open Java Development Kit (OpenJDK) contiene una serie de componentesque permiten desarrollar y ejecutar aplicaciones escritas en Java Incluye la maacute-quina virtual de Java (JVM) que permite ejecutar bytecode Como mencionamosen el apartado Introduccioacuten el bytecode es el ejecutable en Java El OpenJDKtambieacuten incluye el compilador javac que permite compilar el coacutedigo fuente paragenerar el bytecode En Ubuntu basta ejecutar una liacutenea en la ventana determinal para instalar el OpenJDK

$ sudo apt-get install openjdk-8-jdk

Para los sitemas operativos Mac OS X y Windows se encuentran disponiblespara su descarga los archivos de instalacioacuten del OpenJDK en la paacutegina UnofficialOpenJDK installers for Windows Linux and Mac OS X7 Otra opcioacuten consiste enutilizar el JDK oficial de Oracle que se puede descargar en el apartado Java SEDevelopment Kit 8 - Downloads8 de la web de esta misma empresa No vamos aexplicar las diferencias entre el OpenJDK y el JDK ya que se escapa al aacutembitode este libro A efectos praacutecticos todos los ejemplos contenidos en este manualfuncionan tanto con en el OpenJDK como con el JDK y los ejercicios se puedenrealizar sin problema sea cual sea el kit de desarrollo instalado

Editor de textos simplePara seguir este manual recomendamos utilizar al principio un editor de textossencillo para probar los primeros programas y realizar los primeros ejercicioscompilando en liacutenea de comandos De esta manera el lector se va familiarizandocon el proceso de edicioacuten de coacutedigo compilacioacuten y ejecucioacuten y va entendiendo loque sucede en cada paso En Ubuntu viene instalado por defecto el editor GEditel sistema operativo Mac OS X viene con TextEdit y en Windows podemos usarel programa Bloc de notas

6En la paacutegina httphelloworldcollectionde se muestra el programa Hola mundo escrito en maacutes de 400 lenguajes deprogramacioacuten

7httpsgithubcomalexkaskoopenjdk-unofficial-builds8httpwwworaclecomtechnetworkjavajavasedownloadsjdk8-downloads-2133151html

v

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java vi

GeanyUna vez que el lector ha superado la barrera de escribir sus primeros programasrecomendamos utilizar el entorno de programacioacuten Geany (por ejemplo a partirdel capiacutetulo 2) Se trata de un IDE muy ligero que permite realizar aplicacionessencillas con rapidez Mediante Geany se puede escribir el coacutedigo chequearsi contiene errores compilar y ejecutar el bytecode generado Para programaspequentildeos - por ej calcular la media de varios nuacutemeros - es recomendable utilizarGeany en lugar de un IDE maacutes complejo como Netbeans Mientras con Geanyda tiempo a escribir el coacutedigo compilar y ejecutar Netbeans todaviacutea estariacuteaarrancandoInstalacioacuten de Geany (y los plugins adicionales) en Ubuntu

$ sudo apt-get install geany

$ sudo apt-get install geany-plugins

En la seccioacuten de descargas de la paacutegina oficial de Geany9 se encuentran losficheros de instalacioacuten de este programa tanto para Mac OS X como paraWindowsUna vez instalado Geany es conveniente realizar algunos ajustes en la configu-racioacuten Presiona Control + Alt + P para abrir la ventana de preferencias Hazclic en la pestantildea Editor y luego en la pestantildea Sangriacutea Establece las opcionestal y como se indican a continuacioacuten

9httpwwwgeanyorgDownloadReleases

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java vii

Figura 01 Configuracioacuten de Geany (sangriacutea)

Tambieacuten es recomendable marcar las casillas Mostrar guiacuteas de sangriacutea y Mostrarnuacutemeros de liacutenea Estas opciones se activan en la pestantildea Mostrar

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java viii

Figura 02 Configuracioacuten de Geany (guiacuteas de sangriacutea y nuacutemeros de liacutenea)

NetbeansCuando las aplicaciones a desarrollar son maacutes complejas y sobre todo cuandoeacutestas constan de varios ficheros se recomienda utilizar Netbeans de la empresaOracle En el capiacutetulo 9 el lector ya podriacutea sacarle mucho partido al uso de esteIDE Se trata de un entorno integrado muy potente y muy usado a nivel profesionalque incluye el autocompletado de sintaxis y permite una depuracioacuten avanzadapaso a paso Netbeans se puede descargar de forma gratuita y para cualquierplataforma desde httpsnetbeansorgdownloadsDespueacutes de la instalacioacuten de Netbeans procedemos a configurar el editorPara ello seleccionamos Herramientas rarr Opciones rarr Editor A continuacioacutenseleccionamos la pestantildea Formato y en el menuacute desplegable correspondiente allenguaje de programacioacuten seleccionamos Java La configuracioacuten deberiacutea quedarcomo se indica en la imagen

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java ix

Figura 03 Configuracioacuten de Netbeans

Es muy importante que los editoresIDEs que se utilicen para esribir coacutedigoen Java se configuren adecuadamente Hemos visto coacutemo configurar Geanyy Netbeans pero si el lector decide utilizar otras herramientas deberaacuteconfigurarlas igualmente En definitiva la configuracioacutenpreferencias de lasherramientas que se utilicen deben establecerse de tal forma que se cumplanestos requisitos

bull La tecla TAB debe insertar espacios no debe insertar el caraacutecter detabulacioacuten

bull La indentacioacuten debe ser de 2 caracteres (por defecto suele estar a 4)bull La condificacioacuten de caracteres debe ser UTF-8

1 iexclHola mundo - Salida de datos por pantalla

11 iexclHola mundo - Mi primer programa

El primer programa que aprende a hacer cualquier aspirante a programador es unHolamundo 1 Es seguramente el programa maacutes sencillo que se puede escribir Se trata deun programa muestra el mensaje ldquoHola mundordquo por pantalla Abre el programa GEditque como hemos comentado en la seccioacuten Instalacioacuten y configuracioacuten del entorno deprogramacioacuten Java viene instalado por defecto en Ubuntu y teclea el siguiente coacutedigo

Muestra por pantalla la frase iexclHola mundo author Luis J Saacutenchez

public class HolaMundo Clase principalpublic static void main(String[] args)

Systemoutprintln(iexclHola mundo)

Veraacutes que en principio el texto del coacutedigo no aparece en colores El coloreado desintaxis es muy uacutetil como comprobaraacutes maacutes adelante sobre todo para detectar erroresGraba el programa como HolaMundojava Al grabar con la extensioacuten java ahora elprograma GEdit siacute sabe que se trata de un programa escrito en Java y reconoce lasintaxis de este lenguaje de forma que puede colorear los distintos elementos queaparecen en el coacutedigo

1En la paacutegina httphelloworldcollectionde se muestra el programa Hola mundo escrito en maacutes de 400 lenguajes deprogramacioacuten

1

iexclHola mundo - Salida de datos por pantalla 2

Figura 11 Programa Hola mundo escrito en el editor GEdit

Fiacutejate que el nombre que le damos al fichero es exactamente igual que la clase principalseguido de la extensioacuten java Abre una ventana de terminal entra en el directoriodonde se encuentra el fichero y teclea lo siguiente

$ javac HolaMundojava

Este comando crea HolaMundoclass que es el bytecode Para ejecutar el programateclea

$ java HolaMundo

iexclEnhorabuena Acabas de realizar tu primer programa en JavaEn la siguiente captura de pantalla puedes ver la ventana de terminal y los comandosque acabamos de describir

iexclHola mundo - Salida de datos por pantalla 3

Figura 12 HolaMundoclass es el bytecode generado (1) El resultado del programa es una liacutenea de textoescrita en pantalla (2)

La instruccioacuten que hemos utilizado para mostrar una frase por pantalla es Sys-

temoutprintln() colocando la frase entre pareacutentesis Tambieacuten se puede volcar textopor pantalla mediante Systemoutprint() La uacutenica diferencia radica en que esta uacuteltimano antildeade un salto de liacutenea al final prueacutebalo en HolaMundojava y comprueacutebalo por timismo Si lo que quieres mostrar es una palabra o una frase como en este ejemploes importante que el texto esteacute entrecomillado

bull El programa propiamente dicho estaacute dentro de lo que llamamos ldquoclaseprincipalrdquo

bull El fichero debe tener el mismo nombre que la clase principal seguido porla extensioacuten java

bull Los comentarios de varias liacuteneas se colocan entre y

bull Los comentarios de liacutenea se indican mediante

bull Para mostrar informacioacuten por pantalla se utilizan Systemoutprintln() ySystemoutprint()

iexclHola mundo - Salida de datos por pantalla 4

12 Coloreado de texto

Mostrar siempre texto blanco sobre fondo negro puede resultar muy aburrido El textoque se muestra por pantalla se puede colorear para ello es necesario insertar unassecuencias de caracteres - que indican el color con el que se quiere escribir - justoantes del propio textoPrueba el siguiente programa y no te preocupes si todaviacutea no lo entiendes del todoen el proacuteximo capiacutetulo se explican los diferentes tipos de datos que se pueden utilizaren Java entre estos tipos estaacute la cadena de caracteres o String

Coloreado de texto Muestra varias palabras en el color que corresponde author Luis Joseacute Saacutenchez

public class Colores

public static void main(String[] args)

String rojo = 033[31m

String verde = 033[32m

String naranja = 033[33m

String azul = 033[34m

String morado = 033[35m

String blanco = 033[37m

Systemoutprint(naranja + mandarina + verde + hierba)

Systemoutprint(naranja + saltamontes + rojo + tomate)

Systemoutprint(blanco + saacutebanas + azul + cielo)

Systemoutprint(morado + nazareno + azul + mar)

Como puedes ver en los dos ejemplos que hemos mostrado algunas liacuteneas estaacutenligeramente desplazadas hacia la derecha es lo que se llama sangriacutea o indentacioacutenEn programacioacuten es muy importante sangrar (indentar) bien porque da una idea de queacutepartes del coacutedigo son las que contienen a otras En este uacuteltimo ejemplo tenemos unprograma que tiene unos comentarios al principio y luego la clase principal marcadapor la liacutenea public class Colores Dentro de la clase Colores estaacute el main o bloque delprograma principal que tiene sangriacutea por estar dentro de la definicioacuten de la claseColores A su vez dentro del main hay una serie de liacuteneas de coacutedigo que igualmentetienen sangriacutea

iexclHola mundo - Salida de datos por pantalla 5

En este libro tanto el coacutedigo de los ejemplos como el de las soluciones a losejercicios siguen el estaacutendar de Google para el coacutedigo fuente escrito en el lenguaje deprogramacioacuten Java2 por tanto cada vez que se aplique la sangriacutea seraacute exactamentede dos espacios

2httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

iexclHola mundo - Salida de datos por pantalla 6

13 Ejercicios

Ejercicio 1Escribe una programa que muestre tu nombre por pantalla

Ejercicio 2Modifica el programa anterior para que ademaacutes se muestre tu direccioacuten ytu nuacutemero de teleacutefono Aseguacuterate de que los datos se muestran en liacuteneasseparadas

Ejercicio 3Escribe un programa que muestre por pantalla 10 palabras en ingleacutes juntoa su correspondiente traduccioacuten al castellano Las palabras deben estardistribuidas en dos columnas y alineadas a la izquierda Pista Se puedeinsertar un tabulador mediante t

Ejercicio 4Escribe un programa que muestre tu horario de clase Puedes usar espacios otabuladores para alinear el texto

Ejercicio 5Modifica el programa anterior antildeadiendo colores Puedes mostrar cada asig-natura de un color diferente

Ejercicio 6Escribe un programa que pinte por pantalla una piraacutemide rellena a base deasteriscos La base de la piraacutemide debe estar formada por 9 asteriscos

Ejercicio 7Igual que el programa anterior pero esta vez la piraacutemide estaraacute hueca (sedebe ver uacutenicamente el contorno hecho con asteriscos)

iexclHola mundo - Salida de datos por pantalla 7

Ejercicio 8Igual que el programa anterior pero esta vez la piraacutemide debe aparecerinvertida con el veacutertice hacia abajo

Ejercicio 9Escribe un programa que pinte por pantalla alguna escena - el campo lahabitacioacuten de una casa un aula etc - o alguacuten objeto animado o inanimado- un coche un gato una taza de cafeacute etc Ten en cuenta que puedes utilizarcaracteres como + lt etc iexclEacutechale imaginacioacuten

2 Variables

21 Definicioacuten y tipos de variables

Una variable es un contenedor de informacioacuten Imagina una variable como una cajitacon una etiqueta que indica su nombre una cajita en la que se puede introducir un va-lor Las variables pueden almacenar valores enteros nuacutemeros decimales caracterescadenas de caracteres (palabras o frases) etc El contenido de las variables puedecambiar durante la ejecucioacuten del programa de ahiacute viene el nombre de ldquovariablerdquoJava es un lenguaje fuertemente tipado es decir es necesario declarar todas lasvariables que utilizaraacute el programa indicando siempre el nombre y el tipo de cadaunaEl nombre que se le da a una variable es muy importante intenta usar siemprenombres significativos que de alguna forma identifiquen el contenido Por ejemplosi usas una variable para almacenar el volumen de una figura una buena opcioacuten seriacuteallamarla volumen si tienes una variable que almacena la edad de una persona lo mejores llamarla edad y asiacute sucesivamenteUn programa se lee y se depura mucho mejor si los nombres de las variables se hanelegido de forma inteligenteiquestPodriacuteas averiguar queacute hace la siguiente liacutenea de coacutedigo

x = vIp3 Weerty - zxc

Ahora observa el mismo coacutedigo pero con otros nombres de variables

precioTotal = cantidad precio - descuento

Se entiende mucho mejor iquestverdadEscribiremos los nombres de variables en formato lowerCamelCase La primera letrase escribe en minuacutescula y a continuacioacuten si se utiliza maacutes de una palabra cada unade ellas empezariacutea con mayuacutescula Por ejemplo edadMin es un buen nombre para unavariable que almacena la edad miacutenima a la que se puede acceder a un sitio webObserva que hemos usado una mayuacutescula para diferenciar dos partes (edad y Min)Puede que en alguacuten libro tambieacuten encuentres nombres de variables con el caraacutecterde subrayado ( _ ) de tal forma que el nombre de la variable seriacutea edad_min pero comohemos comentado anteriormente en este libro nos centildeimos al estaacutendar de Google1que exige el formato lowerCamelCase

1httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

8

Variables 9

No se permiten siacutembolos como $ + - etc Puedes usar nuacutemeros en los nombresde variables pero nunca justo al principio 5x no es un nombre vaacutelido pero x5 siacute lo esNo se debe poner una letra mayuacutescula al comienzo del nombre de una variable parano confundirla con una clase (los nombres de las clases comienzan por mayuacutescula)

211 Enteros (int y long)

Las variables que van a contener nuacutemeros enteros se declaran con int Veamos unejemplo

Uso de variables enteras author Luis J Saacutenchez

public class VariablesEnteras

public static void main(String[] args)

int x Se declara la variable x como entera

x = 5 Se asigna el valor 5 a la variable xSystemoutprintln(El valor actual de mi variable es + x)

x = 7 Se asigna el valor 7 a la variable xSystemoutprintln(y ahora es + x)

Si pretendemos almacenar valores muy grandes en una variable usaremos el tipo long

en lugar de int

212 Nuacutemeros decimales (double y float)

Usamos los tipos double o float cuando queremos (o esperamos) almacenar nuacutemeroscon decimales en las variablesCintildeeacutendonos al estaacutendar de Google no daremos por vaacutelidas definiciones de variablescomo la siguiente (aunque funcionariacutea sin ninguacuten problema)

double x y

Cada variable se debe definir en una liacutenea diferente Lo siguiente siacute seriacutea correcto

Variables 10

double x

double y

A continuacioacuten tienes un ejemplo completo

Uso de variables que contienen nuacutemeros decimales author Luis J Saacutenchez

public class VariablesConDecimales

public static void main(String[] args)

double x Se declaran las variables x e ydouble y de tal forma que puedan almacenar decimales

x = 7

y = 2501

Systemoutprintln( x vale + x)

Systemoutprintln( y vale + y)

Como puedes ver tambieacuten se pueden almacenar nuacutemeros enteros en variables de tipodouble

213 Cadenas de caracteres (String)

Las cadenas de caracteres se utilizan para almacenar palabras y frases Todas lascadenas de caracteres deben ir entrecomilladas

Uso del tipo String author Luis J Saacutenchez

public class UsoDeStrings

public static void main(String[] args)

String miPalabra = cerveza

String miFrase = iquestdoacutende estaacute mi cerveza

Systemoutprintln(Una palabra que uso con frecuencia + miPalabra)

Variables 11

Systemoutprintln(Una frase que uso a veces + miFrase)

Como puedes ver en una cadena de caracteres se pueden almacenar signos depuntuacioacuten espacios y letras con tildes

Variables 12

22 Operadores artimeacuteticos

En Java se puede operar con las variables de una forma muy parecida a como se haceen matemaacuteticas Los operadores aritmeacuteticos de Java son los siguientes

OPERADOR NOMBRE EJEMPLO DESCRIPCIOacuteN+ suma 20 + x suma dos nuacutemeros- resta a - b resta dos nuacutemeros multiplicacioacuten 10 7 multiplica dos nuacutemeros divisioacuten altura 2 divide dos nuacutemeros resto (moacutedulo) 5 2 resto de la divisioacuten entera

++ incremento a++ incrementa en 1 elvalor de la variable

- - decremento a- - decrementa en 1 elvalor de la variable

A continuacioacuten tienes un programa que ilustra el uso de los operadores aritmeacuteticos

Uso de los operadores aritmeacuteticos author Luis J Saacutenchez

public class UsoDeOperadoresAritmeticos

public static void main(String[] args)

int x

x = 100

Systemoutprintln(x + + (x + 5) + + (x - 5))

Systemoutprintln((x 5) + + (x 5) + + (x 5))

23 Asignacioacuten de valores a variables

La sentencia de asignacioacuten se utiliza para dar un valor a una variable En Java (y enla mayoriacutea de lenguajes de programacioacuten) se utiliza el siacutembolo igual ( = ) para estecometido Es importante recalcar que una asignacioacuten no es una ecuacioacuten Por ejemplox = 7 + 1 es una asignacioacuten en la cual se evaluacutea la parte derecha 7 + 1 y el resultadode esa evaluacioacuten se almacena en la variable que se coloque a la izquierda del iguales decir en la x o lo que es lo mismo el nuacutemero 8 se almacena en x La sentenciax + 1 = 23 2 no es una asignacioacuten vaacutelida ya que en el lado izquierdo debemos teneruacutenicamente un nombre de variableVeamos un ejemplo con algunas operaciones y asignaciones

Variables 13

Operaciones y asignaciones author Luis J Saacutenchez

public class Asignaciones

public static void main(String[] args)

int x = 2

int y = 9

int sum = x + y

Systemoutprintln(La suma de mis variables es + sum)

int mul = x y

Systemoutprintln(La multiplicacioacuten de mis variables es + mul)

24 Conversioacuten de tipos (casting)

En ocasiones es necesario convertir una variable (o una expresioacuten en general) de untipo a otro Simplemente hay que escribir entre pareacutentesis el tipo que se quiere obtenerExperimenta con el siguiente programa y observa los diferentes resultados que seobtienen

Conversioacuten de tipos author Luis J Saacutenchez

public class ConversionDeTipos

public static void main(String[] args)

int x = 2

int y = 9

double division

division = (double)y (double)xdivision = y x Comenta esta liacutenea y

observa la diferencia

Variables 14

Systemoutprintln(El resultado de la divisioacuten es + division)

Variables 15

25 Ejercicios

Ejercicio 1Escribe un programa en el que se declaren las variables enteras x e y Asignaleslos valores 144 y 999 respectivamente A continuacioacuten muestra por pantallael valor de cada variable la suma la resta la divisioacuten y la multiplicacioacuten

Ejercicio 2Crea la variable nombre y asiacutegnale tu nombre completo Muestra su valor porpantalla de tal forma que el resultado del programa sea el mismo que en elejercicio 1 del capiacutetulo 1

Ejercicio 3Crea las variables nombre direccion y telefono y asiacutegnale los valores corres-pondientes Muestra los valores de esas variables por pantalla de tal formaque el resultado del programa sea el mismo que en el ejercicio 2

Ejercicio 4Realiza un conversor de euros a pesetas La cantidad en euros que se quiereconvertir deberaacute estar almacenada en una variable

Ejercicio 5Realiza un conversor de pesetas a euros La cantidad en pesetas que se quiereconvertir deberaacute estar almacenada en una variable

Ejercicio 6Escribe un programa que calcule el total de una factura a partir de la baseimponible (precio sin IVA) La base imponible estaraacute almacenada en unavariable

3 Lectura de datos desde tecladoHemos visto en los capiacutetulos anteriores coacutemo mostrar informacioacuten por pantalla ycoacutemo usar variables Veremos ahora algo muy importante que te permitiraacute realizarprogramas algo maacutes funcionales que tengan una utilidad real aprenderaacutes a leer lainformacioacuten que introduce un usuario mediante el tecladoEl funcionamiento de casi todos los programas se podriacutea resumir en los siguientespuntos

1 Entrada de datos desde teclado (o desde cualquier otro dispositivo de entrada)2 Procesamiento de los datos de entrada para producir un resultado3 Visualizacioacuten de los resultados por pantalla

De momento hemos visto coacutemo realizar los puntos 2 y 3 Vamos a ver a continuacioacutencoacutemo se recoge la informacioacuten desde el teclado

31 Lectura de texto

Para recoger datos por teclado usamos Systemconsole()readLine() Cuando llegamos aesta sentencia el programa se detiene y espera que el usuario introduzca informacioacutenmediante el teclado La introduccioacuten de datos termina con la pulsacioacuten de la teclaINTRO Una vez que el usuario presiona INTRO todo lo que se ha tecleado se almacenaen una variable en el siguiente ejemplo esa variable es nombre

Lectura de datos desde teclado author Luis J Sanchez

public class DimeTuNombre

public static void main(String[] args)

String nombre

Systemoutprint(Por favor dime coacutemo te llamas )

nombre = Systemconsole()readLine()

Systemoutprintln(Hola + nombre + iexclencantado de conocerte)

16

Lectura de datos desde teclado 17

Mediante Systemconsole()readLine() se recoge una liacutenea de texto introducidapor teclado

Cuando se piden datos por teclado es importante que el programa especifiqueclaramente cuaacutel es exactamente la informacioacuten que requiere por parte del usuarioDate cuenta que este programa muestra el mensaje ldquoPor favor dime coacutemo te llamasrdquoImagina que se omite este mensaje en la pantalla apareceriacutea uacutenicamente un cursorparpadeando y el usuario no sabriacutea queacute tiene que hacer o queacute dato introducirTambieacuten es importante resentildear que los datos introducidos por teclado se recogen comouna cadena de caracteres (un String)

32 Lectura de nuacutemeros

Si en lugar de texto necesitamos datos numeacutericos deberemos convertir la cadenaintroducida en un nuacutemero con el meacutetodo adecuado Como se muestra en el ejemploIntegerparseInt() convierte el texto introducido por teclado en un dato numeacutericoconcretamente en un nuacutemero entero

Lectura de datos desde teclado author Luis J Saacutenchez

public class LeeNumeros

public static void main(String[] args)

String linea

Systemoutprint(Por favor introduce un nuacutemero )

linea = Systemconsole()readLine()

int primerNumero

primerNumero = IntegerparseInt( linea )

Systemoutprint(introduce otro por favor )

linea = Systemconsole()readLine()

int segundoNumero

segundoNumero = IntegerparseInt( linea )

int total

total = (2 primerNumero) + segundoNumero

Systemoutprint(El primer nuacutemero introducido es + primerNumero)

Lectura de datos desde teclado 18

Systemoutprintln( y el segundo es + segundoNumero)

Systemoutprint(El doble del primer nuacutemero maacutes el segundo es )

Systemoutprint(total)

Este uacuteltimo programa se podriacutea acortar un poco Por ejemplo estas dos liacuteneas

int total

total = (2 primerNumero) + segundoNumero

se podriacutean quedar en una sola liacutenea

int total = (2 primerNumero) + segundoNumero

De igual modo estas tres liacuteneas

linea = Systemconsole()readLine()

int primerNumero

primerNumero = IntegerparseInt( linea )

tambieacuten se podriacutean reducir a una sola tal que asiacute

int primerNumero = IntegerparseInt( Systemconsole()readLine() )

Es muy importante que el coacutedigo de nuestros programas sea limpio y legible A vecesabreviando demasiado el coacutedigo se hace maacutes difiacutecil de leer es preferible tener unasliacuteneas de maacutes y que el coacutedigo se entienda bien a tener un coacutedigo muy compacto peromenos legible

33 La clase Scanner

El meacutetodo Systemconsole()readLine() funciona bien en modo consola (en una ventana determinal) pero puede provocar problemas cuando se trabaja con IDEs como EclipseNetbeans JavaEdit etc Para evitar estos problemas puedes usar la clase Scanner

cuando necesites recoger datos desde teclado La clase Scanner funciona tanto enentornos integrados como en una ventana de terminal

Lectura de datos desde teclado 19

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScanner01

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tu nombre )

String nombre = snextLine()

Systemoutprint(Introduce tu edad )

int edad = IntegerparseInt(snextLine())

Systemoutprintln(Tu nombre es + nombre + y tu edad es + edad)

Fiacutejate que en el programa anterior la sentencia

snextLine()

seriacutea el equivalente a

Systemconsole()readLine()`

Mediante el uso de la clase Scanner es posible leer varios datos en una misma liacutenea Enel programa anterior se pediacutea un nombre y una edad en total dos datos que habiacutea queintroducir en liacuteneas separadas Observa coacutemo en el siguiente ejemplo se piden esosdos datos en una sola liacutenea y separados por un espacio

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScanner02

Lectura de datos desde teclado 20

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tu nombre y tu edad separados por un espacio )

String nombre = snext()

int edad = snextInt()

Systemoutprintln(Tu nombre es + nombre + y tu edad es + edad)

Fiacutejate coacutemo se ha utilizado snext() para leer una cadena de caracteres y snextInt()

para leer un nuacutemero entero todo ello en la misma liacuteneaEl siguiente programa de ejemplo calcula la media de tres nuacutemeros decimales Paraleer cada uno de los nuacutemeros en la misma liacutenea se utiliza snextDouble

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScannerMedia

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tres nuacutemeros (pueden contener decimales) separados por esp

acios )

double x1 = snextDouble()

double x2 = snextDouble()

double x3 = snextDouble()

double media = (x1 + x2 + x3) 3

Systemoutprintln(La media de esos tres nuacutemeros es + media)

Lectura de datos desde teclado 21

Recuerda que iexcla programar se aprende programando Es muy importanteque pruebes los ejemplos - si los modificas y experimentas todaviacutea mejor - yque realices los ejercicios Para aprender a programar no basta con leer el libroy entenderlo es una condicioacuten necesaria pero no suficiente Igual que paraser piloto hacen falta muchas horas de vuelo para ser programador hacenfalta muchas horas picando coacutedigo probando corrigiendo erroreshellip iexclAacutenimoiexclEl esfuerzo merece la pena

Lectura de datos desde teclado 22

34 Ejercicios

Ejercicio 1Realiza un programa que pida dos nuacutemeros y que luego muestre el resultadode su multiplicacioacuten

Ejercicio 2Realiza un conversor de euros a pesetas La cantidad de euros que se quiereconvertir debe ser introducida por teclado

Ejercicio 3Realiza un conversor de pesetas a euros La cantidad de pesetas que se quiereconvertir debe ser introducida por teclado

Ejercicio 4Escribe un programa que sume reste multiplique y divida dos nuacutemerosintroducidos por teclado

Ejercicio 5Escribe un programa que calcule el aacuterea de un rectaacutengulo

Ejercicio 6Escribe un programa que calcule el aacuterea de un triaacutengulo

Ejercicio 7Escribe un programa que calcule el total de una factura a partir de la baseimponible

Ejercicio 8Escribe un programa que calcule el salario semanal de un empleado en basea las horas trabajadas a razoacuten de 12 euros la hora

Lectura de datos desde teclado 23

Ejercicio 9Escribe un programa que calcule el volumen de un cono seguacuten la foacutermula V =13πr

2h

Ejercicio 10Realiza un conversor de Mb a Kb

Ejercicio 11Realiza un conversor de Kb a Mb

Ejercicio 12Escribe un programa que calcule el precio final de un producto seguacuten subase imponible (precio antes de impuestos) el tipo de IVA aplicado (generalreducido o superreducido) y el coacutedigo promocional Los tipos de IVA generalreducido y superreducido son del 21 10 y 4 respectivamente Los coacutedi-gos promocionales pueden ser nopro mitad meno5 o 5porc que significanrespectivamente que no se aplica promocioacuten el precio se reduce a la mitadse descuentan 5 euros o se descuenta el 5 El ejercicio se da por bueno si semuestran los valores correctos aunque los nuacutemeros no esteacuten tabuladosEjemplo

Introduzca la base imponible 25

Introduzca el tipo de IVA (general reducido o superreducido) reducido

Introduzca el coacutedigo promocional (nopro mitad meno5 o 5porc) mitad

Base imponible 2500

IVA (10) 250

Precio con IVA 2750

Coacuted promo (mitad) -1375

TOTAL 1375

Lectura de datos desde teclado 24

Ejercicio 13Realiza un programa que calcule la nota que hace falta sacar en el segundoexamen de la asignatura Programacioacuten para obtener la media deseada Hayque tener en cuenta que la nota del primer examen cuenta el 40 y la delsegundo examen un 60Ejemplo 1

Introduce la nota del primer examen 7

iquestQueacute nota quieres sacar en el trimestre 85

Para tener un 85 en el trimestre necesitas sacar un 95 en el segundo examen

Ejemplo 2

Introduce la nota del primer examen 8

iquestQueacute nota quieres sacar en el trimestre 7

Para tener un 7 en el trimestre necesitas sacar un 633 en el segundo examen

4 Sentencia condicional (if y switch)Una sentencia condicional permite al programa bifurcar el flujo de ejecucioacuten deinstrucciones dependiendo del valor de una expresioacuten

41 Sentencia if

La sentencia if permite la ejecucioacuten de una serie de instrucciones en funcioacuten delresultado de una expresioacuten loacutegica El resultado de evaluar una expresioacuten loacutegica essiempre verdadero (true) o falso (false) Es muy simple en lenguaje natural seriacutea algocomo rdquosi esta condicioacuten es verdadera entonces haz esto sino haz esto otrordquoEl formato de la sentencia if es el siguiente

if (condicioacuten)

instrucciones a ejecutar si la condicioacuten es verdadera

else

instrucciones a ejecutar si la condicioacuten es falsa

A continuacioacuten se muestra un ejempo del uso de la sentencia if

Sentencia if author Luis J Saacutenchez

public class SentenciaIf01

public static void main(String[] args)

Systemoutprint(iquestCuaacutel es la capital de Kiribati )

String respuesta = Systemconsole()readLine()

if (respuestaequals(Tarawa))

Systemoutprintln(iexclLa respuesta es correcta)

else

Systemoutprintln(Lo siento la respuesta es incorrecta)

25

Sentencia condicional (if y switch) 26

En el programa se le pregunta al usuario cuaacutel es la capital de Kiriwati La respuestaintroducida por el usuario se almacena en la variable respuesta A continuacioacuten vienela sentencia condicional if

if (respuestaequals(Tarawa))

Llegado a este punto el programa evaluacutea la expresioacuten respuestaequals(Tarawa)Observa que para comparar dos cadenas de caracteres se utiliza equals() Ima-ginemos que el usuario ha introducido por teclado Madrid entonces la expresioacutenMadridequals(Tarawa) dariacutea como resultado false (falso)Si la expresioacuten hubiera dado como resultado true (verdadero) se ejecutaria la liacutenea

Systemoutprintln(iexclLa respuesta es correcta)

pero no es el caso el resultado de la expresioacuten ha sido false (falso) todo el mundosabe que la capital de Kiriwati no es Madrid por tanto se ejecutariacutea la liacutenea

Systemoutprintln(Lo siento la respuesta es incorrecta)

Vamos a ver otro ejemplo esta vez con nuacutemeros El usuario introduciraacute un nuacutemero porteclado y el programa diraacute si se trata de un nuacutemero positivo o negativo

Sentencia if author Luis J Saacutenchez

public class SentenciaIf02

public static void main(String[] args)

Systemoutprint(Por favor introduce un nuacutemero entero )

String linea = Systemconsole()readLine()

int x = IntegerparseInt( linea )

if (x lt 0)

Systemoutprintln(El nuacutemero introducido es negativo)

else

Systemoutprintln(El nuacutemero introducido es positivo)

El siguiente bloque de coacutedigo

Sentencia condicional (if y switch) 27

if (x lt 0)

Systemoutprintln(El nuacutemero introducido es negativo)

elseSystemoutprintln(El nuacutemero introducido es positivo)

compilariacutea y funcionariacutea sin problemas - fiacutejate que hemos quitado las llaves - ya queantes y despueacutes del else hay una sola sentencia y en estos casos no es obligatorioponer llaves Sin embargo nosotros siempre usaremos llaves es una exigencia delestaacutendar de Google al que nos centildeimos en este manual

Llaves egipcias (egyptian brackets)Fiacutejate en la manera de colocar las llaves dentro del coacutedigo de un programaen Java La llave de apertura de bloque se coloca justo al final de la liacutenea y lallave de cierre va justo al principio de la liacutenea Se llaman llaves egipcias1 porla similitud entre las llaves y las manos de los egipcios que aparecen en lospapiros

1httpblogcodinghorrorcomnew-programming-jargon

Sentencia condicional (if y switch) 28

42 Operadores de comparacioacuten

En el ejemplo anterior usamos el operador lt en la comparacioacuten if (x lt 0) para saber sila variable x es menor que cero Hay maacutes operadores de comparacioacuten en la siguientetabla se muestran todos

OPERADOR NOMBRE EJEMPLO DESCRIPCIOacuteN== igual a == b a es igual a b= distinto a = b a es distinto de blt menor que a lt b a es menor que bgt mayor que a gt b a es mayor que b

lt= mayor o igual que a gt = b a es mayor o igual que b

El siguiente ejemplo muestra el uso de uno de estos operadores concretamente de gt=

(mayor o igual) El usuario introduce una nota si esta nota es mayor o igual a 5 sele mostraraacute un mensaje diciendo que ha aprobado y en caso de que no se cumpla lacondicioacuten se mostraraacute un mensaje diciendo que estaacute suspenso

Sentencia if author Luis J Saacutenchez

public class SentenciaIf03

public static void main(String[] args)

Systemoutprint(iquestQueacute nota has sacado en el uacuteltimo examen )

String line = Systemconsole()readLine()

double nota = DoubleparseDouble( line )

if (nota gt= 5)

Systemoutprintln(iexclEnhorabuena iexclhas aprobado)

else

Systemoutprintln(Lo siento has suspendido)

Sentencia condicional (if y switch) 29

43 Operadores loacutegicos

Los operadores de comparacioacuten se pueden combinar con los operadores loacutegicos Porejemplo si queremos saber si la variable a es mayor que b y ademaacutes es menor que cescribiriacuteamos if ((a gt b) ampamp (a lt c)) En la siguiente tabla se muestran los operadoresloacutegicos de Java

OPERADOR NOMBRE EJEMPLO DEVUELVEVERDADEROCUANDOhellip

ampamp y (7 gt 2) ampamp (2 lt 4) las dos condicionesson verdaderas

|| o (7 gt 2) || (2 lt 4) al menos una de lascondiciones es

verdadera no (7 gt 2) la condicioacuten es falsa

Vamos a ver coacutemo funcionan los operadores loacutegicos con un ejemplo Mediante if ((n lt

1) || (n gt 100)) se pueden detectar los nuacutemeros que no estaacuten en el rango de 1 a 100literalmente seriacutea ldquosi n es menor que 1 o n es mayor que 100rdquo

Operadores loacutegicos author Luis J Saacutenchez

public class OperadoresLogicos01

public static void main(String[] args)

Systemoutprintln(Adivina el nuacutemero que estoy pensando)

Systemoutprint(Introduce un nuacutemero entre el 1 y el 100 )

String linea = Systemconsole()readLine()

int n = IntegerparseInt( linea )

if ((n lt 1) || (n gt 100))

Systemoutprintln(El nuacutemero introducido debe estar en el intervalo 1 - 100)

Systemoutprint(Tienes otra oportunidad introduce un nuacutemero )

linea = Systemconsole()readLine()

n = IntegerparseInt( linea )

if (n == 24)

Systemoutprintln(iexclEnhorabuena iexclhas acertado)

else

Systemoutprintln(Lo siento ese no es el nuacutemero que estoy pensando)

Sentencia condicional (if y switch) 30

En el siguiente programa puedes ver el uso de operadores loacutegicos combinado conoperadores relacionales (operadores de comparacioacuten) Intenta adivinar cuaacutel seraacute elresultado mirando el coacutedigo

Operadores loacutegicos y relacionales author Luis J Saacutenchez

public class OperadoresLogicos02

public static void main(String[] args)

boolean a = trueboolean b = falseSystemoutprintln(a = + a)

Systemoutprintln(b = + b)

Systemoutprintln(a ampamp b = + (a ampamp b))

Systemoutprintln(a || b = + (a || b))

Systemoutprintln(a = + a)

Systemoutprintln(a || (6 gt 10) = + (a || (6 gt 10)))

Systemoutprintln(((4 lt= 4) || false) ampamp (a) = + (((4 lt= 4) || false) ampamp (a)))

Sentencia condicional (if y switch) 31

44 Sentencia switch (seleccioacuten muacuteltiple)

A veces es necesario comparar el valor de una variable con una serie de valoresconcretos La seleccioacuten muacuteltiple es muy parecida (aunque no es exactamente igual) auna secuencia de varias sentencias ifEl formato de switch es el que se muestra a continuacioacuten En legunaje natural seriacutea algoasiacute como ldquoSi variable vale valor1 entonces entra por case valor1 si variable vale valor2

entonces entra por case valor2hellip si variable no vale ninguno de los valores que hay enlos distintos case entonces entra por default

switch(variable)

case valor1

sentencias

break

case valor2

sentencias

break

default

sentencias

A continuacioacuten tienes un ejemplo completo en Java Se pide al usuario un nuacutemero demes y el programa da el nombre del mes que corresponde a ese nuacutemero

Sentencia muacuteltiple (switch) author Luis Joseacute Saacutenchez

public class SentenciaSwitch

public static void main(String[] args)

Systemoutprint(Por favor introduzca un numero de mes )

int mes = IntegerparseInt(Systemconsole()readLine())

String nombreDelMes

switch (mes)

Sentencia condicional (if y switch) 32

case 1

nombreDelMes = enero

breakcase 2

nombreDelMes = febrero

breakcase 3

nombreDelMes = marzo

breakcase 4

nombreDelMes = abril

breakcase 5

nombreDelMes = mayo

breakcase 6

nombreDelMes = junio

breakcase 7

nombreDelMes = julio

breakcase 8

nombreDelMes = agosto

breakcase 9

nombreDelMes = septiembre

breakcase 10

nombreDelMes = octubre

breakcase 11

nombreDelMes = noviembre

breakcase 12

nombreDelMes = diciembre

breakdefault

nombreDelMes = no existe ese mes

Systemoutprintln(Mes + mes + + nombreDelMes)

Observa que es necesario introducir un break despueacutes de la asignacioacuten de la variable

Sentencia condicional (if y switch) 33

nombreDelMes En caso de no encontrarse el break el programa continuacutea la ejecucioacuten enla liacutenea siguienteEl bloque que corresponde al default se ejecuta cuando la variable no coincide conninguno de los valores de los case Escribiremos siempre el default al final de lasentencia switch aunque no sea necesarioLa sentencia switch se utiliza con frecuencia para crear menuacutes

Ejemplo de un menuacute con switch author Luis Joseacute Saacutenchez

public class MenuConSwitch

public static void main(String[] args)

Systemoutprintln( CAacuteLCULO DE AacuteREAS)

Systemoutprintln( ----------------)

Systemoutprintln( 1 Cuadrado)

Systemoutprintln( 2 Rectaacutengulo)

Systemoutprintln( 3 Triaacutengulo)

Systemoutprint(n Elija una opcioacuten (1-3) )

int opcion = IntegerparseInt(Systemconsole()readLine())

double lado

double base

double altura

switch (opcion)

case 1

Systemoutprint(nIntroduzca el lado del cuadrado en cm )

lado = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(nEl aacuterea del cuadrado es + (lado lado) + cm2)

break

case 2

Systemoutprint(nIntroduzca la base del rectaacutengulo en cm )

base = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura del rectaacutengulo en cm )

altura = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El aacuterea del rectaacutengulo es + (base altura) + cm2)

break

Sentencia condicional (if y switch) 34

case 3

Systemoutprint(nIntroduzca la base del triaacutengulo en cm )

base = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura del triaacutengulo en cm )

altura = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El aacuterea del triaacutengulo es + ((base altura) 2) + cm2)

break

default

Systemoutprint(nLo siento la opcioacuten elegida no es correcta)

Sentencia condicional (if y switch) 35

45 Ejercicios

Ejercicio 1Escribe un programa que pida por teclado un diacutea de la semana y que diga queacuteasignatura toca a primera hora ese diacutea

Ejercicio 2Realiza un programa que pida una hora por teclado y que muestre luegobuenos diacuteas buenas tardes o buenas noches seguacuten la hora Se utilizaraacuten lostramos de 6 a 12 de 13 a 20 y de 21 a 5 respectivamente Soacutelo se tienen encuenta las horas los minutos no se deben introducir por teclado

Ejercicio 3Escribe un programa en que dado un nuacutemero del 1 a 7 escriba el correspon-diente nombre del diacutea de la semana

Ejercicio 4Vamos a ampliar uno de los ejercicios de la relacioacuten anterior para considerarlas horas extras Escribe un programa que calcule el salario semanal de untrabajador teniendo en cuenta que las horas ordinarias (40 primeras horas detrabajo) se pagan a 12 euros la hora A partir de la hora 41 se pagan a 16euros la hora

Ejercicio 5Realiza un programa que resuelva una ecuacioacuten de primer grado (del tipo ax+b = 0)

Ejercicio 6Realiza un programa que calcule el tiempo que tardaraacute en caer un objeto desdeuna altura h Aplica la foacutermula t =

radic2hg siendo g = 981ms2

Ejercicio 7Realiza un programa que calcule la media de tres notas

Sentencia condicional (if y switch) 36

Ejercicio 8Ampliacutea el programa anterior para que diga la nota del boletiacuten (insuficientesuficiente bien notable o sobresaliente)

Ejercicio 9Realiza un programa que resuelva una ecuacioacuten de segundo grado (del tipoax2 + bx+ c = 0)

Ejercicio 10Escribe un programa que nos diga el horoacutescopo a partir del diacutea y el mes denacimiento

Ejercicio 11Escribe un programa que dada una hora determinada (horas y minutos)calcule los segundos que faltan para llegar a la medianoche

Ejercicio 12Realiza un minicuestionario con 10 preguntas tipo test sobre las asignaturasque se imparten en el curso Cada pregunta acertada sumaraacute un punto Elprograma mostraraacute al final la calificacioacuten obtenida Paacutesale el minicuestionarioa tus compantildeeros y piacutedeles que lo hagan para ver queacute tal andan de conoci-mientos en las diferentes asignaturas del curso

Ejercicio 13Escribe un programa que ordene tres nuacutemeros enteros introducidos porteclado

Ejercicio 14Realiza un programa que diga si un nuacutemero introducido por teclado es par yodivisible entre 5

Ejercicio 15Escribe un programa que pinte una piraacutemide rellena con un caraacutecter introdu-cido por teclado que podraacute ser una letra un nuacutemero o un siacutembolo como +- $ amp etc El programa debe permitir al usuario mediante un menuacute elegir siel veacutertice de la piraacutemide estaacute apuntando hacia arriba hacia abajo hacia laizquierda o hacia la derecha

Sentencia condicional (if y switch) 37

Ejercicio 16Realiza un programa que nos diga si hay probabilidad de que nuestra parejanos estaacute siendo infiel El programa iraacute haciendo preguntas que el usuariocontestaraacute con verdadero o falso Cada pregunta contestada como verdaderosumaraacute 3 puntos Las preguntas contestadas con falso no suman puntos Utili-za el fichero test_infidelidadtxt para obtener las preguntas y las conclusionesdel programa

Ejercicio 17Escribe un programa que diga cuaacutel es la uacuteltima cifra de un nuacutemero enterointroducido por teclado

Ejercicio 18Escribe un programa que diga cuaacutel es la primera cifra de un nuacutemero enterointroducido por teclado Se permiten nuacutemeros de hasta 5 cifras

Ejercicio 19Realiza un programa que nos diga cuaacutentos diacutegitos tiene un nuacutemero entero quepuede ser positivo o negativo Se permiten nuacutemeros de hasta 5 diacutegitos

Ejercicio 20Realiza un programa que diga si un nuacutemero entero positivo introducido porteclado es capicuacutea Se permiten nuacutemeros de hasta 5 cifras

Sentencia condicional (if y switch) 38

Ejercicio 21Calcula la nota de un trimestre de la asignatura Programacioacuten El programapediraacute las dos notas que ha sacado el alumno en los dos primeros controlesSi la media de los dos controles da un nuacutemero mayor o igual a 5 el alumnoestaacute aprobado y se mostraraacute la media En caso de que la media sea un nuacutemeromenor que 5 el alumno habraacute tenido que hacer el examen de recuperacioacutenque se califica como apto o no apto por tanto se debe preguntar al usuarioiquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) Si elresultado de la recuperacioacuten es apto la nota seraacute un 5 en caso contrario semantiene la nota media anteriorEjemplo 1

Nota del primer control 7

Nota del segundo control 10

Tu nota de Programacioacuten es 85

Ejemplo 2

Nota del primer control 6

Nota del segundo control 3

iquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) apto

Tu nota de Programacioacuten es 5

Ejemplo 3

Nota del primer control 6

Nota del segundo control 3

iquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) no apto

Tu nota de Programacioacuten es 45

Ejercicio 22Realiza un programa que dado un diacutea de la semana (de lunes a viernes) y unahora (horas y minutos) calcule cuaacutentos minutos faltan para el fin de semanaSe consideraraacute que el fin de semana comienza el viernes a las 1500h Se dapor hecho que el usuario introduciraacute un diacutea y hora correctos anterior al viernesa las 1500h

5 BuclesLos bucles se utilizan para repetir un conjunto de sentencias Por ejemplo imagina quees necesario introducir la notas de 40 alumnos con el fin de calcular la media la notamaacutexima y la nota miacutenima Podriacuteamos escribir 40 veces la intruccioacuten que pide un datopor teclado Systemconsole()readLine() y convertir cada uno de esos datos a un nuacutemerocon decimales con 40 instrucciones DoubleparseDouble() no parece algo muy eficienteEs mucho maacutes praacutectico meter dentro de un bucle aquellas sentencias que queremosque se repitanNormalmente existe una condicioacuten de salida que hace que el flujo del programaabandone el bucle y continuacutee justo en la siguiente sentencia Si no existe condicioacuten desalida o si esta condicioacuten no se cumple nunca se produciriacutea lo que se llama un bucleinfinito y el programa no terminariacutea nunca

51 Bucle for

Se suele utilizar cuando se conoce previamente el nuacutemero exacto de iteraciones(repeticiones) que se van a realizar La sintaxis es la siguiente

for (expresion1 expresion2 expresion3)

sentencias

Justo al principio se ejecuta expresion1 normalmente se usa para inicializar una variableEl bucle se repite mientras se cumple expresion2 y en cada iteraccioacuten del bucle seejecuta expresion3 que suele ser el incremento o decremento de una variable Conun ejemplo se veraacute mucho maacutes claro

Bucle for author Luis Joseacute Saacutenchez

public class EjemploFor

public static void main(String[] args)

for (int i = 1 i lt 11 i++)

Systemoutprintln(i)

39

Bucles 40

En este ejemplo int i = 1 se ejecuta solo una vez antes que cualquier otra cosa comoves esta expresioacuten se utiliza para inicializar la variable i a 1 Mientra se cumpla lacondicioacuten i lt 11 el contenido del bucle o sea Systemoutprintln(i) se va a ejecutarEn cada iteracioacuten del bucle i++ hace que la variable i se incremente en 1 El resultadodel ejemplo es la impresioacuten en pantalla de los nuacutemeros del 1 al 10Intenta seguir mentalmente el flujo del programa Experimenta inicializando la variablei con otros valores cambia la condicioacuten con gt o lt= y observa lo que sucede Pruebatambieacuten a cambiar el incremento de la variable i por ejemplo con i = i + 2

52 Bucle while

El bucle while se utiliza para repetir un conjunto de sentencias siempre que se cumplauna determinada condicioacuten Es importante resentildear que la condicioacuten se comprueba alcomienzo del bucle por lo que se podriacutea dar el caso de que dicho bucle no se ejecutasenunca La sintaxis es la siguiente

while (expresion)

sentencias

Las sentencias se ejecutan una y otra vez mientras expresion sea verdadera El siguienteejemplo produce la misma salida que el ejemplo anterior muestra coacutemo cambian losvalores de i del 1 al 10

Bucle while author Luis Joseacute Saacutenchez

public class EjemploWhile

public static void main(String[] args)

int i = 1

while (i lt 11)

Systemoutprintln(i)

Bucles 41

i++

En el siguiente ejemplo se cuentan y se suman los nuacutemeros que se van introduciendopor teclado Para indicarle al programa que debe dejar de pedir nuacutemeros el usuariodebe introducir un nuacutemero negativo esa seraacute la condicioacuten de salida del bucle Observaque el bucle se repite mientras el nuacutemero introducido sea mayor o igual que cero

Bucle while que termina cuando se introduce por teclado un nuacutemero negativo author Luis Joseacute Saacutenchez

public class CuentaPositivos

public static void main(String[] args)

Systemoutprintln(Por favor vaya introduciendo nuacutemeros y pulsando INTRO)

Systemoutprintln(Para terminar introduzca un nuacutemero negativo)

int numeroIntroducido = 0

int cuentaNumeros = 0

int suma = 0

while (numeroIntroducido gt= 0)

numeroIntroducido = IntegerparseInt(Systemconsole()readLine())

cuentaNumeros++ Incrementa en uno la variablesuma += numeroIntroducido Equivale a suma = suma + NumeroIntroducido

Systemoutprintln(Has introducido + (cuentaNumeros - 1) + nuacutemeros positivos)

Systemoutprintln(La suma total de ellos es + (suma - numeroIntroducido))

53 Bucle do-while

El bucle do-while funciona de la misma manera que el bucle while con la salvedad deque expresion se evaluacutea al final de la iteraccioacuten Las sentencias que encierran el bucledo-while por tanto se ejecutan como miacutenimo una vez La sintaxis es la siguiente

Bucles 42

do

sentencias

while (expresion)

El siguiente ejemplo es el equivalente do-while a los dos ejemplos anteriores quecuentan del 1 al 10

Bucle do-while author Luis Joseacute Saacutenchez

public class EjemploDoWhile

public static void main(String[] args)

int i = 1

do

Systemoutprintln(i)

i++

while (i lt 11)

Veamos otro ejemplo En este caso se van a ir leyendo nuacutemeros de teclado mientrasel nuacutemero introducido sea par el programa pararaacute por tanto cuando se introduzcaun nuacutemero impar

Bucle do-while que termina cuando se introduce por teclado un nuacutemero impar author Luis Joseacute Saacutenchez

public class TerminaCuandoEsImpar

public static void main(String[] args)

int numero

Bucles 43

do

Systemoutprint(Dime un nuacutemero )

numero = IntegerparseInt(Systemconsole()readLine())

if (numero 2 == 0) comprueba si el nuacutemero introducido es parSystemoutprintln(Queacute bonito es el + numero)

else

Systemoutprintln(No me gustan los nuacutemeros impares adioacutes)

while (numero 2 == 0)

Te invito a que realices una modificacioacuten sobre este uacuteltimo ejemplo Despueacutes de pedirun nuacutemero haz que el programa diga iquestQuiere continuar (sn) Si el usuario introduceuna s o una S el programa deberaacute continuar pidiendo nuacutemerosCualquier bucle que un programador quiera realizar en Java lo puede implementar confor while o do-while por tanto con una sola de estas tres opciones tendriacutea suficienteNo obstante seguacuten el programa en cuestioacuten una u otra posibilidad se adapta mejorque las otras y resulta maacutes elegante Con la experiencia te iraacutes dando cuenta cuaacutendoes mejor utilizar cada una

Bucles 44

54 Ejercicios

Ejercicio 1Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle for

Ejercicio 2Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle while

Ejercicio 3Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle do-while

Ejercicio 4Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 hacia atraacutesutilizando un bucle for

Ejercicio 5Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 hacia atraacutesutilizando un bucle while

Ejercicio 6Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 utilizando un bucledo-while

Ejercicio 7Realiza el control de acceso a una caja fuerte La combinacioacuten seraacute unnuacutemero de 4 cifras El programa nos pediraacute la combinacioacuten para abrirla Si noacertamos se nos mostraraacute el mensaje ldquoLo siento esa no es la combinacioacutenrdquoy si acertamos se nos diraacute ldquoLa caja fuerte se ha abierto satisfactoriamenterdquoTendremos cuatro oportunidades para abrir la caja fuerte

Ejercicio 8Muestra la tabla de multiplicar de un nuacutemero introducido por teclado

Bucles 45

Ejercicio 9Realiza un programa que nos diga cuaacutentos diacutegitos tiene un nuacutemero introducidopor teclado

Ejercicio 10Escribe un programa que calcule la media de un conjunto de nuacutemeros positivosintroducidos por teclado A priori el programa no sabe cuaacutentos nuacutemeros seintroduciraacuten El usuario indicaraacute que ha terminado de introducir los datoscuando meta un nuacutemero negativo

Ejercicio 11Escribe un programa que muestre en tres columnas el cuadrado y el cubo delos 5 primeros nuacutemeros enteros a partir de uno que se introduce por teclado

Ejercicio 12Escribe un programa que muestre los n primeros teacuterminos de la serie deFibonacci El primer teacutermino de la serie de Fibonacci es 0 el segundo es 1y el resto se calcula sumando los dos anteriores por lo que tendriacuteamos quelos teacuterminos son 0 1 1 2 3 5 8 13 21 34 55 89 144hellip El nuacutemero n sedebe introducir por teclado

Ejercicio 13Escribe un programa que lea una lista de diez nuacutemeros y determine cuaacutentosson positivos y cuaacutentos son negativos

Ejercicio 14Escribe un programa que pida una base y un exponente (entero positivo) yque calcule la potencia

Ejercicio 15Escribe un programa que dados dos nuacutemeros uno real (base) y un enteropositivo (exponente) saque por pantalla todas las potencias con base elnumero dado y exponentes entre uno y el exponente introducido No se debenutilizar funciones de exponenciacioacuten Por ejemplo si introducimos el 2 y el 5se deberaacuten mostrar 21 22 23 24 y 25

Bucles 46

Ejercicio 16Escribe un programa que diga si un nuacutemero introducido por teclado es o noprimo Un nuacutemero primo es aquel que soacutelo es divisible entre eacutel mismo y launidad

Ejercicio 17Realiza un programa que sume los 100 nuacutemeros siguientes a un nuacutemero enteroy positivo introducido por teclado Se debe comprobar que el dato introducidoes correcto (que es un nuacutemero positivo)

Ejercicio 18Escribe un programa que obtenga los nuacutemeros enteros comprendidos entredos nuacutemeros introducidos por teclado y validados como distintos el programadebe empezar por el menor de los enteros introducidos e ir incrementando de7 en 7

Ejercicio 19Realiza un programa que pinte una piraacutemide por pantalla La altura se debepedir por teclado El caraacutecter con el que se pinta la piraacutemide tambieacuten se debepedir por teclado

Ejercicio 20Igual que el ejercicio anterior pero esta vez se debe pintar una piraacutemide hueca

Ejercicio 21Realiza un programa que vaya pidiendo nuacutemeros hasta que se introduzca unnumero negativo y nos diga cuantos nuacutemeros se han introducido la media delos impares y el mayor de los pares El nuacutemero negativo soacutelo se utiliza paraindicar el final de la introduccioacuten de datos pero no se incluye en el coacutemputo

Ejercicio 22Muestra por pantalla todos los nuacutemeros primos entre 2 y 100 ambos incluidos

Bucles 47

Ejercicio 23Escribe un programa que permita ir introduciendo una serie indeterminadade nuacutemeros mientras su suma no supere el valor 10000 Cuando esto uacuteltimoocurra se debe mostrar el total acumulado el contador de los nuacutemerosintroducidos y la media

Ejercicio 24Escribe un programa que lea un nuacutemero n e imprima una piraacutemide de nuacutemeroscon n filas como en la siguiente figura

1

121

12321

1234321

Ejercicio 25Realiza un programa que pida un nuacutemero por teclado y que luego muestre esenuacutemero al reveacutes

Ejercicio 26Realiza un programa que pida primero un nuacutemero y a continuacioacuten un diacutegitoEl programa nos debe dar la posicioacuten (o posiciones) contando de izquierda aderecha que ocupa ese diacutegito en el nuacutemero introducido

Ejercicio 27Escribe un programa que muestre cuente y sume los muacuteltiplos de 3 que hayentre 1 y un nuacutemero leiacutedo por teclado

Ejercicio 28Escribe un programa que calcule el factorial de un nuacutemero entero leiacutedo porteclado

Ejercicio 29Escribe un programa que muestre por pantalla todos los nuacutemeros enterospositivos menores a uno leiacutedo por teclado que no sean divisibles entre otrotambieacuten leiacutedo de igual forma

Bucles 48

Ejercicio 30Realiza una programa que calcule las horas transcurridas entre dos horas dedos diacuteas de la semana No se tendraacuten en cuenta los minutos ni los segundosEl diacutea de la semana se puede pedir como un nuacutemero (del 1 al 7) o comouna cadena (de ldquolunesrdquo a ldquodomingordquo) Se debe comprobar que el usuariointroduce los datos correctamente y que el segundo diacutea es posterior al primeroA continuacioacuten se muestra un ejemplo

Por favor introduzca la primera hora

Diacutea lunes

Hora 18

Por favor introduzca la segunda hora

Diacutea martes

Hora 20

Entre las 1800h del lunes y las 2000h del martes hay 26 horas

Ejercicio 31Realiza un programa que pinte la letra L por pantalla hecha con asteriscos Elprograma pediraacute la altura El palo horizontal de la L tendraacute una longitud de lamitad (divisioacuten entera entre 2) de la altura maacutes unoEjemplo

Introduzca la altura de la L 5

Bucles 49

Ejercicio 32Escribe un programa que dado un nuacutemero entero diga cuaacuteles son y cuaacutentosuman los diacutegitos pares Los diacutegitos pares se deben mostrar en orden deizquierda a derecha Usa long en lugar de int donde sea necesario para admitirnuacutemeros largosEjemplo 1

Por favor introduzca un nuacutemero entero positivo 94026782

Diacutegitos pares 4 0 2 6 8 2

Suma de los diacutegitos pares 22

Ejemplo 2

Por favor introduzca un nuacutemero entero positivo 31779

Diacutegitos pares

Suma de los diacutegitos pares 0

Ejemplo 3

Por favor introduzca un nuacutemero entero positivo 2404

Diacutegitos pares 2 4 0 4

Suma de los diacutegitos pares 10

Ejercicio 33Realiza un programa que pinte la letra U por pantalla hecha con asteriscos Elprograma pediraacute la altura Fiacutejate que el programa inserta un espacio y pintados asteriscos menos en la base para simular la curvatura de las esquinasinferioresEjemplo

Introduzca la altura de la U 5

Bucles 50

Ejercicio 34Escribe un programa que pida dos nuacutemeros por teclado y que luego mezcle endos nuacutemeros diferentes los diacutegitos pares y los impares Se van comprobandolos diacutegitos de la siguiente manera primer diacutegito del primer nuacutemero primerdiacutegito del segundo nuacutemero segundo diacutegito del primer nuacutemero segundodiacutegito del segundo nuacutemero tercer diacutegito del primer nuacutemerohellip Para facilitarel ejercicio podemos suponer que el usuario introduciraacute dos nuacutemeros de lamisma longitud y que siempre habraacute al menos un diacutegito par y uno impar Usalong en lugar de int donde sea necesario para admitir nuacutemeros largosEjemplo 1

Por favor introduzca un nuacutemero 9402

Introduzca otro nuacutemero 6782

El nuacutemero formado por los diacutegitos pares es 640822

El nuacutemero formado por los diacutegitos impares es 97

Ejemplo 2

Por favor introduzca un nuacutemero 137

Introduzca otro nuacutemero 909

El nuacutemero formado por los diacutegitos pares es 0

El nuacutemero formado por los diacutegitos impares es 19379

6 Nuacutemeros aleatoriosLos nuacutemeros aleatorios se utilizan con frecuencia en programacioacuten para emular elcomportamiento de alguacuten fenoacutemeno natural el resultado de un juego de azar o engeneral para generar cualquier valor impredecible a prioriPor ejemplo se pueden utilizar nuacutemeros aleatorios para generar tiradas de dados detal forma que de antemano no se puede saber el resultado Antes de tirar un dado nosabemos si saldraacute un 3 o un 5 se trataraacute pues de un nuacutemero impredecible lo que siacutesabemos es que saldraacute un nuacutemero entre el 1 y el 6 es decir podemos acotar el rangode los valores que vamos a obtener de forma aleatoria

61 Generacioacuten de nuacutemeros aleatorios con y sin decimales

Para generar valores aleatorios utilizaremos Mathrandom() Esta funcioacuten genera unnuacutemero con decimales (de tipo double) en el intervalo [0 - 1) es decir genera un nuacutemeromayor o igual que 0 y menor que 1El siguiente programa genera diez nuacutemeros aleatorios

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio01

public static void main(String[] args)

Systemoutprintln(Diez nuacutemeros aleatoriosn)

for (int i = 1 i lt 11 i++)

Systemoutprintln(Mathrandom())

La salida del programa puede ser algo como esto

51

Nuacutemeros aleatorios 52

030830376099567813

08330493363981046

02322483682676435

03130746053770094

034192944433558736

09636470440975567

03398896383918959

079825461825305

09868509622870223

09967893773101499

Te invito a que ejecutes varias veces el programa Podraacutes observar que cada vez salennuacutemeros diferentes aunque siempre estaacuten comprendidos entre 0 y 1 (incluyendo el0)Pensaraacutes que no es muy uacutetil generar nuacutemeros aleatorios entre 0 y 1 si lo que queremoses por ejemplo sacar una carta al azar de la baraja espantildeola pero en realidad unnuacutemero decimal entre 0 y 1 es lo uacutenico que nos hace falta para generar cualquier tipode valor aleatorio siempre y cuando se manipule ese nuacutemero de la forma adecuadaPor ejemplo si queremos generar valores aleatorios entre 0 y 10 (incluyendo el 0 y sinllegar a 10) simplemente tendremos que correr la coma un lugar o lo que es lo mismomultiplicar por 10

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio02

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 0 y 10)

Systemoutprintln( sin llegar a 10 (con decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprintln( Mathrandom()10 + )

El programa anterior genera una salida como eacutesta

Nuacutemeros aleatorios 53

007637674702636321

1025787417143682

1854993461897163

5690351111720931

382310645589797

5518007662236258

923529380254256

39201032643833376

5836554253122096

6224559064261578

7652976185871555

49922807025365135

7498156441347868

8743251697509109

9727764845406675

2929766691797686

005801413446517634

21575652936687284

Si queremos generar nuacutemeros enteros en lugar de nuacutemeros con decimales basta conhacer un casting para convertir los nuacutemeros de tipo double en nuacutemeros de tipo intRecuerda que (int)x transforma x en una variable de tipo entero si x era de tipo float

o double perderiacutea todos los decimales

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio03

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 0 y 9 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint((int)(Mathrandom()10) + )

Systemoutprintln()

La salida del programa debe ser algo muy parecido a esto

Nuacutemeros aleatorios 54

20 nuacutemeros aleatorios entre 0 y 9 (sin decimales)

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

iquestY si en lugar de generar nuacutemeros enteros entre 0 y 9 queremos generar nuacutemeros entre1 y 10 Como habraacutes podido adivinar simplemente habriacutea que sumar 1 al nuacutemerogenerado de esta forma se ldquodesplazan un pasordquo los valores generados al azar de talforma que el miacutenimo valor que se produce seriacutea el 0 + 1 = 1 y el maacuteximo seriacutea 9 + 1= 10

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio04

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 1 y 10 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint( (int)(Mathrandom()10 + 1) + )

Systemoutprintln()

Vamos a ponerlo un poco maacutes difiacutecil Ahora vamos a generar nuacutemeros enteros entre50 y 60 ambos incluidos Primero multiplicamos Mathrandom() por 11 con lo queobtenemos nuacutemeros decimales entre 0 y 109999hellip (sin llegar nunca hasta 11) Luegodesplazamos ese intervalo sumando 50 por lo que obtenemos nuacutemeros decimalesentre 50 y 609999hellip Por uacuteltimo quitamos los decimales haciendo casting y voilagraveya tenemos nuacutemeros enteros aleatorios entre 50 y 60 ambos incluidos

Nuacutemeros aleatorios 55

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio05

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 50 y 60 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint(((int)(Mathrandom()11) + 50 ) + )

Systemoutprintln()

62 Generacioacuten de palabras de forma aleatoria de un conjuntodado

Hemos visto coacutemo generar nuacutemeros aleatorios con y sin decimales y en diferentesintervalos Vamos a producir ahora de forma aleatoria una palabra - piedra papel otijera - generando primero un nuacutemero entero entre 0 y 2 y posteriormente haciendocorresponder una palabra a cada nuacutemero

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio06

public static void main(String[] args)

Systemoutprintln(Genera al azar piedra papel o tijera)

int mano = (int)(Mathrandom()3) genera un nuacutemero al azar entre 0 y 2 ambos incluidos

switch(mano)

case 0

Systemoutprintln(piedra)

Nuacutemeros aleatorios 56

breakcase 1

Systemoutprintln(papel)

breakcase 2

Systemoutprintln(tijera)

breakdefault

iquestCoacutemo podriacuteamos generar un diacutea de la semana de forma aleatoria En efecto primerogeneramos un nuacutemero entre 1 y 7 ambos inclusive y luego hacemos corresponder undiacutea de la semana a cada uno de los nuacutemeros

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio07

public static void main(String[] args)

Systemoutprintln(Muestra un diacutea de la semana al azar)

int dia = (int)(Mathrandom()7) + 1 genera un nuacutemero aleatorio entre el 1 y el 7

switch(dia)

case 1

Systemoutprintln(lunes)

breakcase 2

Systemoutprintln(martes)

breakcase 3

Systemoutprintln(mieacutercoles) breakcase 4

Systemoutprintln(jueves)

breakcase 5

Systemoutprintln(viernes)

breakcase 6

Nuacutemeros aleatorios 57

Systemoutprintln(saacutebado)

breakcase 7

Systemoutprintln(domingo)

breakdefault

Nuacutemeros aleatorios 58

63 Ejercicios

Ejercicio 1Escribe un programa que muestre la tirada de tres dados Se debe mostrartambieacuten la suma total (los puntos que suman entre los tres dados)

Ejercicio 2Realiza un programa que muestre al azar el nombre de una carta de labaraja francesa Esta baraja estaacute dividida en cuatro palos picas corazonesdiamantes y treacuteboles Cada palo estaacute formado por 13 cartas de las cuales 9cartas son numerales y 4 literales 2 3 4 5 6 7 8 9 10 J Q K y A (queseriacutea el 1) Para convertir un nuacutemero en una cadena de caracteres podemosusar StringvalueOf(n)

Ejercicio 3Igual que el ejercicio anterior pero con la baraja espantildeola Se utilizaraacute la barajade 40 cartas 2 3 4 5 6 7 sota caballo rey y as

Ejercicio 4Muestra 20 nuacutemeros enteros aleatorios entre 0 y 10 (ambos incluidos) sepa-rados por espacios

Ejercicio 5Muestra 50 nuacutemeros enteros aleatorios entre 100 y 199 (ambos incluidos)separados por espacios Muestra tambieacuten el maacuteximo el miacutenimo y la mediade esos nuacutemeros

Ejercicio 6Escribe un programa que piense un nuacutemero al azar entre 0 y 100 El usuariodebe adivinarlo y tiene para ello 5 oportunidades Despueacutes de cada intentofallido el programa diraacute cuaacutentas oportunidades quedan y si el nuacutemero intro-ducido es menor o mayor que el nuacutemero secreto

Ejercicio 7Escribe un programa que muestre tres apuestas de la quiniela en tres colum-nas para los 14 partidos y el pleno al quince (15 filas)

Nuacutemeros aleatorios 59

Ejercicio 8Modifica el programa anterior para que la probabilidad de que salga un 1 seade 12 la probabilidad de que salga x sea de 13 y la probabilidad de que salga2 sea de 16 Pista 12 = 36 y 13 = 26

Ejercicio 9Realiza un programa que vaya generando nuacutemeros aleatorios pares entre 0y 100 y que no termine de generar nuacutemeros hasta que no saque el 24 Elprograma deberaacute decir al final cuaacutentos nuacutemeros se han generado

Ejercicio 10Realiza un programa que pinte por pantalla diez liacuteneas formadas por carac-teres El caraacutecter con el que se pinta cada liacutenea se elige de forma aleatoriaentre uno de los siguientes - = | Las liacuteneas deben tener una longitudaleatoria entre 1 y 40 caracteres

Ejercicio 11Escribe un programa que muestre 20 notas generadas al azar Las notas debenaparecer de la forma suspenso suficiente bien notable o sobresaliente Alfinal apareceraacute el nuacutemero de suspensos el nuacutemero de suficientes el nuacutemerode bienes etc

Ejercicio 12Realiza un programa que llene la pantalla de caracteres aleatorios (a lo Matrix)con el coacutedigo ascii entre el 32 y el 126 Puedes hacer casting con (char) paraconvertir un entero en un caraacutecter

Ejercicio 13Escribe un programa que simule la tirada de dos dados El programa deberaacutecontinuar tirando los dados una y otra vez hasta que en alguna tirada los dosdados tengan el mismo valor

Ejercicio 14Realiza un programa que haga justo lo contrario a lo que hace el ejercicio 6El programa intentaraacute adivinar el nuacutemero que estaacutes pensando - un nuacutemeroentre 0 y 100 - teniendo para ello 5 oportunidades En cada intento fallido elprograma debe preguntar si el nuacutemero que estaacutes pensando es mayor o menorque el que te acaba de decir

Nuacutemeros aleatorios 60

Ejercicio 15Realiza un generador de melodiacutea con las siguientes condicionesa) Las notas deben estar generadas al azar Las 7 notas son do re mi fasol la y sib) Una melodiacutea estaacute formada por un nuacutemero aleatorio de notas mayor o iguala 4 menor o igual a 28 y siempre muacuteltiplo de 4 (4 8 12hellip)c) Cada grupo de 4 notas seraacute un compaacutes y estaraacute separado del siguientecompaacutes mediante la barra vertical ldquo|rdquo (Alt + 1) El final de la melodiacutea se marcacon dos barrasd) La uacuteltima nota de la melodiacutea debe coincidir con la primeraEjemplo 1

do mi fa mi | si do sol fa | fa re si do | sol mi re do ||

Ejemplo 2

la re mi sol | fa mi mi si | do la sol fa | fa re si sol | do sol mi re | fa la do la ||

Nuacutemeros aleatorios 61

Ejercicio 16Realiza un simulador de maacutequina tragaperras simplificada que cumpla lossiguientes requisitosa) El ordenador mostraraacute una tirada que consiste en mostrar 3 figuras Hay 5figuras posibles corazoacuten diamante herradura campana y limoacutenb) Si las tres figuras son diferentes se debe mostrar el mensaje ldquoLo sientoha perdidordquoc) Si hay dos figuras iguales y una diferente se debe mostrar el mensaje ldquoBienha recuperado su monedardquod) Si las tres figuras son iguales se debe mostrar ldquoEnhorabuena ha ganado10 monedasrdquoEjemplo 1

diamante diamante limoacuten

Bien ha recuperado su moneda

Ejemplo 2

herradura campana diamante

Lo siento ha perdido

Ejemplo 3

corazoacuten corazoacuten corazoacuten

Enhorabuena ha ganado 10 monedas

7 Arrays

71 Arrays de una dimensioacuten

Un array es un tipo de dato capaz de almacenar muacuteltiples valores Se utiliza paraagrupar datos muy parecidos por ejemplo si se necesita almacenar la temperaturamedia diaria en Maacutelaga durante el uacuteltimo antildeo se pueden utilizar las variables temp0temp1 temp2 temp3 temp4 hellip y asiacute hasta 365 variables distintas pero seriacutea poco praacutectico esmejor utilizar un array de nombre temp y usar un iacutendice para referanciar la temperaturade un diacutea concreto del antildeoEn matemaacuteticas un array de una dimensioacuten se llama vector En este libro noutilizaremos este teacutermino para no confundirlo con la clase Vector de JavaVeamos con un ejemplo coacutemo se crea y se utiliza un array

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array01

public static void main(String[] args)

int[] n se define n como un array de enterosn = new int[4] se reserva espacio para 4 enteros

n[0] = 26

n[1] = -30

n[2] = 0

n[3] = 100

Systemoutprint(Los valores del array n son los siguientes )

Systemoutprint(n[0] + + n[1] + + n[2] + + n[3])

int suma = n[0] + n[3]

Systemoutprintln(nEl primer elemento del array maacutes el uacuteltimo suman + suma)

Observa que el iacutendice de cada elemento de un array se indica entre corchetes de talforma que n[3] es el cuarto elemento ya que el primer iacutendice es el 0

62

Arrays 63

Array n

Iacutendice Valor0 261 -302 03 11

Fiacutejate que la definicioacuten del array y la reserva de memoria para los cuatro elementosque la componen se ha realizado en dos liacuteneas diferentes Se pueden hacer ambascosas en una sola liacutenea como veremos en el siguiente ejemplo

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array02

public static void main(String[] args)

definicioacuten del array y reserva de memoria en la misma liacuteneaint[] x = new int[5]

x[0] = 8

x[1] = 33

x[2] = 200

x[3] = 150

x[4] = 11

Systemoutprintln(El array x tiene 5 elementos iquestcuaacutel de ellos quiere ver)

Systemoutprint(Introduzca un nuacutemero del 0 al 4 )

int indice = IntegerparseInt(Systemconsole()readLine())

Systemoutprint(El elemento que se encuentra en la posicioacuten + indice)

Systemoutprintln( es el + x[indice])

El array x del ejemplo anterior se ha ido rellenando elemento a elemento Si se conocenpreviamente todos los valores iniciales del array se puede crear e inicializar en unasola liacutenea de la siguiente forma

int[] x = 8 33 200 150 11

Cada elemento del array se puede utilizar exactamente igual que cualquier otravariable es decir se le puede asignar un valor o se puede usar dentro de una

Arrays 64

expresioacuten En el siguiente ejemplo se muestran varias operaciones en las que losoperandos son elementos del array numPara recorrer todos los elementos de un array se suele utilizar un bucle for junto conun iacutendice que va desde 0 hasta el tamantildeo del array menos 1

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array03

public static void main(String[] args)

int[] num = new int[10]

num[0] = 8

num[1] = 33

num[2] = 200

num[3] = 150

num[4] = 11

num[5] = 88

num[6] = num[2] 10

num[7] = num[2] 10

num[8] = num[0] + num[1] + num[2]

num[9] = num[8]

Systemoutprintln(El array num contiene los siguientes elementos)

for (int i = 0 i lt 10 i++)

Systemoutprintln(num[i])

En Java a diferencia de otros lenguajes como Ruby o PHP todos los elementos de unarray deben ser del mismo tipo por ejemplo no puede haber un entero en la posicioacuten2 y una cadena de caracteres en la posicioacuten 7 del mismo array En el siguiente ejemplose muestra un array de caracteres

Arrays 65

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array04

public static void main(String[] args)

char[] caracter = new char[6]

caracter[0] = R

caracter[1] =

caracter[2] = amp

caracter[3] = +

caracter[4] = A

caracter[5] = 2

Systemoutprintln(El array caracter contiene los siguientes elementos)

for (int i = 0 i lt 6 i++)

Systemoutprintln(caracter[i])

En el siguiente ejemplo se muestra un array de nuacutemeros de tipo double que almacenanotas de alumnos

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array05

public static void main(String[] args)

double[] nota = new double[4]

Systemoutprintln(Para calcular la nota media necesito saber la )

Systemoutprintln(nota de cada uno de tus exaacutemenes)

for (int i = 0 i lt 4 i++)

Arrays 66

Systemoutprint(Nota del examen nordm + (i + 1) + )

nota[i] = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(Tus notas son )

double suma = 0

for (int i = 0 i lt 4 i++)

Systemoutprint(nota[i] + )

suma += nota[i]

Systemoutprintln(nLa media es + suma 4)

72 Arrays bidimensionales

Un array bidimensional utiliza dos iacutendices para localizar cada elemento Podemos vereste tipo de dato como un array que a su vez contiene otros arrays Tambieacuten se puedever como una cuadriacutecula en la que los datos quedan distribuidos en filas y columnasEn el siguiente ejemplo se muestra la definicioacuten y el uso de un array de dosdimensiones

author Luis Joseacute Saacutenchez Ejemplo de uso de arrays bidimensionales

public class ArrayBi01

public static void main(String[] args)

throws InterruptedException Se antildeade esta liacutenea para poder usar sleep

int[][] n = new int[3][2] array de 3 filas por 2 columnas

n[0][0]=20

n[1][0]=67

n[1][1]=33

n[2][1]=7

int fila columna

Arrays 67

for(fila = 0 fila lt 3 fila++)

Systemoutprint(Fila + fila)

for(columna = 0 columna lt 2 columna++)

Systemoutprintf(10d n[fila][columna])

Threadsleep(1000) retardo de un segundo

Systemoutprintln()

Mediante la liacutenea int[][] n = new int[3][2] se define un array bidimensional de 3 filaspor 2 columnas pero bien podriacutean ser 2 filas por 3 columnas seguacuten el objetivo y eluso que del array haga el programadorLos valores del array bidimensional se pueden proporcionar en la misma liacutenea de ladefinicioacuten como se muestra en el siguiente ejemplo

author Luis Joseacute Saacutenchez Ejemplo de uso de arrays bidimensionales

public class ArrayBi02

public static void main(String[] args)

throws InterruptedException Se antildeade esta liacutenea para poder usar sleep

int fila columna

int[][] n = 20 4 67 33 07

for(fila = 0 fila lt 3 fila++)

Systemoutprint(Fila + fila)

for(columna = 0 columna lt 2 columna++)

Systemoutprintf(10d n[fila][columna])

Threadsleep(1000) retardo de un segundo

Systemoutprintln()

Arrays 68

Los arrays bidimensionales se utilizan con frecuencia para situar objetos en un planocomo por ejemplo las piezas de ajedrez en un tablero o un personaje de video-juegoen un laberintoEn el siguiente programa se colocan una mina y un tesoro de forma aleatoria en uncuadrante de cuatro filas por cinco columnas El usuario intentaraacute averiguar doacutendeestaacute el tesoro indicando las coordenadas (x y)

Minijuego Busca el tesoro Se colocan una mina y un tesoro de forma aleatoria en un cuadrante de cuatro filas por cinco columnas El usuario intentaraacute averiguar doacutende estaacute el tesoro author Luis Joseacute Saacutenchez

public class BuscaTesoro

se definen constantes para representar el contenido de las celdasstatic final int VACIO = 0

static final int MINA = 1

static final int TESORO = 2

static final int INTENTO = 3

public static void main(String[] args)

int x

int y

int[][] cuadrante = new int[5][4]

inicializa el arrayfor(x = 0 x lt 4 x++)

for(y = 0 y lt 3 y++)

cuadrante[x][y] = VACIO

coloca la minaint minaX = (int)(Mathrandom()4)int minaY = (int)(Mathrandom()3)cuadrante[minaX][minaY] = MINA

coloca el tesoroint tesoroX

Arrays 69

int tesoroY

do

tesoroX = (int)(Mathrandom()4)tesoroY = (int)(Mathrandom()3)

while ((minaX == tesoroX) ampamp (minaY == tesoroY))

cuadrante[tesoroX][tesoroY] = TESORO

juegoSystemoutprintln(iexclBUSCA EL TESORO)

boolean salir = falseString c =

do

pinta el cuadrantefor(y = 3 y gt= 0 y--)

Systemoutprint(y + |)

for(x = 0 x lt 5 x++)

if (cuadrante[x][y] == INTENTO)

Systemoutprint(X )

elseSystemoutprint( )

Systemoutprintln()

Systemoutprintln( ----------n 0 1 2 3 4n)

pide las coordenadasSystemoutprint(Coordenada x )

x = IntegerparseInt(Systemconsole()readLine())

Systemoutprint(Coordenada y )

y = IntegerparseInt(Systemconsole()readLine())

mira lo que hay en las coordenadas indicadas por el usuarioswitch(cuadrante[x][y])

case VACIO

cuadrante[x][y] = INTENTO

breakcase MINA

Systemoutprintln(Lo siento has perdido)

salir = truebreak

case TESOROSystemoutprintln(Enhorabuena has encontrado el tesoro)

salir = truebreak

default

Arrays 70

while (salir)

pinta el cuadrantefor(y = 3 y gt= 0 y--)

Systemoutprint(y + )

for(x = 0 x lt 5 x++)

switch(cuadrante[x][y])

case VACIO

c =

breakcase MINA

c =

breakcase TESORO

c = euro

breakcase INTENTO

c = x

breakdefault

Systemoutprint(c)

Systemoutprintln()

Systemoutprintln( ----------n 0 1 2 3 4n)

73 Recorrer arrays con for al estilo foreach

Al trabajar con arrays es muy frecuente cometer errores utilizando los iacutendices El errormaacutes tiacutepico consiste en intentar acceder a un elemento mediante un iacutendice que se salede los liacutemites Por ejemplo si tenemos el array n definido de la siguiente forma int[] n =

new int[10] cuando intentamos acceder a n[-1] o a n[10] obtenemos un error en tiempode ejecucioacutenPara recorrer un array de un modo maacutes praacutectico y sencillo sin que tengamos quepreocuparnos de los liacutemites podemos utilizar el bucle for con el formato foreach Deesta forma indicamos simplemente el nombre del array que queremos recorrer y enqueacute variable se va a ir colocando cada elemento con cada iteraccioacuten del bucle No hayque especificar con queacute iacutendice comienza y termina el bucle de eso se encarga JavaA continuacioacuten se muestra el ejemplo Array05java visto anteriormente pero esta vezutilizando el for a la manera foreach

Arrays 71

Recorre un array con un for al estilo foreach author Luis Joseacute Saacutenchez

public class ArrayForEach

public static void main(String[] args)

double[] nota = new double[4]

Systemoutprintln(Para calcular la nota media necesito saber la )

Systemoutprintln(nota de cada uno de tus exaacutemenes)

for (int i = 0 i lt 4 i++)

Systemoutprint(Nota del examen nordm + (i + 1) + )

nota[i] = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(Tus notas son )

double suma = 0

for (double n nota) for al estilo foreachSystemoutprint(n + )

suma += n

Systemoutprintln(nLa media es + suma 4)

Fiacutejate en el segundo for en este caso no se utiliza ninguacuten iacutendice simplemente decimosldquove sacando uno a uno los elementos del array nota y deposita cada uno de esoselementos en la variable n que es de tipo doublerdquo

Arrays 72

74 Ejercicios

741 Arrays de una dimensioacuten

Ejercicio 1Define un array de 12 nuacutemeros enteros con nombre num y asigna los valoresseguacuten la tabla que se muestra a continuacioacuten Muestra el contenido de todoslos elementos del array iquestQueacute sucede con los valores de los elementos que nohan sido inicializados

Ejercicio 2Define un array de 10 caracteres con nombre simbolo y asigna valores a loselementos seguacuten la tabla que se muestra a continuacioacuten Muestra el contenidode todos los elementos del array iquestQueacute sucede con los valores de los elementosque no han sido inicializados

Ejercicio 3Escribe un programa que lea 10 nuacutemeros por teclado y que luego los muestreen orden inverso es decir el primero que se introduce es el uacuteltimo enmostrarse y viceversa

Ejercicio 4Define tres arrays de 20 nuacutemeros enteros cada una con nombres numerocuadrado y cubo Carga el array numero con valores aleatorios entre 0 y 100 En elarray cuadrado se deben almacenar los cuadrados de los valores que hay en elarray numero En el array cubo se deben almacenar los cubos de los valores quehay en numero A continuacioacuten muestra el contenido de los tres arrays dispuestoen tres columnas

Arrays 73

Ejercicio 5Escribe un programa que pida 10 nuacutemeros por teclado y que luego muestrelos nuacutemeros introducidos junto con las palabras ldquomaacuteximordquo y ldquomiacutenimordquo al ladodel maacuteximo y del miacutenimo respectivamente

Ejercicio 6Escribe un programa que lea 15 nuacutemeros por teclado y que los almacene en unarray Rota los elementos de ese array es decir el elemento de la posicioacuten 0debe pasar a la posicioacuten 1 el de la 1 a la 2 etc El nuacutemero que se encuentra enla uacuteltima posicioacuten debe pasar a la posicioacuten 0 Finalmente muestra el contenidodel array

Ejercicio 7Escribe un programa que genere 100 nuacutemeros aleatorios del 0 al 20 y que losmuestre por pantalla separados por espacios El programa pediraacute entoncespor teclado dos valores y a continuacioacuten cambiaraacute todas las ocurrencias delprimer valor por el segundo en la lista generada anteriormente Los nuacutemerosque se han cambiado deben aparecer entrecomillados

Ejercicio 8Realiza un programa que pida la temperatura media que ha hecho en cada mesde un determinado antildeo y que muestre a continuacioacuten un diagrama de barrashorizontales con esos datos Las barras del diagrama se pueden dibujar a basede asteriscos o cualquier otro caraacutecter

Ejercicio 9Realiza un programa que pida 8 nuacutemeros enteros y que luego muestre esosnuacutemeros junto con la palabra ldquoparrdquo o ldquoimparrdquo seguacuten proceda

Ejercicio 10Escribe un programa que genere 20 nuacutemeros enteros aleatorios entre 0 y 100y que los almacene en un array El programa debe ser capaz de pasar todoslos nuacutemeros pares a las primeras posiciones del array (del 0 en adelante) ytodos los nuacutemeros impares a las celdas restantes Utiliza arrays auxiliares sies necesario

Arrays 74

Ejercicio 11Realiza un programa que pida 10 nuacutemeros por teclado y que los almacene enun array A continuacioacuten se mostraraacute el contenido de ese array junto al iacutendice(0 ndash 9) utilizando para ello una tabla Seguidamente el programa pasaraacute losprimos a las primeras posiciones desplazando el resto de nuacutemeros (los queno son primos) de tal forma que no se pierda ninguno Al final se debe mostrarel array resultantePor ejemplo

Array inicial

Array final

Ejercicio 12Realiza un programa que pida 10 nuacutemeros por teclado y que los almacene enun array A continuacioacuten se mostraraacute el contenido de ese array junto al iacutendice(0 ndash 9) Seguidamente el programa pediraacute dos posiciones a las que llamaremosldquoinicialrdquo y ldquofinalrdquo Se debe comprobar que inicial es menor que final y queambos nuacutemeros estaacuten entre 0 y 9 El programa deberaacute colocar el nuacutemero dela posicioacuten inicial en la posicioacuten final rotando el resto de nuacutemeros para que nose pierda ninguno Al final se debe mostrar el array resultantePor ejemplo para inicial = 3 y final = 7

Array inicial

Array final

Arrays 75

Ejercicio 13Escribe un programa que rellene un array de 100 elementos con nuacutemeros ente-ros aleatorios comprendidos entre 0 y 500 (ambos incluidos) A continuacioacutenel programa mostraraacute el array y preguntaraacute si el usuario quiere destacar elmaacuteximo o el miacutenimo Seguidamente se volveraacute a mostrar el array escribiendoel nuacutemero destacado entre dobles asteriscosEjemplo

459 204 20 250 178 90 353 32 229 357 224 454 260 310 140 249 332 426 423 413 96 447 465 29

8 459 411 118 480 302 417 42 82 126 82 474 362 76 190 104 21 257 88 21 251 6 383 47 78 392

394 244 494 87 253 376 379 98 364 237 13 299 228 409 402 225 426 267 330 243 209 426 435

309 356 173 130 416 15 477 34 28 377 193 481 368 466 262 422 275 384 399 397 87 218 84 312

480 207 68 108

iquestQueacute quiere destacar (1 ndash miacutenimo 2 ndash maacuteximo) 1

459 204 20 250 178 90 353 32 229 357 224 454 260 310 140 249 332 426 423 413 96 447 465 29

8 459 411 118 480 302 417 42 82 126 82 474 362 76 190 104 21 257 88 21 251 6 383 47 78

392 394 244 494 87 253 376 379 98 364 237 13 299 228 409 402 225 426 267 330 243 209 426

435 309 356 173 130 416 15 477 34 28 377 193 481 368 466 262 422 275 384 399 397 87 218 84

312 480 207 68 108

Ejercicio 14Escribe un programa que pida 8 palabras y las almacene en un array Acontinuacioacuten las palabras correspondientes a colores se deben almacenar alcomienzo y las que no son colores a continuacioacuten Puedes utilizar tantos arraysauxiliares como quieras Los colores que conoce el programa deben estar enotro array y son los siguientes verde rojo azul amarillo naranja rosa negroblanco y moradoEjemplo

Array original

0 1 2 3 4 5 6 7

casa azul verde orden morado bombillabici rosa

Array resultado

0 1 2 3 4 5 6 7

azul verde morado rosa casa orden bombillabici

Arrays 76

Ejercicio 15Un restaurante nos ha encargado una aplicacioacuten para colocar a los clientes ensus mesas En una mesa se pueden sentar de 0 (mesa vaciacutea) a 4 comensales(mesa llena) Cuando llega un cliente se le pregunta cuaacutentos son De momentoel programa no estaacute preparado para colocar a grupos mayores a 4 por tantosi un cliente dice por ejemplo que son un grupo de 6 el programa daraacute elmensaje ldquoLo siento no admitimos grupos de 6 haga grupos de 4personas como maacuteximo e intente de nuevordquo Para el grupo que llegase busca siempre la primera mesa libre (con 0 personas) Si no quedan mesaslibres se busca donde haya un hueco para todo el grupo por ejemplo si elgrupo es de dos personas se podraacute colocar donde haya una o dos personasInicialmente las mesas se cargan con valores aleatorios entre 0 y 4 Cadavez que se sientan nuevos clientes se debe mostrar el estado de las mesasLos grupos no se pueden romper aunque haya huecos sueltos suficientes Elfuncionamiento del programa se ilustra a continuacioacutenEjemplo

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 0 2 4 1 0 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 2

Por favor sieacutentense en la mesa nuacutemero 3

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 1 0 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 4

Por favor sieacutentense en la mesa nuacutemero 7

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 1 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 3

Tendraacuten que compartir mesa Por favor sieacutentense en la mesa nuacutemero 6

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 4 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 4

Lo siento en estos momentos no queda sitio

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 4 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) -1

Gracias Hasta pronto

Arrays 77

Ejercicio 16Escribe un programa que rellene un array de 20 elementos con nuacutemeros ente-ros aleatorios comprendidos entre 0 y 400 (ambos incluidos) A continuacioacutenel programa mostraraacute el array y preguntaraacute si el usuario quiere resaltar losmuacuteltiplos de 5 o los muacuteltiplos de 7 Seguidamente se volveraacute a mostrar elarray escribiendo los nuacutemeros que se quieren resaltar entre corchetesEjemplo ldquolsquoconsole159 204 20 250 178 90 353 32 229 357 224 54 260 310 140 249 335 326 22313 iquestQueacute nuacutemeros quiere resaltar (1 ndash los muacuteltiplos de 5 2 ndash los muacuteltiplos de7) 1 159 204 [20] [250] 178 [90] 353 32 229 357 224 54 [260] [310] [140]249 [335] 326 223 13 ldquolsquo

742 Arrays bidimensionales

Ejercicio 1Define un array de nuacutemeros enteros de 3 filas por 6 columnas con nombre num

y asigna los valores seguacuten la siguiente tabla Muestra el contenido de todoslos elementos del array dispuestos en forma de tabla como se muestra en lafigura

Ejercicio 2Escribe un programa que pida 20 nuacutemeros enteros Estos nuacutemeros se debenintroducir en un array de 4 filas por 5 columnas El programa mostraraacute lassumas parciales de filas y columnas igual que si de una hoja de caacutelculo setratara La suma total debe aparecer en la esquina inferior derecha

Arrays 78

Ejercicio 3Modifica el programa anterior de tal forma que los nuacutemeros que se introducenen el array se generen de forma aleatoria (valores entre 100 y 999)

Ejercicio 4Modifica el programa anterior de tal forma que las sumas parciales y la sumatotal aparezcan en la pantalla con un pequentildeo retardo dando la impresioacuten deque el ordenador se queda ldquopensandordquo antes de mostrar los nuacutemeros

Ejercicio 5Realiza un programa que rellene un array de 6 filas por 10 columnas connuacutemeros enteros positivos comprendidos entre 0 y 1000 (ambos incluidos)A continuacioacuten el programa deberaacute dar la posicioacuten tanto del maacuteximo comodel miacutenimo

Ejercicio 6Modifica el programa anterior de tal forma que no se repita ninguacuten nuacutemero enel array

Ejercicio 7Mejora el juego ldquoBusca el tesorordquo de tal forma que si hay una mina a una casillade distancia el programa avise diciendo iexclCuidado iexclHay una mina cerca

Ejercicio 8Escribe un programa que dada una posicioacuten en un tablero de ajedrez nos digaa queacute casillas podriacutea saltar un alfil que se encuentra en esa posicioacuten Como seindica en la figura el alfil se mueve siempre en diagonal El tablero cuenta con64 casillas Las columnas se indican con las letras de la ldquoardquo a la ldquohrdquo y las filasse indican del 1 al 8

Arrays 79

Ejemplo

Introduzca la posicioacuten del alfil d5

El aacutelfil puede moverse a las siguientes posiciones

h1 a2 g2 b3 e3 c4 e4 c6 e6 b7 f7 a8 g8

Ejercicio 9Realiza un programa que sea capaz de rotar todos los elementos de unamatriz cuadrada una posicioacuten en el sentido de las agujas del reloj La matrizdebe tener 12 filas por 12 columnas y debe contener nuacutemeros generados alazar entre 0 y 100 Se debe mostrar tanto la matriz original como la matrizresultado ambas con los nuacutemeros convenientemente alineados

Ejercicio 10Realiza el juego de las tres en raya

8 Funciones

81 Implementando funciones para reutilizar coacutedigo

En programacioacuten es muy frecuente reutilizar coacutedigo es decir usar coacutedigo ya exis-tente Cuando una parte de un programa requiere una funcionalidad que ya estaacuteimplementada en otro programa no tiene mucho sentido emplear tiempo y energiacuteaen implementarla otra vezUna funcioacuten es un trozo de coacutedigo que realiza una tarea muy concreta y que se puedeincluir en cualquier programa cuando hace falta resolver esa tarea Opcionalmentelas funciones aceptan una entrada (paraacutemetros de entrada) y devuelven una salidaObserva el siguiente ejemplo Se trata de un programa que pide un nuacutemero por tecladoy luego dice si el nuacutemero introducido es o no es primo

Dice si un nuacutemero es o no es primo (sin funciones) author Luis Joseacute Saacutenchez

public class NumeroPrimo

public static void main(String[] args)

Systemoutprint(Introduce un nuacutemero entero positivo )

int n = IntegerparseInt(Systemconsole()readLine())

boolean esPrimo = truefor (int i = 2 i lt n i++)

if ((n i) == 0)

esPrimo = false

if (esPrimo)

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

80

Funciones 81

Podemos intuir que la tarea de averiguar si un nuacutemero es o no primo seraacute algo queutilizaremos con frecuencia maacutes adelante asiacute que podemos aislar el trozo de coacutedigoque realiza ese cometido para usarlo con comodidad en otros programas

Dice si un nuacutemero es o no es primo usando una funcioacuten author Luis Joseacute Saacutenchez

public class NumeroPrimoConFuncion

Programa principal

public static void main(String[] args)

Systemoutprint(Introduzca un nuacutemero entero positivo )

int n = IntegerparseInt(Systemconsole()readLine())

if (esPrimo(n))

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

Funciones

Comprueba si un nuacutemero entero positivo es primo o no Un nuacutemero es primo cuando uacutenicamente es divisible entre eacutel mismo y la unidad param x un nuacutemero entero positivo return ltcodegttrueltcodegt si el nuacutemero es primo return ltcodegtfalseltcodegt en caso contrario

public static boolean esPrimo(int x)

for (int i = 2 i lt x i++)

if ((x i) == 0)

return false

Funciones 82

return true

Cada funcioacuten tiene una cabecera y un cuerpo En el ejemplo anterior la cabecera es

public static boolean esPrimo(int x)

De momento no vamos a explicar queacute significa public static lo dejaremos para cuandoveamos el capiacutetulo 9 ldquoProgramacioacuten orientada a objetosrdquo por ahora lo escribiremos talcual cada vez que definamos una funcioacuten A continuacioacuten se escribe el tipo de dato quedevuelve la funcioacuten en este caso es boolean porque la funcioacuten devolveraacute siempre true

(verdadero) o false falso Lo uacuteltimo que lleva la cabecera son los paraacutemetros encerradosentre pareacutentesis Esos paraacutemetros son los valores que se le pasan a la funcioacuten paraque realice los caacutelculos En este caso concreto el paraacutemetro que se pasa es x o seael nuacutemero que queremos saber si es primo o no Es necesario indicar siempre el tipode cada paraacutemetro en esta ocasioacuten el paraacutemetro que se pasa es de tipo entero (int)

82 Comentarios de funciones

Los comentarios tienen un papel muy importante en los programas ya que aunque nose compilan ni se ejecutan permiten describir aclarar o dar informacioacuten relevantesobre queacute hace exactamente el coacutedigo Un programa bien comentado es muchomaacutes faacutecil de corregir mantener y mejorar que un programa mal comentado o quesimplemente no tiene comentariosExiste una herramienta llamada javadoc que crea unos documentos en HTML coninformacioacuten sobre programas escritos en Java Para ello javadoc utiliza los comentariosque se han hecho y ademaacutes la meta-informacioacuten que se incluye en esos comentariosEsta meta-informacioacuten es muy faacutecil de distinguir pues va precedida siempre de uncaraacutecter Te habraacutes dado cuenta que en los comentarios de los programas que hemos visto eneste manual se indica el nombre del autor mediante authorSi los comentarios de los programas en general son importantes debemos prestarespecial atencioacuten a los comentarios de las funciones ya que posiblemente seraacutenusadas por otros programadores que querraacuten saber exactamente coacutemo se utilizanCon la etiqueta param seguida de un nombre de paraacutemetro se indica queacute paraacutemetroespera como entrada la funcioacuten Si una funcioacuten acepta varios paraacutemetros se especifi-caraacuten varias etiquetas param en los comentariosMediante la etiqueta return especificamos queacute devuelve exactamente la funcioacutenAunque el tipo de dato que se devuelve ya viene indicado en la cabecera de la funcioacutenmediante la etiqueta return podemos explicarlo con maacutes detalle

Funciones 83

En los comentarios se pueden incluir elementos de HTML como ltcodegt ampnbsp etc yaque los entiende perfectamente javadocPuedes hacer una prueba generando la documentacioacuten del ejemplo ejecutando lasiguiente liacutenea en una ventana de terminal Como tenemos tildes en los comentariossi queremos que salgan bien en las paacuteginas de documentacioacuten debemos indicar lacodificacioacuten de caracteres

javadoc -encoding UTF-8 -charset UTF-8 -docencoding UTF-8 NumeroPrimoConFuncionjava

Para aprender maacutes sobre javadoc puedes consultar la documentacioacuten oficial de Oracle1

83 Creacioacuten de bibliotecas de rutinas mediante paquetes

Si la funcioacuten esPrimo() va a ser usada en tres programas diferentes se puede copiary pegar su coacutedigo en cada uno de los programas pero hay una solucioacuten mucho maacuteselegante y praacutecticaLas funciones de un determinado tipo (por ejemplo funciones matemaacuteticas) se puedenagrupar para crear un paquete (package) que luego se importaraacute desde el programa quenecesite esas funcionesCada paquete se corresponde con un directorio Por tanto si hay un paquete connombre matematicas debe haber un directorio llamado tambieacuten matematicas en la mismaubicacioacuten del programa que importa ese paquete (normalmente el programa princi-pal)Las funciones se pueden agrupar dentro de un paquete de dos maneras diferentesPuede haber subpaquetes dentro de un paquete por ejemplo si quisieacuteramos dividirlas funciones matemaacuteticas en funciones relativas al caacutelculo de aacutereas y voluacutemenesde figuras geomeacutetricas y funciones relacionadas con caacutelculos estadiacutesticos podriacuteamoscrear dos directorios dentro de matematicas con nombres geometria y estadistica respecti-vamente Estos subpaquetes se llamariacutean matematicasgeometria y matematicasestadisticaOtra manera de agrupar las funciones dentro de un mismo paquete consiste en crearvarios ficheros dentro de un mismo directorio En este caso se podriacutean crear los ficherosGeometriajava y EstadisticajavaEntenderemos mejor todos estos conceptos con un ejemplo completo Vamos a crearun paquete con nombre matematicas que contenga dos clases Varias (para funcionesmatemaacuteticas de propoacutesito general) y Geometria Por tanto en el disco duro tendremosuna carpeta con nombre matematicas que contiene los ficheros Variasjava y GeometriajavaEl contenido de estos ficheros se muestra a continuacioacuten

1httpwwworaclecomtechnetworkjavajavasedocumentationindex-137868html

Funciones 84

Funciones matemaacuteticas de propoacutesito general author Luis Joseacute Saacutenchez

package matematicas

public class Varias

Comprueba si un nuacutemero entero positivo es primo o no Un nuacutemero es primo cuando uacutenicamente es divisible entre eacutel mismo y la unidad param x un nuacutemero entero positivo return ltcodegttrueltcodegt si el nuacutemero es primo return ltcodegtfalseltcodegt en caso contrario

public static boolean esPrimo(int x)

for (int i = 2 i lt x i++)

if ((x i) == 0)

return false

return true

Devuelve el nuacutemero de diacutegitos que contiene un nuacutemero entero param x un nuacutemero entero return la cantidad de diacutegitos que contiene el nuacutemero

public static int digitos(int x)

if (x == 0)

return 1

else

int n = 0

while (x gt 0)

x = x 10

n++

Funciones 85

return n

Se incluye a continuacioacuten Geometriacuteajava Recuerda que tanto Variasjava como Geome-

triacuteajava se encuentran dentro del directorio matematicas

Funciones geomeacutetricas author Luis Joseacute Saacutenchez

package matematicas

public class Geometria

Calcula el volumen de un cilindro Tanto el radio como la altura se deben proporcionar en las mismas unidades para que el resultado sea congruente param r radio del cilindro param h altura del cilindro return volumen del cilindro

public static double volumenCilindro(double r double h)

return MathPI r r h

Calcula la longitud de una circunferencia a partir del radio param r radio de la circunferencia return longitud de la circunferencia

public static double longitudCircunferencia(double r)

return 2 MathPI r

Observa que en ambos ficheros se especifica que las clases declaradas (y por tantolas funciones que se definen dentro) pertenecen al paquete matematicas mediante la

Funciones 86

liacutenea package matematicas Ahora ya podemos probar las funciones desde un programaexterno El programa PruebaFuncionesjava estaacute fuera de la carpeta matematicas justo enun nivel superior en la estructura de directorios

Dice si un nuacutemero es o no es primo usando una funcioacuten author Luis Joseacute Saacutenchez

import matematicasVariasimport matematicasGeometria

public class PruebaFunciones

public static void main(String[] args)

int n

Prueba esPrimo()

Systemoutprint(Introduzca un nuacutemero entero positivo )

n = IntegerparseInt(Systemconsole()readLine())

if (matematicasVariasesPrimo(n))

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

Prueba digitos()

Systemoutprint(Introduzca un nuacutemero entero positivo )

n = IntegerparseInt(Systemconsole()readLine())

Systemoutprintln(n + tiene + matematicasVariasdigitos(n) + diacutegitos)

Prueba volumenCilindro()

double r h

Systemoutprintln(Caacutelculo del volumen de un cilindro)

Systemoutprint(Introduzca el radio en metros )

r = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura en metros )

Funciones 87

h = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El volumen del cilindro es + matematicasGeometriavolumenCilind

ro(r h) + m3)

Las liacuteneas

import matematicasVariasimport matematicasGeometria

cargan las clases contenidas en el paquete matematicas y por tanto todas las funcionescontenidas en ellas No vamos a utilizar el comodiacuten de la forma import matematicas yaque estaacute desaconsejado su uso en el estaacutendar de codificacioacuten en Java de GoogleEl uso de una funcioacuten es muy sencillo hay que indicar el nombre del paquete el nom-bre de la clase y finalmente el nombre de la funcioacuten con los paraacutemetros adecuados Porejemplo como vemos en el programa anterior matematicasVariasdigitos(n) devuelve elnuacutemero de diacutegitos de n siendo matematicas el paquete Varias la clase digitos la funcioacuteny n el paraacutemetro que se le pasa a la funcioacuten

84 Aacutembito de las variables

El aacutembito de una variable es el espacio donde ldquoexisterdquo esa variable o dicho de otromodo el contexto dentro del cual la variable es vaacutelidaSeguramente has utilizado muchas veces variables con nombres como x i max o aux Elaacutembito de cada una de esas variables era el programa en el que estaban declaradasFiacutejate que la x del primer programa que aparece en este libro no interfiere para nadacon la x del siguiente programa que usa una variable con ese mismo nombre Aunquese llamen igual son variables diferentesCuando se implementan funciones hay que tener muy claro que las variables utilizadascomo paraacutemetros (por valor) o las variables que se definen dentro de la funcioacuten sonlocales a esa funcioacuten es decir su aacutembito es la funcioacuten y fuera de ella esas variablesno existen Presta atencioacuten al programa Variosjava y observa que las dos funcionesque hay definidas dentro de la clase utilizan sendas variables con nombre x Puesbien cada una de esas variables son completamente independientes se trata de dosvariables distintas que tienen el mismo nombre pero que son vaacutelidas cada una en supropio aacutembito

85 Paso de paraacutemetros por valor y por referencia

En Java como en la mayoriacutea de lenguajes de programacioacuten existen dos maneras depasar paraacutemetros por valor y por referencia

Funciones 88

Cuando se pasa un paraacutemetro por valor en realidad se pasa una copia de la variableuacutenicamente importa el valor Cualquier modificacioacuten que se le haga a la variable que sepasa como paraacutemetro dentro de la funcioacuten no tendraacute ninguacuten efecto fuera de la mismaVeamos un ejemplo

Paso de paraacutemetros por valor author Luis Joseacute Saacutenchez

public class PruebaParametros1

public static void main(String[] args)

int n = 10

Systemoutprintln(n)

calcula(n)

Systemoutprintln(n)

public static void calcula(int x)

x += 24

Systemoutprintln(x)

La salida del programa anterior es la siguiente

10

34

10

A pesar de que la variable que se pasa como paraacutemetro se modifica dentro de lafuncioacuten los cambios no tienen ninguacuten efecto en el programa principalCuando se pasa un paraacutemetro por referencia por el contrario si se modifica su valordentro de la funcioacuten los cambios se mantienen una vez que la funcioacuten ha terminadode ejecutarseEn la mayoriacutea de los lenguajes de programacioacuten es el programador quien decidecuaacutendo un paraacutemetro se pasa por valor y cuaacutendo se pasa por referencia En Java nopodemos elegir Todos los paraacutemetros que son de tipo int double float char o String

se pasan siempre por valor mientras que los arrays se pasan siempre por referenciaEsto quiere decir que cualquier cambio que efectuemos en un array que se pasa comoparaacutemetro permanece cuando termina la ejecucioacuten de la funcioacuten por lo que hay quetener especial cuidado en estos casos

Funciones 89

Paso de un array como paraacutemetro author Luis Joseacute Saacutenchez

public class PruebaParametrosArray

public static void main(String[] args)

int n[] = 8 33 200 150 11

int m[] = new int[5]

muestraArray(n)

incrementa(n)

muestraArray(n)

public static void muestraArray(int x[])

for (int i = 0 i lt xlength i++)

Systemoutprint(x[i] + )

Systemoutprintln()

public static void incrementa(int x[])

for (int i = 0 i lt xlength i++)

x[i]++

La salida del programa anterior es la siguiente

8 33 200 150 11

9 34 201 151 12

Comprobamos por tanto que el array que se ha pasado como paraacutemetro se hamodificado en la funcioacuten y se han conservado los cambios en el programa principalPor uacuteltimo se muestra un programa que contiene funciones que operan con arrays dedos dimensiones

Funciones 90

Paso de un array bidimensional como paraacutemetro author Luis Joseacute Saacutenchez

import matematicasVarias

public class ArrayBiFunciones

public static void main(String[] args)

int[][] n = new int[6][9]

for(int i = 0 i lt 6 i++)

for(int j = 0 j lt 9 j++)

n[i][j] = (int)(Mathrandom()100000)

muestraArrayIntBi(n)

Funciones

Devuelve el nuacutemero de filas de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return nuacutemero de filas del array

public static int filasArrayIntBi(int x[][])

return xlength

Devuelve el nuacutemero de columnas de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return nuacutemero de columnas del array

public static int columnasArrayIntBi(int x[][])

Funciones 91

return x[0]length

Devuelve el maacuteximo de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return el valor maacuteximo encontrado en el array

public static int maximoArrayIntBi(int x[][])

int maximo = IntegerMIN_VALUE

for (int f = 0 f lt filasArrayIntBi(x) f++)

for (int c = 0 c lt columnasArrayIntBi(x) c++)

if (x[f][c] gt maximo)

maximo = x[f][c]

return maximo

Muestra por pantalla el contenido de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros

public static void muestraArrayIntBi(int x[][])

String formatoNumero = + matematicasVariasdigitos(maximoArrayIntBi(x)) + d

for (int f = 0 f lt filasArrayIntBi(x) f++)

for (int c = 0 c lt columnasArrayIntBi(x) c++)

Systemoutprintf(formatoNumero + x[f][c])

Systemoutprintln()

Funciones 92

86 Ejercicios

Ejercicios 1-14Crea una biblioteca de funciones matemaacuteticas que contenga las siguientesfunciones Recuerda que puedes usar unas dentro de otras si es necesario

1 esCapicua Devuelve verdadero si el nuacutemero que se pasa como paraacute-metro es capicuacutea y falso en caso contrario

2 esPrimo Devuelve verdadero si el nuacutemero que se pasa como paraacutemetroes primo y falso en caso contrario

3 siguientePrimo Devuelve el menor primo que es mayor al nuacutemero quese pasa como paraacutemetro

4 potencia Dada una base y un exponente devuelve la potencia5 digitos Cuenta el nuacutemero de diacutegitos de un nuacutemero entero6 voltea Le da la vuelta a un nuacutemero7 digitoN Devuelve el diacutegito que estaacute en la posicioacuten n de un nuacutemero

entero Se empieza contando por el 0 y de izquierda a derecha8 posicionDeDigito Da la posicioacuten de la primera ocurrencia de un diacutegito

dentro de un nuacutemero entero Si no se encuentra devuelve -19 quitaPorDetras Le quita a un nuacutemero n diacutegitos por detraacutes (por la

derecha)10 quitaPorDelante Le quita a un nuacutemero n diacutegitos por delante (por la

izquierda)11 pegaPorDetras Antildeade un diacutegito a un nuacutemero por detraacutes12 pegaPorDelante Antildeade un diacutegito a un nuacutemero por delante13 trozoDeNumero Toma como paraacutemetros las posiciones inicial y final

dentro de un nuacutemero y devuelve el trozo correspondiente14 juntaNumeros Pega dos nuacutemeros para formar uno

Ejercicio 15Muestra los nuacutemeros primos que hay entre 1 y 1000

Ejercicio 16Muestra los nuacutemeros capicuacutea que hay entre 1 y 99999

Ejercicio 17Escribe un programa que pase de binario a decimal

Ejercicio 18Escribe un programa que pase de decimal a binario

Funciones 93

Ejercicio 19Une y ampliacutea los dos programas anteriores de tal forma que se permitaconvertir un nuacutemero entre cualquiera de las siguientes bases decimal binariohexadecimal y octal

Ejercicios 20-28Crea una biblioteca de funciones para arrays (de una dimensioacuten) de nuacutemerosenteros que contenga las siguientes funciones

1 generaArrayInt Genera un array de tamantildeo n con nuacutemeros aleatorioscuyo intervalo (miacutenimo y maacuteximo) se indica como paraacutemetro

2 minimoArrayInt Devuelve el miacutenimo del array que se pasa comoparaacutemetro

3 maximoArrayInt Devuelve el maacuteximo del array que se pasa comoparaacutemetro

4 mediaArrayInt Devuelve la media del array que se pasa como paraacute-metro

5 estaEnArrayInt Dice si un nuacutemero estaacute o no dentro de un array6 posicionEnArray Busca un nuacutemero en un array y devuelve la posicioacuten

(el iacutendice) en la que se encuentra7 volteaArrayInt Le da la vuelta a un array8 rotaDerechaArrayInt Rota n posiciones a la derecha los nuacutemeros de

un array9 rotaIzquierdaArrayInt Rota n posiciones a la izquierda los nuacutemeros de

un array

Funciones 94

Ejercicio 29-34Crea una biblioteca de funciones para arrays bidimensionales (de dos dimen-siones) de nuacutemeros enteros que contenga las siguientes funciones

1 generaArrayBiInt Genera un array de tamantildeo n x m con nuacutemerosaleatorios cuyo intervalo (miacutenimo y maacuteximo) se indica como paraacutemetro

2 filaDeArrayBiInt Devuelve la fila i-eacutesima del array que se pasa comoparaacutemetro

3 columnaDeArrayBiInt Devuelve la columna j-eacutesima del array que sepasa como paraacutemetro

4 coordenadasEnArrayBiInt Devuelve la fila y la columna (en un arraycon dos elementos) de la primera ocurrencia de un nuacutemero dentro de unarray bidimensional Si el nuacutemero no se encuentra en el array la funcioacutendevuelve el array -1 -1

5 esPuntoDeSilla Dice si un nuacutemero es o no punto de silla es decirmiacutenimo en su fila y maacuteximo en su columna

6 diagonal Devuelve un array que contiene una de las diagonales delarray bidimensional que se pasa como paraacutemetro Se pasan comoparaacutemetros fila columna y direccioacuten La fila y la columna determinanel nuacutemero que marcaraacute las dos posibles diagonales dentro del array Ladireccioacuten es una cadena de caracteres que puede ser ldquonoserdquo o ldquonesordquo Lacadena ldquonoserdquo indica que se elige la diagonal que va del noroeste haciael sureste mientras que la cadena ldquonesordquo indica que se elige la diagonalque va del noreste hacia el suroeste

9 Programacioacuten orientada a objetos

91 Clases y objetos

La programacioacuten orientada a objetos es un paradigma de programacioacuten que se basacomo su nombre indica en la utilizacioacuten de objetos Estos objetos tambieacuten se suelenllamar instanciasUn objeto en teacuterminos de POO no se diferencia mucho de lo que conocemos comoun objeto en la vida real Pensemos por ejemplo en un coche Nuestro coche seriacuteaun objeto concreto de la vida real igual que el coche del vecino o el coche de uncompantildeero de trabajo o un deportivo que vimos por la calle el fin de semana pasadohellipTodos esos coches son objetos concretos que podemos ver y tocarTanto mi coche como el coche del vecino tienen algo en comuacuten ambos son cochesEn este caso mi coche y el coche del vecino seriacutean instancias (objetos) y coche (asecas) seriacutea una clase La palabra coche define algo geneacuterico es una abstraccioacutenno es un coche concreto sino que hace referencia a unos elementos que tienen unaserie de propiedades como matriacutecula marca modelo color etc este conjunto depropiedades se denominan atributos o variables de instancia

ClaseConcepto abstracto que denota una serie de cualidades por ejemplo cocheInstanciaObjeto palpable que se deriva de la concrecioacuten de una clase por ejemplo micocheAtributosConjunto de caracteriacutesticas que comparten los objetos de una clase porejemplo para la clase coche tendriacuteamos matriacutecula marca modelo color ynuacutemero de plazas

En Java los nombres de las clases se escriben con la primera letra en mayuacutesculamientras que los nombres de las instancias comienzan con una letra en minuacutesculaPor ejemplo la clase coche se escribe en Java como Coche y el objeto ldquomi cocherdquo sepodriacutea escribir como miCocheDefiniremos cada clase en un fichero con el mismo nombre maacutes la extensioacuten java portanto la definicioacuten de la clase Coche debe estar contenida en un fichero con nombreCochejava

Vamos a definir a continuacioacuten la clase Libro con los atributos isbn autor titulo ynumeroPaginas

95

Programacioacuten orientada a objetos 96

Librojava Definicioacuten de la clase Libro author Luis Joseacute Saacutenchez

public class Libro

atributosString isbn

String titulo

String autor

int numeroPaginas

A continuacioacuten creamos varios objetos de esta clase

PruebaLibrojava Programa que prueba la clase Libro author Luis Joseacute Saacutenchez

public class PruebaLibro

public static void main(String[] args)

Libro lib = new Libro()

Libro miLibrito = new Libro()

Libro quijote = new Libro()

Hemos creado tres instancias de la clase libro lib miLibrito y quijote Ya sabemos definiruna clase indicando sus atributos y crear instancias

Las variables de instancia (atributos) determinan las cualidades de losobjetos

92 Encapsulamiento y ocultacioacuten

Uno de los pilares en los que se basa la Programacioacuten Orientada a Objetos es elencapsulamiento Baacutesicamente el encapsulamiento consiste en definir todas las

Programacioacuten orientada a objetos 97

propiedades y el comportamiento de una clase dentro de esa clase es decir en laclase Coche estaraacute definido todo lo concerniente a la clase Coche y en la clase Libro

estaraacute definido todo lo que tenga que ver con la clase LibroEl encapsulamiento parece algo obvio casi de perogrullo pero hay que tenerlosiempre muy presente al programar utilizando clases y objetos En alguna ocasioacutenpuede que estemos tentados a mezclar parte de una clase con otra clase distintapara resolver un problema puntual No hay que caer en esa trampa Se deben escribirlos programas de forma que cada cosa esteacute en su sitio Sobre todo al principiocuando definimos nuestras primeras clases debemos estar pendientes de que todoestaacute definido donde correspondeLa ocultacioacuten es una teacutecnica que incorporan algunos lenguajes (entre ellos Java) quepermite esconder los elementos que definen una clase de tal forma que desde otraclase distinta no se pueden ldquover las tripasrdquo de la primera La ocultacioacuten facilita comoveremos maacutes adelante el encapsulamiento

93 Meacutetodos

Un coche arranca para se aparca hace sonar el claxon se puede llevar a repararhellipUn gato puede comer dormir maullar ronronearhellipLas acciones asociadas a una clase se llaman meacutetodos Estos meacutetodos se definendentro del cuerpo de la clase y se suelen colocar a continuacioacuten de los atributos

Los meacutetodos determinan el comportamiento de los objetos

931 Creiacute haber visto un lindo gatito

Vamos a crear la clase GatoSimple La llamamos asiacute porque maacutes adelante crearemos otraclase algo maacutes elaborada que se llamaraacute Gato Para saber queacute atributos debe tener estaclase hay que preguntarse queacute caracteriacutesticas tienen los gatos Todos los gatos son deun color determinado pertenecen a una raza tienen una edad tienen un determinadosexo - son machos o hembras - y tienen un peso que se puede expresar en kilogramosEacutestos seraacuten por tanto los atributos que tendraacute la clase GatoSimplePara saber queacute metodos debemos implementar hay que preguntarse queacute accionesestaacuten asociadas a los gatos Bien pues los gatos maullan ronronean comen y si sonmachos se pelean entre ellos para disputarse el favor de las hembras Esos seraacuten losmeacutetodos que definamos en la clase

Programacioacuten orientada a objetos 98

GatoSimplejava Definicioacuten de la clase GatoSimple author Luis Joseacute Saacutenchez

public class GatoSimple

atributos

String color raza sexo

int edad

double peso

meacutetodos

constructorGatoSimple (String s)

thissexo = s

getterString getSexo()

return thissexo

Hace que el gato maulle

void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute

Programacioacuten orientada a objetos 99

param comida la comida que se le ofrece al gato

void come(String comida)

if (comidaequals(pescado))

Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Pone a pelear dos gatos Solo se van a pelear dos machos entre siacute param contrincante es el gato contra el que pelear

void peleaCon(GatoSimple contrincante)

if (thissexoequals(hembra))

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo()equals(hembra))

Systemoutprintln(no peleo contra gatitas)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

ConstructorEl meacutetodo constructor tiene siempre el mismo nombre que la clase y se utilizanormalmente para inicializar los atributos

Los atributos de la clase GatoSimple - color raza sexo edad y peso - se declaran igual quelas variables que hemos venido usando hasta ahora pero hay una gran diferenciaentre estos atributos y las variables que aparecen en el main (programa principal) Unavariable definida en el cuerpo del programa principal es uacutenica sin embargo cada unode los objetos que se crean en el programa principal tienen sus propios atributos esdecir si en el programa principal se crean 20 objetos de la clase GatoSimple cada unotiene sus valores para los atributos color raza etcFiacutejate en la cabecera del meacutetodo peleaCon

Programacioacuten orientada a objetos 100

void peleaCon(GatoSimple contrincante)

Como puedes comprobar es posible pasar un objeto como paraacutemetro A continuacioacutense muestra un programa que prueba la clase GatoSimple Te recomiendo seguir elprograma liacutenea a liacutenea y observar atentamente la salida que produce

PruebaGatoSimplejava Programa que prueba la clase GatoSimple author Luis Joseacute Saacutenchez

public class PruebaGatoSimple

public static void main(String[] args)

GatoSimple garfield = new GatoSimple(macho)

Systemoutprintln(hola gatito)

garfieldmaulla()

Systemoutprintln(toma tarta)

garfieldcome(tarta selva negra)

Systemoutprintln(toma pescado a ver si esto te gusta)

garfieldcome(pescado)

GatoSimple tom = new GatoSimple(macho)

Systemoutprintln(Tom toma sopita de verduras)

tomcome(sopa de verduras)

GatoSimple lisa = new GatoSimple(hembra)

Systemoutprintln(gatitos a ver coacutemo maullaacuteis)

garfieldmaulla()

tommaulla()

lisamaulla()

garfieldpeleaCon(lisa)

lisapeleaCon(tom)

tompeleaCon(garfield)

Observa coacutemo al crear una instancia se llama al constructor que como deciacuteamos antestiene el mismo nombre de la clase y sirve para inicializar los atributos En este casose inicializa el atributo sexo Maacutes adelante veremos constructores que inicializan variosatributos e incluso definiremos distintos constructores en la misma clase

Programacioacuten orientada a objetos 101

GatoSimple garfield = new GatoSimple(macho)

Como puedes ver hay meacutetodos que no toman ninguacuten paraacutemetro

garfieldmaulla()

Y hay otros meacutetodos que deben tomar paraacutemetros obligatoriamente

garfieldcome(tarta selva negra)

932 Meacutetodos getter y setter

Vamos a crear la clase Cubo Para saber queacute atributos se deben definir nos preguntamosqueacute caracteriacutesticas tienen los cubos - igual que hicimos con la clase GatoSimple Todos loscubos tienen una determinada capacidad un color estaacuten hechos de un determinadomaterial - plaacutestico latoacuten etc - y puede que tengan asa o puede que no Un cubo sefabrica con el propoacutesito de contener liacutequido por tanto otra caracteriacutestica es la cantidadde litros de liacutequido que contiene en un momento determinado Por ahora solo nosinteresa saber la capacidad maacutexima y los litros que contiene el cubo en cada momentoasiacute que esos seraacuten los atributos que tendremos en cuenta

Cubojava Definicioacuten de la clase Cubo author Luis Joseacute Saacutenchez

public class Cubo

atributos

int capacidad capacidad maacutexima en litrosint contenido contenido actual en litros

meacutetodos

constructorCubo (int c)

thiscapacidad = c

meacutetodos getterint getCapacidad()

return thiscapacidad

Programacioacuten orientada a objetos 102

int getContenido()

return thiscontenido

meacutetodo settervoid setContenido(int litros)

thiscontenido = litros

otros meacutetodosvoid vacia()

thiscontenido = 0

Llena el cubo al maacuteximo de su capacidad

void llena()

thiscontenido = thiscapacidad

Pinta el cubo en la pantalla Se muestran los bordes del cubo con el caraacutecter y el agua que contiene con el caraacutecter ~

void pinta()

for (int nivel = thiscapacidad nivel gt 0 nivel--)

if (thiscontenido gt= nivel)

Systemoutprintln(~~~~)

else

Systemoutprintln( )

Systemoutprintln()

Vuelca el contenido de un cubo sobre otro Antes de echar el agua se comprueba cuaacutento le cabe al cubo destino

void vuelcaEn(Cubo destino)

Programacioacuten orientada a objetos 103

int libres = destinogetCapacidad() - destinogetContenido()

if (libres gt 0)

if (thiscontenido lt= libres)

destinosetContenido(destinogetContenido() + thiscontenido)thisvacia()

else

thiscontenido -= libres

destinollena()

Observa estos meacutetodos extraiacutedos de la clase Cubo

int getCapacidad()

return thiscapacidad

int getContenido()

return thiscontenido

Se trata de meacutetodos muy simples su cometido es devolver el valor de un atributoPodriacutean tener cualquier nombre pero en Java es costumbre llamarlos con la palabraget (obtener) seguida del nombre del atributoFijeacutemonos ahora este otro meacutetodo

void setContenido(int litros)

thiscontenido = litros

Ahora estamos ante un setter Este tipo de meacutetodos tiene el cometido de establecerun valor para un determinado atributo Como puedes ver setContenido estaacute formadapor set (asignar) maacutes el nombre del atributoPodriacuteas preguntarte iquestpor queacute se crea un meacutetodo getter para extraer el valor de unavariable y no se accede a la variable directamenteParece maacutes loacutegico hacer esto

Systemoutprint(miCubocapacidad)

que esto otro

Programacioacuten orientada a objetos 104

Systemoutprint(miCubogetCapacidad())

Sin embargo en Java se opta casi siempre por esta uacuteltima opcioacuten Tiene su explicacioacuteny lo entenderaacutes bien cuando estudies el apartado Aacutembitovisibilidad de los elementosde una clase - public protected y privateProbamos con el siguiente ejemplo la clase Cubo que acabamos de definir Crea tuspropios cubos pasa agua de unos a otros y observa lo que se muestra por pantalla

PruebaCubojava Programa que prueba la clase Cubo author Luis Joseacute Saacutenchez

public class PruebaCubo

public static void main(String[] args)

Cubo cubito = new Cubo(2)

Cubo cubote = new Cubo(7)

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

Systemoutprintln(nLleno el cubito n)

cubitollena()

cubitopinta()

Systemoutprintln(nEl cubote sigue vaciacuteo n)

cubotepinta()

Systemoutprintln(nAhora vuelco lo que tiene el cubito en el cuboten)

cubitovuelcaEn(cubote)

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

Systemoutprintln(nAhora vuelco lo que tiene el cubote en el cubiton)

cubotevuelcaEn(cubito)

Programacioacuten orientada a objetos 105

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

933 Meacutetodo toString

La definicioacuten de la clase Cubo del apartado anterior contiene el meacutetodo pinta que comosu nombre indica permite pintar en pantalla un objeto de esa clase Se podriacutea definirel meacutetodo ficha para mostrar informacioacuten sobre objetos de la clase Alumno por ejemploTambieacuten seriacutea posible implementar el meacutetodo imprime dentro de la clase Libro con elpropoacutesito de mostrar por pantalla los datos de un libro Todos estos meacutetodos - pintaficha e imprime - hacen baacutesicamente lo mismoEn Java existe una solucioacuten muy elegante para mostrar informacioacuten sobre un objetopor pantalla Si se quiere mostrar el contenido de la variable entera x se utilizaSystemoutprint(x) y si se quiere mostrar el valor de la variable de tipo cadena decaracteres nombre se escribe Systemoutprint(nombre) De la misma manera si se quieremostrar el objeto miPiramide que pertenece a la clase Piramide tambieacuten se podriacutea usarSystemoutprint(miPiramide) Java sabe perfectamente coacutemo mostrar nuacutemeros y cadenasde caracteres pero no sabe a priori coacutemo se pintan piraacutemides Para indicar a Java coacutemodebe pintar un objeto de la clase Piramide basta con implementar el meacutetodo toString

dentro de la claseVeamos un ejemplo muy sencillo de implementacioacuten de toString Definiremos la claseCuadrado con el atributo lado el constructor y el meacutetodo toString

Cuadradojava Definicioacuten de la clase Cuadrado author Luis Joseacute Saacutenchez

public class Cuadrado

int lado

public Cuadrado(int l)

thislado = l

public String toString()

Programacioacuten orientada a objetos 106

int i espacios

String resultado =

for (i = 0 i lt thislado i++)

resultado +=

resultado += n

for (i = 1 i lt thislado - 1 i++)

resultado +=

for (espacios = 1 espacios lt thislado - 1 espacios++)

resultado +=

resultado += n

for (i = 0 i lt thislado i++)

resultado +=

resultado += n

return resultado

Observa que el meacutetodo toString() devuelve una cadena de caracteres Esa cadena esprecisamente la que mostraraacute por pantalla Systemoutprint() En el programa que semuestra a continuacioacuten y que prueba la clase Cuadrado puedes comprobar que se pintaun cuadrado igual que si se tratara de cualquier otra variable

PruebaCuadradojava Programa que prueba la clase Cuadrado author Luis Joseacute Saacutenchez

public class PruebaCuadrado

public static void main(String[] args)

Cuadrado miCuadradito = new Cuadrado(5)

Systemoutprintln(miCuadradito)

Programacioacuten orientada a objetos 107

94 Aacutembitovisibilidad de los elementos de una clase - publicprotected y private

Al definir los elementos de una clase se pueden especificar sus aacutembitos (scope) devisibilidad o accesibilidad Un elemento public (puacuteblico) es visible desde cualquierclase un elemento protected (protegido) es visible desde la clase actual y desde todassus subclases y finalmente un elemento private (privado) uacutenicamente es visible dentrode la clase actualEn el siguiente apartado veremos queacute son las subclases De momento fiacutejate en elaacutembito del atributo y de los meacutetodos en la definicioacuten de la clase Animal

Animaljava Definicioacuten de la clase Animal author Luis Joseacute Saacutenchez

public abstract class Animal

private Sexo sexo

public Animal ()

sexo = SexoMACHO

public Animal (Sexo s)

sexo = s

public Sexo getSexo()

return sexo

public String toString()

return Sexo + thissexo + n

Hace que el animal se eche a dormir

public void duerme()

Systemoutprintln(Zzzzzzz)

Programacioacuten orientada a objetos 108

Fiacutejate que el atributo sexo se ha definido como private

private Sexo sexo

Eso quiere decir que a ese atributo uacutenicamente se tiene acceso dentro de la claseAnimal Sin embargo todos los meacutetodos se han definido public lo que significa quese podraacuten utilizar desde cualquier otro programa por ejemplo como veremos maacutesadelante desde el programa PurebaAnimaljava

Salvo casos puntuales se seguiraacute la regla de declarar private las variables deinstancia y public los meacutetodos

El sexo de un animal solo puede ser macho hembra o hermafrodita Una forma dedelimitar los valores que puede tomar un atributo es definir un tipo enumerado

Tipo enumeradoMediante enum se puede definir un tipo enumerado de esta forma un atributosolo podraacute tener uno de los posibles valores que se dan como opcioacuten Losvalores que se especifican en el tipo enumerado se suelen escribir con todaslas letras en mayuacutescula

Sexojava Definicioacuten del tipo enumerado Sexo author Luis Joseacute Saacutenchez

public enum Sexo

MACHO HEMBRA HERMAFRODITA

95 Herencia

La herencia es una de las caracteriacutesticas maacutes importantes de la POO Si definimosuna serie de atributos y meacutetodos para una clase al crear una subclase todos estosatributos y meacutetodos siguen siendo vaacutelidosEn el apartado anterior se define la clase Animal Uno de los meacutetodos de esta clase esduerme A continuacioacuten podemos crear las clases Gato y Perro como subclases de AnimalDe forma automaacutetica se puede utilizar el meacutetodo duerme con las instancias de las clasesGato y Perro iquestno es fantaacutestico

Programacioacuten orientada a objetos 109

La clase Ave es subclase de Animal y la clase Pinguino a su vez seriacutea subclase de Ave ypor tanto hereda todos sus atributos y meacutetodos

Clase abstracta (abstract)Una clase abstracta es aquella que no va a tener instancias de forma directaaunque siacute habraacute instancias de las subclases (siempre que esas subclasesno sean tambieacuten abstractas) Por ejemplo si se define la clase Animal comoabstracta no se podraacuten crear objetos de la clase Animal es decir no se podraacutehacer Animal mascota = new Animal() pero siacute se podraacuten crear instancias de la claseGato Ave o Pinguino que son subclases de Animal

Para crear en Java una subclase de otra clase existente se utiliza la palabra reservadaextends A continuacioacuten se muestra el coacutedigo de las clases Gato Ave y Pinguino asiacutecomo el programa que prueba estas clases creando instancias y aplicaacutendoles meacutetodosRecuerda que la definicioacuten de la clase Animal se muestra en el apartado anterior

Gatojava Definicioacuten de la clase Gato author Luis Joseacute Saacutenchez

public class Gato extends Animal

private String raza

public Gato (Sexo s String r)

super(s)raza = r

public Gato (Sexo s)

super(s)raza = siameacutes

public Gato (String r)

super(SexoHEMBRA)raza = r

public Gato ()

super(SexoHEMBRA)

Programacioacuten orientada a objetos 110

raza = siameacutes

public String toString()

return supertoString()+ Raza + thisraza+ nn

Hace que el gato maulle

public void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

public void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al gato

public void come(String comida)

if (comidaequals(pescado))

Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Pone a pelear dos gatos Solo se van a pelear dos machos entre siacute param contrincante es el gato contra el que pelear

public void peleaCon(Gato contrincante)

Programacioacuten orientada a objetos 111

if (thisgetSexo() == SexoHEMBRA)

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo() == SexoHEMBRA)

Systemoutprintln(no peleo contra gatitas)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

Observa que se definen nada menos que cuatro constructores en la clase Gato Desdeel programa principal se dilucida cuaacutel de ellos se utiliza en funcioacuten del nuacutemero y tipode paraacutemetros que se pasa al meacutetodo Por ejemplo si desde el programa principal secrea un gato de esta forma

Gato gati = new Gato()

entonces se llamariacutea al constructor definido como

public Gato ()

super(SexoHEMBRA)raza = siameacutes

Por tanto gati seriacutea una gata de raza siameacutes Si por el contrario creamos gati de estaotra manera desde el programa principal

Gato gati = new Gato(SexoMACHO siberiano)

se llamariacutea al siguiente constructor

public Gato (Sexo s String r)

super(s)raza = r

y gati seriacutea en este caso un gato macho de raza siberianoEl meacutetodo super() hace una llamada al meacutetodo equivalente de la superclase Fiacutejate quese utiliza tanto en el constructor como en el meacutetodo toString() Por ejemplo al llamara super() dentro del meacutetodo toString() se estaacute llamando al toString() que hay definidoen la clase Animal justo un nivel por encima de Gato en la jerarquiacutea de clasesA continuacioacuten tenemos la definicioacuten de la clase Ave que es una subclase de Animal

Programacioacuten orientada a objetos 112

Avejava Definicioacuten de la clase Ave author Luis Joseacute Saacutenchez

public class Ave extends Animal

public Ave(Sexo s)

super(s)

public Ave()

super()

Hace que el ave se limpie

public void aseate()

Systemoutprintln(Me estoy limpiando las plumas)

Hace que el ave levante el vuelo

public void vuela()

Systemoutprintln(Estoy volando)

951 Sobrecarga de meacutetodos

Un meacutetodo se puede redefinir (volver a definir con el mismo nombre) en una subclasePor ejemplo el meacutetodo vuela que estaacute definido en la clase Ave se vuelve a definir enla clase Pinguino En estos casos indicaremos nuestra intencioacuten de sobreescribir unmeacutetodo mediante la etiqueta OverrideSi no escribimos esta etiqueta la sobreescritura del meacutetodo se realizaraacute de todasformas ya que Override indica simplemente una intencioacuten Ahora imagina que quieressobreescribir el meacutetodo come de Animal declarando un come especiacutefico para los gatos enla clase Gato Si escribes Override y luego te equivocas en el nombre del meacutetodo yescribes comer entonces el compilador diriacutea algo como ldquoiexclCuidado algo no estaacute bienme has dicho que ibas a sobreescribir un meacutetodo de la superclase y sin embargo comer

no estaacute definidordquoA continuacioacuten tienes la definicioacuten de la clase Pinguino

Programacioacuten orientada a objetos 113

Pinguinojava Definicioacuten de la clase Pinguino author Luis Joseacute Saacutenchez

public class Pinguino extends Ave

public Pinguino()

super()

public Pinguino(Sexo s)

super(s)

El pinguumlino se siente triste porque no puede volar

Override

public void vuela()

Systemoutprintln(No puedo volar)

Con el siguiente programa se prueba la clase Animal y todas las subclases que derivande ella Observa cada liacutenea y comprueba queacute hace el programa

PruebaAnimaljava Programa que prueba la clase Animal y sus subclases author Luis Joseacute Saacutenchez

public class PruebaAnimal

public static void main(String[] args)

Gato garfield = new Gato(SexoMACHO romano)

Gato tom = new Gato(SexoMACHO)

Gato lisa = new Gato(SexoHEMBRA)

Gato silvestre = new Gato()

Systemoutprintln(garfield)

Systemoutprintln(tom)

Systemoutprintln(lisa)

Programacioacuten orientada a objetos 114

Systemoutprintln(silvestre)

Ave miLoro = new Ave()

miLoroaseate()

miLorovuela()

Pinguino pingu = new Pinguino(SexoHEMBRA)

pinguaseate()

pinguvuela()

En el ejemplo anterior los objetos miLoro y pingu actuacutean de manera polimoacuterfica porquea ambos se les aplican los meacutetodos aseate y vuela

PolimorfismoEn Programacioacuten Orientada a Objetos se llama polimorfismo a la capacidadque tienen los objetos de distinto tipo (de distintas clases) de responder almismo meacutetodo

96 Atributos y meacutetodos de clase (static)

Hasta el momento hemos definido atributos de instancia como raza sexo o color ymeacutetodos de instancia como maulla come o vuela De tal modo que si en el programa secrean 20 gatos cada uno de ellos tiene su propia raza y puede haber potencialmente20 razas diferentes Tambieacuten podriacutea aplicar el meacutetodo maulla a todos y cada uno deesos 20 gatosNo obstante en determinadas ocasiones nos puede interesar tener atributos de clase(variables de clase) y meacutetodos de clase Cuando se define una variable de clase soloexiste una copia del atributo para toda la clase y no una para cada objeto Esto es uacutetilcuando se quiere llevar la cuenta global de alguacuten paraacutemetro Los meacutetodos de clase seaplican a la clase y no a instancias concretasA continuacioacuten se muestra un ejemplo que contiene la variable de clase kilometra-

jeTotal Si bien cada coche tiene un atributo kilometraje donde se van acumulando loskiloacutemetros que va recorriendo en la variable de clase kilometrajeTotal se lleva la cuentade los kiloacutemetros que han recorrido todos los coches que se han creadoTambieacuten se crea un meacutetodo de clase llamado getKilometrajeTotal que simplemente esun getter para la variable de clase kilometrajeTotal

Programacioacuten orientada a objetos 115

Cochejava Definicioacuten de la clase Coche author Luis Joseacute Saacutenchez

public class Coche

atributo de claseprivate static int kilometrajeTotal = 0

meacutetodo de clasepublic static int getKilometrajeTotal()

return kilometrajeTotal

private String marca

private String modelo

private int kilometraje

public Coche(String ma String mo)

marca = ma

modelo = mo

kilometraje = 0

public int getKilometraje()

return kilometraje

Recorre una determinada distancia param km distancia a recorrer en kiloacutemetros

public void recorre(int km)

kilometraje += km

kilometrajeTotal += km

Como ya hemos comentado el atributo kilometrajeTotal almacena el nuacutemero total dekiloacutemetros que recorren todos los objetos de la clase Coche es un uacutenico valor por esose declara como static Por el contrario el atributo kilometraje almacena los kiloacutemetrosrecorridos por un objeto concreto y tendraacute un valor distinto para cada uno de ellos

Programacioacuten orientada a objetos 116

Si en el programa principal se crean 20 objetos de la clase Coche cada uno tendraacute supropio kilometrajeA continuacioacuten se muestra el programa que prueba la clase Coche

PruebaCochejava Programa que prueba la clase Coche author Luis Joseacute Saacutenchez

public class PruebaCoche

public static void main(String[] args)

Coche cocheDeLuis = new Coche(Saab 93)

Coche cocheDeJuan = new Coche(Toyota Avensis)

cocheDeLuisrecorre(30)

cocheDeLuisrecorre(40)

cocheDeLuisrecorre(220)

cocheDeJuanrecorre(60)

cocheDeJuanrecorre(150)

cocheDeJuanrecorre(90)

Systemoutprintln(El coche de Luis ha recorrido + cocheDeLuisgetKilometraje() +

Km)

Systemoutprintln(El coche de Juan ha recorrido + cocheDeJuangetKilometraje() +

Km)

Systemoutprintln(El kilometraje total ha sido de + CochegetKilometrajeTotal() +

Km)

El meacutetodo getKilometrajeTotal() se aplica a la clase Coche por tratarse de un meacutetodo declase (meacutetodo static) Este meacutetodo no se podriacutea aplicar a una instancia de la mismamanera que un meacutetodo que no sea static no se puede aplicar a la clase sino a losobjetos

97 Interfaces

Una interfaz contiene uacutenicamente la cabecera de una serie de meacutetodos (opcional-mente tambieacuten puede contener constantes) Por tanto se encarga de especificar uncomportamiento que luego tendraacute que ser implementado La interfaz no especificael ldquocoacutemordquo ya que no contiene el cuerpo de los meacutetodos solo el ldquoqueacuterdquoUna interfaz puede ser uacutetil en determinadas circunstancias En principio separala definicioacuten de la implementacioacuten o como deciacuteamos antes el ldquoqueacuterdquo del ldquocoacutemordquo

Programacioacuten orientada a objetos 117

Tendremos entonces la menos dos ficheros la interfaz y la clase que implementaesa interfaz Se puede dar el caso que un programador escriba la interfaz y luegose la pase a otro programador para que sea eacuteste uacuteltimo quien la implementeHay que destacar que cada interfaz puede tener varias implementaciones asociadasPara ilustrar el uso de interfaces utilizaremos algunas clases ya conocidas La super-clase que va a estar por encima de todas las demaacutes seraacute la clase Animal vista conanterioridad El coacutedigo de esta clase no variacutea por lo tanto no lo vamos a reproduciraquiacute de nuevoDefinimos la interfaz Mascota

Mascotajava Definicioacuten de la interfaz Mascota author Luis Joseacute Saacutenchez

public interface Mascota

String getCodigo()

void hazRuido()

void come(String comida)

void peleaCon(Animal contrincante)

Como puedes ver uacutenicamente se escriben las cabeceras de los meacutetodos que debetener las clases que implementen la interfaz MascotaUna de las implementaciones de Mascota seraacute Gato

Gatojava Definicioacuten de la clase Gato author Luis Joseacute Saacutenchez

public class Gato extends Animal implements Mascota

private String codigo

public Gato (Sexo s String c)

super(s)thiscodigo = c

Override

Programacioacuten orientada a objetos 118

public String getCodigo()

return thiscodigo

Hace que el gato emita sonidos

Override

public void hazRuido()

thismaulla()thisronronea()

Hace que el gato maulle

public void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

public void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al gato

Override

public void come(String comida)

if (comidaequals(pescado))

supercome()Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Programacioacuten orientada a objetos 119

Pone a pelear al gato contra otro animal Solo se van a pelear dos machos entre siacute param contrincante es el animal contra el que pelear

Override

public void peleaCon(Animal contrincante)

if (thisgetSexo() == SexoHEMBRA)

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo() == SexoHEMBRA)

Systemoutprintln(no peleo contra hembras)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

Mediante la siguiente liacutenea

public class Gato extends Animal implements Mascota

estamos diciendo que Gato es una subclase de Animal y que ademaacutes es una im-plementacioacuten de la interfaz Mascota Fiacutejate que no es lo mismo la herencia que laimplementacioacutenObserva que los meacutetodos que se indicaban en Mascota uacutenicamente con la cabeceraahora estaacuten implementados completamente en Gato Ademaacutes Gato contiene otrosmeacutetodos que no se indicaban en Mascota como maulla y ronroneaLos meacutetodos de Gato que implementan meacutetodos especificados en Mascota deben tenerla anotacioacuten OverrideComo dijimos anteriormente una interfaz puede tener varias implementaciones Acontinuacioacuten se muestra Perro otra implementacioacuten de Mascota

Programacioacuten orientada a objetos 120

Perrojava Definicioacuten de la clase Perro author Luis Joseacute Saacutenchez

public class Perro extends Animal implements Mascota

private String codigo

public Perro (Sexo s String c)

super(s)thiscodigo = c

Override

public String getCodigo()

return thiscodigo

Hace que el Perro emita sonidos

Override

public void hazRuido()

thisladra()

Hace que el Perro ladre

public void ladra()

Systemoutprintln(Guau guau)

Hace que el Perro coma A los Perros les gusta la carne si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al Perro

Override

public void come(String comida)

if (comidaequals(carne))

Programacioacuten orientada a objetos 121

supercome()Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como carne)

Pone a pelear el perro contra otro animal Solo se van a pelear si los dos son perros param contrincante es el animal contra el que pelear

Override

public void peleaCon(Animal contrincante)

if (contrincantegetClass()getSimpleName()equals(Perro))

Systemoutprintln(ven aquiacute que te vas a enterar)

else

Systemoutprintln(no me gusta pelear)

Por uacuteltimo mostramos el programa que prueba Mascota y sus implementaciones Gato yPerro

PruebaMascotajava Programa que prueba la interfaz Mascota author Luis Joseacute Saacutenchez

public class PruebaMascota

public static void main(String[] args)

Mascota garfield = new Gato(SexoMACHO 34569)

Mascota lisa = new Gato(SexoHEMBRA 96059)

Mascota kuki = new Perro(SexoHEMBRA 234678)

Mascota ayo = new Perro(SexoMACHO 778950)

Systemoutprintln(garfieldgetCodigo())

Systemoutprintln(lisagetCodigo())

Systemoutprintln(kukigetCodigo())

Systemoutprintln(ayogetCodigo())

garfieldcome(pescado)

Programacioacuten orientada a objetos 122

lisacome(hamburguesa)

kukicome(pescado)

lisapeleaCon((Gato)garfield)

ayopeleaCon((Perro)kuki)

Observa que para crear una mascota que es un gato escribimos lo siguiente

Mascota garfield = new Gato(SexoMACHO 34569)

Una interfaz no se puede instanciar por tanto la siguiente liacutenea seriacutea incorrecta

Mascota garfield = new Mascota(SexoMACHO 34569)

InterfacesLa interfaz indica ldquoqueacuterdquo hay que hacer y la implementacioacuten especifica ldquocoacutemordquose haceUna interfaz puede tener varias implementacionesUna interfaz no se puede instanciarLa implementacioacuten puede contener meacutetodos adicionales cuyas cabeceras noestaacuten en su interfaz

98 Arrays de objetos

Del mismo modo que se pueden crear arrays de nuacutemeros enteros decimales o cadenasde caracteres tambieacuten es posible crear arrays de objetosVamos a definir la clase Alumnopara luego crear un array de objetos de esta clase

Alumnojava Definicioacuten de la clase Alumno author Luis Joseacute Saacutenchez

public class Alumno

private String nombre

private double notaMedia = 00

public String getNombre()

Programacioacuten orientada a objetos 123

return nombre

public void setNombre(String nombre)

thisnombre = nombre

public double getNotaMedia()

return notaMedia

public void setNotaMedia(double notaMedia)

thisnotaMedia = notaMedia

A continuacioacuten se define un array de cinco alumnos que posteriormente se rellena Poruacuteltimo se muestran los datos de los alumnos por pantallaObserva que la siguiente liacutenea uacutenicamente define la estructura del array pero no crealos objetos

Alumno[] alum = new Alumno[5]

Cada objeto concreto se crea de forma individual mediante

alum[i] = new Alumno()

Aquiacute tienes el ejemplo completo

ArrayDeAlumnosPrincipaljava Programa que prueba un array de la clase Alumno author Luis Joseacute Saacutenchez

public class ArrayDeAlumnosPrincipal

public static void main(String[] args)

Define la estructura un array de 5 alumnos pero no crea los objetosAlumno[] alum = new Alumno[5]

Pide los datos de los alumnos

Programacioacuten orientada a objetos 124

Systemoutprintln(A continuacion debera introducir el nombre y la nota media de 5 al

umnos)

String nombreIntroducido

double notaIntroducida

for(int i = 0 i lt 5 i++)

alum[i] = new Alumno()

Systemoutprintln(Alumno + i)

Systemoutprint(Nombre )

nombreIntroducido = Systemconsole()readLine()

(alum[i])setNombre(nombreIntroducido)

Systemoutprint(Nota media )

notaIntroducida = DoubleparseDouble(Systemconsole()readLine())

alum[i]setNotaMedia(notaIntroducida)

for i

Muestra los datos de los alumnos

Systemoutprintln(Los datos introducidos son los siguientes)

double sumaDeMedias = 0

for(int i = 0 i lt 5 i++)

Systemoutprintln(Alumno + i)

Systemoutprintln(Nombre + alum[i]getNombre())

Systemoutprintln(Nota media + alum[i]getNotaMedia())

Systemoutprintln(----------------------------)

sumaDeMedias += alum[i]getNotaMedia()

for i

Systemoutprintln(La media global de la clase es + sumaDeMedias 5)

Veamos ahora un ejemplo algo maacutes complejo Se trata de una gestioacuten tiacutepica - altabaja listado y modificacioacuten - de una coleccioacuten de discos Este tipo de programas sesuele denominar CRUD (Create Read Update Delete)Primero se define la clase Disco

Programacioacuten orientada a objetos 125

Discojava Definicioacuten de la clase Disco author Luis Joseacute Saacutenchez

public class Disco

private String codigo = LIBRE

private String autor

private String titulo

private String genero

private int duracion duracioacuten total en minutos

public String getCodigo()

return codigo

public void setCodigo(String codigo)

thiscodigo = codigo

public String getAutor()

return autor

public void setAutor(String autor)

thisautor = autor

public String getGenero()

return genero

public void setGenero(String genero)

thisgenero = genero

public String getTitulo()

return titulo

public void setTitulo(String titulo)

thistitulo = titulo

Programacioacuten orientada a objetos 126

public int getDuracion()

return duracion

public void setDuracion(int duracion)

thisduracion = duracion

public String toString()

String cadena = n------------------------------------------

cadena += nCoacutedigo + thiscodigocadena += nAutor + thisautorcadena += nTiacutetulo + thistitulocadena += nGeacutenero + thisgenerocadena += nDuracioacuten + thisduracioncadena += n------------------------------------------

return cadena

A continuacioacuten se crea el programa principal Cada elemento de la coleccioacuten seraacuteun objeto de la clase Disco Se trata como veraacutes de una gestioacuten muy simple perototalmente funcionalNo se incluye en el manual porque ocupariacutea varias paacuteginas El coacutedigo del programa sepuede descargar desde el siguiente enlace httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos09_POOColeccionDeDiscosColeccionDeDiscosPrincipaljava

Programacioacuten orientada a objetos 127

99 Ejercicios

991 Conceptos de POO

Ejercicio 1iquestCuaacuteles seriacutean los atributos de la clase PilotoDeFormula1 iquestSe te ocurren algunasinstancias de esta clase

Ejercicio 2A continuacioacuten tienes una lista en la que estaacuten mezcladas varias clases coninstancias de esas clases Para ponerlo un poco maacutes difiacutecil todos los elementosestaacuten escritos en minuacutescula Di cuaacuteles son las clases cuaacuteles las instanciasa queacute clase pertenece cada una de estas instancias y cuaacutel es la jerarquiacuteaentre las clases paula goofy gardfiel perro mineral caballo tom silvestrepirita rocinante milu snoopy gato pluto animal javier bucefalo pegasoayudante_de_santa_claus cuarzo laika persona pato_lucas

Ejercicio 3iquestCuaacuteles seriacutean los atributos de la clase Vivienda iquestQueacute subclases se te ocurren

Ejercicio 4Piensa en la liga de baloncesto iquestqueacute 5 clases se te ocurren para representar5 elementos distintos que intervengan en la liga

Ejercicio 5Haz una lista con los atributos que podriacutea tener la clase caballo A continuacioacutenhaz una lista con los posibles meacutetodos (acciones asociadas a los caballos)

Ejercicio 6Lista los atributos de la clase Alumno iquestSeriacutea nombre uno de los atributos de laclase Razona tu respuesta

Ejercicio 7iquestCuaacuteles seriacutean los atributos de la clase Ventana (de ordenador) iquestcuaacuteles seriacuteanlos meacutetodos Piensa en las propiedades y en el comportamiento de unaventana de cualquier programa

Programacioacuten orientada a objetos 128

992 POO en Java

Ejercicio 1Implementa la clase Caballo vista en un ejercicio anterior Prueacutebala creandoinstancias y aplicaacutendole algunos meacutetodos

Ejercicio 2Crea la clase Vehiculo asiacute como las clases Bicicleta y Coche como subclases dela primera Para la clase Vehiculo crea los atributos de clase vehiculosCreadosykilometrosTotales asiacute como el atributo de instancia kilometrosRecorridos Creatambieacuten alguacuten meacutetodo especiacutefico para cada una de las subclases Prueba lasclases creadas mediante un programa con un menuacute como el que se muestraa continuacioacuten

VEHIacuteCULOS

=========

1 Anda con la bicicleta

2 Haz el caballito con la bicicleta

3 Anda con el coche

4 Quema rueda con el coche

5 Ver kilometraje de la bicicleta

6 Ver kilometraje del coche

7 Ver kilometraje total

8 Salir

Elige una opcioacuten (1-8)

Ejercicio 3Crea las clases Animal Mamifero Ave Gato Perro Canario Pinguino y Lagarto Creaal menos tres meacutetodos especiacuteficos de cada clase y redefne ellos meacutetodoscuando sea necesario Prueba las clases creadas en un programa en el que seinstancien objetos y se les apliquen meacutetodos

Ejercicio 4Crea la clase Fraccioacuten Los atributos seraacuten numerador y denominador Y algunos delos meacutetodos pueden ser invierte simplifica multiplica divide etc

Programacioacuten orientada a objetos 129

Ejercicio 5Crea la clase Pizza con los atributos y meacutetodos necesarios Sobre cada pizzase necesita saber el tamantildeo - mediana o familiar - el tipo - margarita cuatroquesos o funghi - y su estado - pedida o servida La clase debe almacenarinformacioacuten sobre el nuacutemero total de pizzas que se han pedido y que sehan servido Siempre que se crea una pizza nueva su estado es ldquopedidardquoEl siguiente coacutedigo del programa principal debe dar la salida que se muestra

public class PedidosPizza

public static void main(String[] args)

Pizza p1 = new Pizza(margarita mediana)

Pizza p2 = new Pizza(funghi familiar)

p2sirve()

Pizza p3 = new Pizza(cuatro quesos mediana)

Systemoutprintln(p1)

Systemoutprintln(p2)

Systemoutprintln(p3)

p2sirve()

Systemoutprintln(pedidas + PizzagetTotalPedidas())

Systemoutprintln(servidas + PizzagetTotalServidas())

pizza margarita mediana pedida

pizza funghi familiar servida

pizza cuatro quesos mediana pedida

esa pizza ya se ha servido

pedidas 3

servidas 1

Ejercicio 6Crea la clase Tiempo con los meacutetodos suma y resta Los objetos de la clase Tiempo

son intervalos de tiempo y se crean de la forma Tiempo t = new Tiempo(1 20

30) donde los paraacutemetros que se le pasan al constructor son las horas losminutos y los segundos respectivamente Crea el meacutetodo toString para ver losintervalos de tiempo de la forma 10h 35m 5s Si se suman por ejemplo 30m 40s y35m 20s el resultado deberiacutea ser 1h 6m 0s Realiza un programa de prueba paracomprobar que la clase funciona bien

Programacioacuten orientada a objetos 130

Ejercicio 7Queremos gestionar la venta de entradas (no numeradas) de ExpocochesCampanillas que tiene 3 zonas la sala principal con 1000 entradas dispo-nibles la zona de compra-venta con 200 entradas disponibles y la zona vipcon 25 entradas disponibles Hay que controlar que existen entradas antes devenderlasLa clase Zona con sus atributos y meacutetodos se muestra a continuacioacuten

Definicioacuten de la clase Zona author Luis Joseacute Saacutenchez

public class Zona

private int entradasPorVender

public Zona(int n)

entradasPorVender = n

public int getEntradasPorVender()

return entradasPorVender

Vende un nuacutemero de entradas ltpgt Comprueba si quedan entradas libres antes de realizar la venta param n nuacutemero de entradas a vender

public void vender(int n)

if (thisentradasPorVender == 0)

Systemoutprintln(Lo siento las entradas para esa zona estaacuten agotadas)

else if (thisentradasPorVender lt n)

Systemoutprintln(Soacutelo me quedan + thisentradasPorVender+ entradas para esa zona)

if (thisentradasPorVender gt= n)

entradasPorVender -= n

Systemoutprintln(Aquiacute tiene sus + n + entradas gracias)

El menuacute del programa debe ser el que se muestra a continuacioacuten Cuandoelegimos la opcioacuten 2 se nos debe preguntar para queacute zona queremos lasentradas y cuaacutentas queremos Loacutegicamente el programa debe controlar queno se puedan vender maacutes entradas de la cuenta

1 Mostrar nuacutemero de entradas libres

2 Vender entradas

3 Salir

Programacioacuten orientada a objetos 131

993 Arrays de objetos

Ejercicio 1Utiliza la clase Gato para crear un array de cuatro gatos e introduce los datosde cada uno de ellos mediante un bucle Muestra a continuacioacuten los datos detodos los gatos utilizando tambieacuten un bucle

Ejercicio 2Cambia el programa anterior de tal forma que los datos de los gatos se intro-duzcan directamente en el coacutedigo de la forma gatito[2]setColor(ldquomarroacutenrdquo) o bienmediante el constructor de la forma gatito[3] = new Gato(ldquoGarfieldrdquo ldquonaranjardquo

ldquomachordquo) Muestra a continuacioacuten los datos de todos los gatos utilizando unbucle

Ejercicio 3Realiza el programa ldquoColeccioacuten de discosrdquo por tu cuenta mirando lo menosposible el ejemplo que se proporciona Prueacutebalo primero para ver coacutemofunciona y luego intenta implementarlo tuacute mismo

Ejercicio 4Modifica el programa ldquoColeccioacuten de discosrdquo como se indica a continuacioacutena) Mejora la opcioacuten ldquoNuevo discordquo de tal forma que cuando se llenen todas lasposiciones del array el programa muestre un mensaje de error No se permitiraacuteintroducir los datos de ninguacuten disco hasta que no se borre alguno de la listab) Mejora la opcioacuten ldquoBorrarrdquo de tal forma que se verifique que el coacutedigointroducido por el usuario existec) Modifica el programa de tal forma que el coacutedigo del disco sea uacutenico es decirque no se pueda repetird) Crea un submenuacute dentro dentro de ldquoListadordquo de tal forma que exista unlistado completo un listado por autor (todos los discos que ha publicado undeterminado autor) un listado por geacutenero (todos los discos de un geacutenero de-terminado) y un listado de discos cuya duracioacuten esteacute en un rango determinadopor el usuario

Programacioacuten orientada a objetos 132

Ejercicio 5Crea el programa GESTISIMAL (GESTIoacuten SIMplificada de Almaceacuten) para llevarel control de los artiacuteculos de un almaceacuten De cada artiacuteculo se debe saberel coacutedigo la descripcioacuten el precio de compra el precio de venta y el stock(nuacutemero de unidades) El menuacute del programa debe tener al menos lassiguientes opciones

1 Listado

2 Alta

3 Baja

4 Modificacioacuten

5 Entrada de mercanciacutea

6 Salida de mercanciacutea

7 Salir

La entrada y salida de mercanciacutea supone respectivamente el incremento ydecremento de stock de un determinado artiacuteculo Hay que controlar que no sepueda sacar maacutes mercanciacutea de la que hay en el almaceacuten

10 Colecciones y diccionarios

101 Colecciones la clase ArrayList

Una coleccioacuten en Java es una estructura de datos que permite almacenar muchosvalores del mismo tipo por tanto conceptualmente es praacutecticamente igual que unarray Seguacuten el uso y seguacuten si se permiten o no repeticiones Java dispone de un ampliocataacutelogo de colecciones ArrayList (lista) ArrayBlockingQueue (cola) HashSet (conjunto)Stack (pila) etc En este manual estudiaremos la coleccioacuten ArrayListUn ArrayList es una estructura en forma de lista que permite almacenar elementos delmismo tipo (pueden ser incluso objetos) su tamantildeo va cambiando a medida que seantildeaden o se eliminan esos elementosNos podemos imaginar un ArrayList como un conjunto de celdas o cajoncitos donde seguardan los valores exactamente igual que un array convencional En la praacutectica seraacutemaacutes faacutecil trabajar con un ArrayListEn capiacutetulos anteriores hemos podido comprobar la utilidad del array es un recursoimprescindible que cualquier programador debe manejar con soltura No obstante elarray presenta algunos inconvenientes Uno de ellos es la necesidad de conocer eltamantildeo exacto en el momento de su creacioacuten Una coleccioacuten sin embargo se crea sinque se tenga que especificar el tamantildeo posteriormente se van antildeadiendo y quitandoelementos a medida que se necesitanTrabajando con arrays es frecuente cometer errores al utilizar los iacutendices por ejemploal intentar guardar un elemento en una posicioacuten que no existe (iacutendice fuera de rango)Aunque las colecciones permiten el uso de iacutendices no es necesario indicarlos siemprePor ejemplo en una coleccioacuten del tipo ArrayList cuando hay que antildeadir el elementoAmapola se puede hacer simplemente floresadd(Amapola) Al no especificar iacutendice elelemento Amapola se antildeadiriacutea justo al final de flores independientemente del tamantildeoy del nuacutemero de elementos que se hayan introducido yaLa clase ArrayList es muy similar a la clase Vector Eacutesta uacuteltima estaacute obsoleta y por tantono se recomienda su uso

1011 Principales meacutetodos de ArrayList

Las operaciones maacutes comunes que se pueden realizar con un objeto de la claseArrayList son las siguientes

add(elemento)Antildeade un elemento al final de la lista

133

Colecciones y diccionarios 134

add(indice elemento)Inserta un elemento en una posicioacuten determinada desplazando el resto deelementos hacia la derecha

clear()Elimina todos los elementos pero no borra la lista

contains(elemento)Devuelve true si la lista contiene el elemento que se especifica y false en casocontrario

get(indice)Devuelve el elemento de la posicioacuten que se indica entre pareacutentesis

indexOf(elemento)Devuelve la posicioacuten de la primera ocurrencia del elemento que se indica entrepareacutentesis

isEmpty()Devuelve true si la lista estaacute vaciacutea y false en caso de tener alguacuten elemento

remove(indice)Elimina el elemento que se encuentra en una posicioacuten determinada

remove(elemento)Elimina la primera ocurrencia de un elemento

set(indice elemento)Machaca el elemento que se encuentra en una determinada posicioacuten con elelemento que se pasa como paraacutemetro

size()Devuelve el tamantildeo (nuacutemero de elementos) de la lista

toArray()Devuelve un array con todos y cada uno de los elementos que contiene la lista

Puedes consultar todos los meacutetodos disponibles en la documentacioacuten oficial de la claseArrayList1

1httpdocsoraclecomjavase7docsapijavautilArrayListhtml

Colecciones y diccionarios 135

1012 Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de suselementos

A continuacioacuten se muestra un ejemplo en el que se puede ver coacutemo se declara unArrayList y coacutemo se insertan y se extraen elementos

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList01

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

Systemoutprintln(Nordm de elementos + asize())

aadd(rojo)

aadd(verde)

aadd(azul)

Systemoutprintln(Nordm de elementos + asize())

aadd(blanco)

Systemoutprintln(Nordm de elementos + asize())

Systemoutprintln(El elemento que hay en la posicioacuten 0 es + aget(0))

Systemoutprintln(El elemento que hay en la posicioacuten 3 es + aget(3))

Observa que al crear un objeto de la clase ArrayList hay que indicar el tipo de dato quese almacenaraacute en las celdas de esa lista Para ello se utilizan los caracteres lt y gt Nohay que olvidar los pareacutentesis del final

Es necesario importar la clase ArrayList para poder crear objetos de estaclase para ello debe aparecer al principio del programa la liacutenea import

javautilArrayList Algunos IDEs (por ej Netbeans) insertan esta liacutenea decoacutedigo de forma automaacutetica

En el siguiente ejemplo se muestra un ArrayList de nuacutemeros enteros

Colecciones y diccionarios 136

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList011

public static void main(String[] args)

ArrayListltIntegergt a = new ArrayListltIntegergt()

aadd(18)

aadd(22)

aadd(-30)

Systemoutprintln(Nordm de elementos + asize())

Systemoutprintln(El elemento que hay en la posicioacuten 1 es + aget(1))

Se define la estructura de la siguiente manera

ArrayListltIntegergt a = new ArrayListltIntegergt()

Fiacutejate que no se utiliza el tipo simple int sino el wrapper Integer Recuerda quelos wrapper son clases que engloban a los tipos simples y les antildeaden nuevasfuncionalidades (p ej permiten tratar a las variables numeacutericas como objetos) Elwrapper de int es Integer el de float es Float el de double es Double el de long es Longel de boolean es Boolean y el de char es CharacterEn el siguiente ejemplo podemos ver coacutemo extraer todos los elementos de una lista ala manera tradicional con un bulce for

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList02

Colecciones y diccionarios 137

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(int i=0 i lt asize() i++)

Systemoutprintln(aget(i))

Si estaacutes acostumbrado al for claacutesico habraacutes visto que es muy sencillo recorrer todoslos elementos del ArrayList No obstante al trabajar con colecciones es recomendableusar el for al estilo foreach como se muestra en el siguiente ejemplo Como puedes verla sintaxis es maacutes corta y no se necesita crear un iacutendice para recorrer la estructura

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList03

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(String color a)

Colecciones y diccionarios 138

Systemoutprintln(color)

Fiacutejate en estas liacuteneas

for(String color a)

Systemoutprintln(color)

El significado de este coacutedigo seriacutea el siguiente

for(String color a)

rarr Saca uno a uno todos los elementos de a y ve metieacutendolos en una variable de nombrecolor

Systemoutprintln(color)

rarr Muestra por pantalla el contenido de la variable colorVeamos ahora en otro ejemplo coacutemo eliminar elementos de un ArrayList Se utiliza elmeacutetodo remove() y se puede pasar como paraacutemetro el iacutendice del elemento que se quiereeliminar o bien el valor del elemento O sea aremove(2) elimina el elemento que seencuentra en la posicioacuten 2 de a mientras que aremove(blanco) elimina el valor blancoEs importante destacar que el ArrayList se reestructura de forma automaacutetica despueacutesdel borrado de cualquiera de sus elementos

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList04

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

Colecciones y diccionarios 139

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

aadd(blanco)

Systemoutprintln(Contenido de la lista )

for(String color a)

Systemoutprintln(color)

if (acontains(blanco))

Systemoutprintln(El blanco estaacute en la lista de colores)

aremove(blanco)

Systemoutprintln(Contenido de la lista despueacutes de quitar la +

primera ocurrencia del color blanco )

for(String color a)

Systemoutprintln(color)

aremove(2)

Systemoutprintln(Contenido de la lista despueacutes de quitar el +

elemento de la posicioacuten 2 )

for(String color a)

Systemoutprintln(color)

A continuacioacuten se muestra un ejemplo en el que se ldquomachacardquo una posicioacuten delArrayList Al hacer aset(2 turquesa) se borra lo que hubiera en la posicioacuten 2 y secoloca el valor turquesa Seriacutea equivalente a hacer a[2] = turquesa en caso de que a

fuese un array tradicional en lugar de un ArrayList

Colecciones y diccionarios 140

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList05

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido del vector )

for(String color a)

Systemoutprintln(color)

aset(2 turquesa)

Systemoutprintln(Contenido del vector despueacutes de machacar la posicioacuten 2 )

for(String color a)

Systemoutprintln(color)

El meacutetodo add permite antildeadir elementos a un ArrayList como ya hemos visto Porejemplo aadd(amarillo) antildeade el elemento amarillo al final de a Este meacutetodo sepuede utilizar tambieacuten con un iacutendice de la forma aadd(1 turquesa) En este caso loque se hace es insertar en la poscioacuten indicada Lo mejor de todo es que el ArrayList sereestructura de forma automaacutetica desplazando el resto de elementos

Colecciones y diccionarios 141

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList06

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(String color a)

Systemoutprintln(color)

aadd(1 turquesa)

Systemoutprintln(Contenido del vector despueacutes de insertar en la posicioacuten 1 )

for(String color a)

Systemoutprintln(color)

1013 ArrayList de objetos

Una coleccioacuten ArrayList puede contener objetos que son instancias de clases definidaspor el programador Esto es muy uacutetil sobre todo en aplicaciones de gestioacuten paraguardar datos de alumnos productos libros etcEn el siguiente ejemplo definimos una lista de gatos En cada celda de la lista sealmacenaraacute un objeto de la clase Gato

Colecciones y diccionarios 142

Uso de un ArrayList de objetos author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList07

public static void main(String[] args)

ArrayListltGatogt g = new ArrayListltGatogt()

gadd(new Gato(Garfield naranja mestizo))

gadd(new Gato(Pepe gris angora))

gadd(new Gato(Mauri blanco manx))

gadd(new Gato(Ulises marroacuten persa))

Systemoutprintln(nDatos de los gatosn)

for (Gato gatoAux g)

Systemoutprintln(gatoAux+n)

En el siguiente apartado se muestra la definicioacuten de la clase Gato

1014 Ordenacioacuten de un ArrayList

Los elementos de una lista se pueden ordenar con el meacutetodo sort El formato es elsiguiente

Collectionssort(lista)

Observa que sort es un meacutetodo de clase que estaacute definido en Collections Para poderutilizar este meacutetodo es necesario incluir la liacutenea

import javautilCollections

al principio del programa A continuacioacuten se muestra un ejemplo del uso de sort

Colecciones y diccionarios 143

Ordenacioacuten de un ArrayList author Luis Joseacute Saacutenchez

import javautilCollectionsimport javautilArrayList

public class EjemploArrayList071

public static void main(String[] args)

ArrayListltIntegergt a = new ArrayListltIntegergt()

aadd(67)

aadd(78)

aadd(10)

aadd(4)

Systemoutprintln(nNuacutemeros en el orden original)

for (int numero a)

Systemoutprintln(numero)

Collectionssort(a)

Systemoutprintln(nNuacutemeros ordenados)

for (int numero a)

Systemoutprintln(numero)

Tambieacuten es posible ordenar una lista de objetos En este caso es necesario indicar elcriterio de ordenacioacuten en la definicioacuten de la clase En el programa principal se utilizael meacutetodo sort igual que si se tratase de una lista de nuacutemeros o de palabras como semuestra a continuacioacuten

Colecciones y diccionarios 144

Ordenacioacuten de un ArrayList de objetos author Luis Joseacute Saacutenchez

import javautilCollectionsimport javautilArrayList

public class EjemploArrayList08

public static void main(String[] args)

ArrayListltGatogt g = new ArrayListltGatogt()

gadd(new Gato(Garfield naranja mestizo))

gadd(new Gato(Pepe gris angora))

gadd(new Gato(Mauri blanco manx))

gadd(new Gato(Ulises marroacuten persa))

gadd(new Gato(Adaacuten negro angora))

Collectionssort(g)

Systemoutprintln(nDatos de los gatos ordenados por nombre)

for (Gato gatoAux g)

Systemoutprintln(gatoAux+n)

Ahora bien en la definicioacuten de la clase Gato hay que indicar de alguna manera coacutemo sedebe realizar la ordenacioacuten ya que Java no sabe de antemano si los gatos se ordenanseguacuten el color el nombre el peso etcLo primero que hay que hacer es indicar que los objetos de la clase Gato se puedencomparar unos con otros Para ello cambiamos la siguiente liacutenea

public class Gato

por esta otra

public class Gato implements ComparableltGatogt

Lo siguiente y no menos importante es definir el meacutetodo compareTo Este meacutetodo debedevolver un 0 si los elementos que se comparan son iguales un nuacutemero negativo si

Colecciones y diccionarios 145

el primer elemento que se compara es menor que el segundo y un nuacutemero positivoen caso contrario Afortunadamente las clases String Integer Double etc ya tienenimplementado su propio meacutetodo compareTo asiacute que tenemos hecho lo maacutes difiacutecil Louacutenico que deberemos escribir en nuestro coacutedigo es un compareTo con los atributos quequeremos compararEn el caso que nos ocupa si queremos ordenar los gatos por nombre tendremos queimplementar el compareTo de la clase Gato de tal forma que nos devuelva el resultadodel compareTo de los nombres de los gatos que estamos comparando de la siguientemanera

public int compareTo(Gato g)

return (thisnombre)compareTo(ggetNombre())

Si en lugar de ordenar por nombre quisieacuteramos ordenar por raza el meacutetodo compareTo

de la clase Gato seriacutea el siguiente

public int compareTo(Gato g)

return (thisraza)compareTo(ggetRaza())

A continuacioacuten se muestra la definicioacuten completa de la clase Gato

Definicioacuten de la clase Gato author

public class Gato implements ComparableltGatogt

private String nombre

private String color

private String raza

public Gato(String nombre String color String raza)

thisnombre = nombre

thiscolor = color

thisraza = raza

public String getNombre()

return nombre

Colecciones y diccionarios 146

public String getRaza()

return raza

public String toString()

return Nombre + thisnombre + nColor + thiscolor + nRaza + thisraza

public int compareTo(Gato g)

return (thisnombre)compareTo(ggetNombre())

public boolean equals(Gato g)

return (thisnombre)equals(ggetNombre())

102 Diccionarios la clase HashMap

Imagina un diccionario ingleacutes-espantildeol Queremos saber queacute significa la palabra ldquostiffrdquoSabemos que en el diccionario hay muchas entradas y en cada entrada tenemos unapalabra en ingleacutes y su correspondiente traduccioacuten al espantildeol Buscando por la ldquosrdquoencontramos que ldquostiffrdquo significa ldquoagujetasrdquoUn diccionario en Java funciona exactamente igual Contiene una serie de elementosque son las entradas que a su vez estaacuten formadas por un par (clave valor) La clave(key) permite acceder al valor No puede haber claves duplicadas En el ejemploanterior la clave seriacutea ldquostiffrdquo y el valor ldquoagujetasrdquoJava dispone de varios tipos de diccionarios HashMap EnumMap Hashtable IdentityHashMapLinkedHashMap etc Nosotros estudiaremos el diccionario HashMap

1021 Principales meacutetodos de HashMap

Algunos de los meacutetodos maacutes importantes de la clase HasMap son

get(clave)Obtiene el valor correspondiente a una clave Devuelve null si no existe esa claveen el diccionario

put(clave valor)Antildeade un par (clave valor) al diccionario Si ya habiacutea un valor para esa clave semachaca

keySet()Devuelve un conjunto (set) con todas las claves

Colecciones y diccionarios 147

values()Devuelve una coleccioacuten con todos los valores (los valores pueden estar duplicadosa diferencia de las claves)

entrySet()Devuelve una coleccioacuten con todos los pares (clave valor)

containsKey(clave)Devuelve true si el diccionario contiene la clave indicada y false en caso contrario

getKey()Devuelve la clave de la entrada Se aplica a una sola entrada del diccionario (noal diccionario completo) es decir a una pareja (clave valor)

Por ejemplo

for (MapEntry pareja mentrySet())

Systemoutprintln(parejagetKey())

getValue()Devuelve el contenido de la entrada Se aplica a una entrada del diccionario (noal diccionario completo) es decir a una pareja (clave valor)

Por ejemplo

for (MapEntry pareja mentrySet())

Systemoutprintln(parejagetValue())

1022 Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas

Al declarar un diccionario hay que indicar los tipos tanto de la clave como del valorEn el siguiente ejemplo definimos el diccionario m que tendraacute como clave un nuacutemeroentero y una cadena de caracteres como valor Este diccionario se declara de estaforma

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

No hay que olvidar importar la clase al principio del programa

import javautilHashMap

Para insertar una entrada en el diccionario se utiliza el meacutetodo put indicando siemprela clave y el valor Veamos un ejemplo completo

Colecciones y diccionarios 148

Ejemplo de uso de la clase HasMap author Luis Joseacute Saacutenchez

import javautilHashMap

public class EjemploHashMap01

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(Los elementos de m son n + m)

Para extraer valores se utiliza el meacutetodo get Se proporciona una clave y el diccionarionos devuelve el valor igual que un diccionario de verdad Si no existe ninguna entradacon la clave que se indica se devuelve null

Ejemplo de uso de la clase HasMap author Luis Joseacute Saacutenchez

import javautilHashMap

public class EjemploHashMap011

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

Colecciones y diccionarios 149

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(mget(921))

Systemoutprintln(mget(605))

Systemoutprintln(mget(888))

iquestY si queremos extraer todas las entradas Tenemos varias opciones Podemos usar elmeacutetodo print directamente sobre el diccionario de la forma Systemoutprint(diccionario)

como vimos en un ejemplo anterior de esta manera se muestran por pantalla todaslas entradas encerradas entre llaves Tambieacuten podemos convertir el diccionario enun entrySet (conjunto de entradas) y mostrarlo con print de esta forma se obtieneuna salida por pantalla muy parecida a la primera (en lugar de llaves se muestrancorchetes) Otra opcioacuten es utilizar un for para recorrer una a una todas las entradasEn este uacuteltimo caso hay que convertir el diccionario en un entrySet ya que no se puedensacar las entradas directamente del diccionario Estas dos uacuteltimas opciones se ilustranen el siguiente ejemplo

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautilHashMapimport javautilMap

public class EjemploHashMap02

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(Todas las entradas del diccionario extraiacutedas con entrySet)

Systemoutprintln(mentrySet())

Systemoutprintln(nEntradas del diccionario extraiacutedas una a una)

Colecciones y diccionarios 150

for (MapEntry pareja mentrySet())

Systemoutprintln(pareja)

A continuacioacuten se muestra el uso de los meacutetodos getKey y getValue que extraen la clavey el valor de una entrada respectivamente

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautil

public class EjemploHashMap03

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(CoacutedigotNombren------t-------------)

for (MapEntry pareja mentrySet())

Systemoutprint(parejagetKey() + t)

Systemoutprintln(parejagetValue())

En el uacuteltimo programa de ejemplo hacemos uso del meacutetodo containsKey que nos serviraacutepara saber si existe o no una determinada clave en un diccionario y del meacutetodo get

que como ya hemos visto sirve para extraer un valor a partir de su clave

Colecciones y diccionarios 151

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautil

public class EjemploHashMap04

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprint(Por favor introduzca un coacutedigo )

int codigoIntroducido = IntegerparseInt(Systemconsole()readLine())

if (mcontainsKey(codigoIntroducido))

Systemoutprint(El coacutedigo + codigoIntroducido + corresponde a )

Systemoutprintln(mget(codigoIntroducido))

else

Systemoutprint(El coacutedigo introducido no existe)

Colecciones y diccionarios 152

103 Ejercicios

Ejercicio 1Crea un ArrayList con los nombres de 6 compantildeeros de clase A continuacioacutenmuestra esos nombres por pantalla Utiliza para ello un bucle for que recorratodo el ArrayList sin usar ninguacuten iacutendice

Ejercicio 2Realiza un programa que introduzca valores aleatorios (entre 0 y 100) en unArrayList y que luego calcule la suma la media el maacuteximo y el miacutenimo de esosnuacutemeros El tamantildeo de la lista tambieacuten seraacute aleatorio y podraacute oscilar entre 10y 20 elementos ambos inclusive

Ejercicio 3Escribe un programa que ordene 10 nuacutemeros enteros introducidos por tecladoy almacenados en un objeto de la clase ArrayList

Ejercicio 4Realiza un programa equivalente al anterior pero en esta ocasioacuten el programadebe ordenar palabras en lugar de nuacutemeros

Ejercicio 5Realiza de nuevo el ejercicio de la coleccioacuten de discos pero utilizando esta vezuna lista para almacenar la informacioacuten sobre los discos en lugar de un arrayconvencional Comprobaraacutes que el coacutedigo se simplifica notablemente iquestCuaacutentoocupa el programa original hecho con un array iquestCuaacutento ocupa este nuevoprograma hecho con una lista

Ejercicio 6Implementa el control de acceso al aacuterea restringida de un programa Se debepedir un nombre de usuario y una contrasentildea Si el usuario introduce losdatos correctamente el programa diraacute ldquoHa accedido al aacuterea restringidardquo Elusuario tendraacute un maacuteximo de 3 oportunidades Si se agotan las oportunidadesel programa diraacute ldquoLo siento no tiene acceso al aacuterea restringidardquo Los nombresde usuario con sus correspondientes contrasentildeas deben estar almacenadosen una estructura de la clase HashMap

Colecciones y diccionarios 153

Ejercicio 7La maacutequina Eurocoin genera una moneda de curso legal cada vez que se pulsaun botoacuten siguiendo la siguiente pauta o bien coincide el valor con la monedaanteriormente generada - 1 ceacutentimo 2 ceacutentimos 5 ceacutentimos 10 ceacutentimos 25ceacutentimos 50 ceacutentimos 1 euro o 2 euros - o bien coincide la posicioacuten ndash cara ocruz Simula mediante un programa la generacioacuten de 6 monedas aleatoriassiguiendo la pauta correcta Cada moneda generada debe ser una instanciade la clase Moneda y la secuencia se debe ir almacenando en una lista

Ejemplo

2 ceacutentimos ndash cara

2 ceacutentimos ndash cruz

50 ceacutentimos ndash cruz

1 euro ndash cruz

1 euro ndash cara

10 ceacutentimos ndash cara

Ejercicio 8Realiza un programa que escoja al azar 10 cartas de la baraja espantildeola(10 objetos de la clase Carta) Emplea un objeto de la clase ArrayList paraalmacenarlas y aseguacuterate de que no se repite ninguna

Ejercicio 9Modifica el programa anterior de tal forma que las cartas se muestren orde-nadas Primero se ordenaraacuten por palo bastos copas espadas oros Cuandocoincida el palo se ordenaraacute por nuacutemero as 2 3 4 5 6 7 sota caballo rey

Ejercicio 10Crea un mini-diccionario espantildeol-ingleacutes que contenga al menos 20 palabras(con su correspondiente traduccioacuten) Utiliza un objeto de la clase HashMap paraalmacenar las parejas de palabras El programa pediraacute una palabra en espantildeoly daraacute la correspondiente traduccioacuten en ingleacutes

Ejercicio 11Realiza un programa que escoja al azar 5 palabras en espantildeol del mini-diccionario del ejercicio anterior El programa iraacute pidiendo que el usuarioteclee la traduccioacuten al ingleacutes de cada una de las palabras y comprobaraacute sison correctas Al final el programa deberaacute mostrar cuaacutentas respuestas sonvaacutelidas y cuaacutentas erroacuteneas

Colecciones y diccionarios 154

Ejercicio 12Escribe un programa que genere una secuencia de 5 cartas de la barajaespantildeola y que sume los puntos seguacuten el juego de la brisca El valor de lascartas se debe guardar en una estructura HashMap que debe contener parejas(figura valor) por ejemplo (ldquocaballordquo 3) La secuencia de cartas debe ser unaestructura de la clase ArrayList que contiene objetos de la clase Carta El valorde las cartas es el siguiente as rarr 11 tres rarr 10 sota rarr 2 caballo rarr 3 rey rarr4 el resto de cartas no vale nada

Ejemplo

as de oros

cinco de bastos

caballo de espadas

sota de copas

tres de oros

Tienes 26 puntos

Ejercicio 13Modifica el programa Gestisimal realizado anteriormente antildeadiendo lassiguientes mejoras

bull Utiliza una lista en lugar de un array para el almacenamiento de los datosbull Comprueba la existencia del coacutedigo en el alta la baja y la modificacioacuten

de artiacuteculos para evitar erroresbull Cambia la opcioacuten ldquoSalida de stockrdquo por ldquoVentardquo Esta nueva opcioacuten

permitiraacute hacer una venta de varios artiacuteculos y emitir la factura corres-pondiente Se debe preguntar por los coacutedigos y las cantidades de cadaartiacuteculo que se quiere comprar Aplica un 21 de IVA

11 Ficheros de texto y paso de paraacutemetrospor liacutenea de comandos

Mediante un programa en Java se puede acceder al contenido de un fichero grabadoen un dispositivo de almacenamiento (por ejemplo en el disco duro) tanto para leercomo para escribir (grabar) datosLa informacioacuten contenida en las variables los arrays los objetos o cualquier otraestructura de datos es volaacutetil es decir se pierde cuando se cierra el programaLos ficheros permiten tener ciertos datos almacenados y disponibles en cualquiermomento para cuando nuestro programa los necesitePensemos por ejemplo en un juego Podriacuteamos utilizar un fichero para guardar elranking de jugadores con las mejores puntuaciones De esta manera estos datos nose perderiacutean al salir del juego De igual forma en un programa de gestioacuten puede seruacutetil tener un fichero de configuracioacuten con datos como el nuacutemero maacuteximo de elementosque se muestran en un listado o los distintos tipos de IVA aplicables a las facturas Almodificar esta informacioacuten quedaraacute almacenada en el fichero correspondiente y nose perderaacute cuando se cierre el programa

Cuando un programa se cierra se pierde la informacioacuten almacenada envariables arrays objetos o cualquier otra estructura Si queremos conservarciertos datos debemos guardarlos en ficheros

Hay programas que hacen un uso intensivo de datos Por ejemplo la aplicacioacutenSeacuteneca- que por cierto estaacute hecha en Java - lleva el control de la matriculacioacuten de cientosde miles de alumnos y la gestioacuten de decenas de miles de profesores En este caso yen otros similares se utiliza un sistema gestor de bases de datos El acceso a bases dedatos mediante Java lo estudiaremos en el capiacutetulo 13

La creacioacuten y uso de ficheros desde un programa en Java se lleva a cabocuando hay poca informacioacuten que almacenar o cuando esa informacioacuten esheterogeacutenea En los casos en que la informacioacuten es abundante y homogeacuteneaes preferible usar una base de datos relacional (por ejemplo MySQL) en lugarde ficheros

En este capiacutetulo estudiaremos ademaacutes del acceso a ficheros desde un programa enJava el paso de paraacutemetros desde la liacutenea de comandos Son cosas diferentes y nohay que utilizarlas juntas necesariamente pero como podraacutes comprobar se combinanmuy bien por eso hemos incluido estos dos recursos de Java en un mismo capiacutetulo

155

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 156

111 Lectura de un fichero de texto

Aunque Java puede manejar tambieacuten ficheros binarios vamos a centrarnos exclusi-vamente en la utilizacioacuten de ficheros de texto Los ficheros de texto tienen una granventaja se pueden crear y manipular mediante cualquier editor como por ejemploGEditSiempre que vayamos a usar ficheros deberemos incluir al principio del programa unao varias liacuteneas para cargar las clases necesarias Anque se pueden cargar varias clasesen una sola liacutenea usando el asterisco de la siguiente manera

import javaio

nosotros no lo haremos asiacute ya que nuestro coacutedigo sigue las normas del estaacutendar deGoogle y estas normas lo prohiben taxativamente Se importaraacuten las clases usandovarias liacuteneas una liacutenea por cada clase que se importa en el programa de esta forma

import javaioBufferedReaderimport javaioFileReader

No es necesario saber de memoria los nombres de las clases el entorno de desarrolloNetbeans detecta queacute clases hacen falta cargar y antildeade los import de forma automaacute-ticaTodas las operaciones que se realicen sobre ficheros deberaacuten estar incluidas en unbloque try-catch Esto nos permitiraacute mostrar mensajes de error y terminar el programade una forma ordenada en caso de que se produzca alguacuten fallo - el fichero no existeno tenemos permiso para acceder a eacutel etcEl bloque try-catch tiene el siguiente formato

try

Operaciones_con_fichero

catch (tipo_de_error nombre_de_variable)

Mensaje_de_error

Tanto para leer como para escribir utilizamos lo que en programacioacuten se llama unldquomanejador de ficherordquo Es algo asiacute como una variable que hace referencia al ficherocon el que queremos trabajarEn nuestro ejemplo el manejador de fichero se llama bf y se crea de la siguientemanera

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 157

BufferedReader bf = new BufferedReader(new FileReader(malaga1txt))

El fichero con el que vamos a trabajar tiene por nombre malaga1txt y contieneinformacioacuten extraiacuteda de la Wikipedia sobre la bonita ciudad de Maacutelaga1 A partir deaquiacute siempre que queramos realizar una operacioacuten sobre ese archivo utilizaremos sumanejador de fichero asociado es decir bfEn el ejemplo que se muestra a continuacioacuten el programa lee el contenido del ficheromalaga1txt y lo muestra tal cual en pantalla igual que si hicieacuteramos en una ventanade terminal cat malaga1txtObserva que se va leyendo el fichero liacutenea a liacutenea mediante bfreadLine() hasta que seacaban las liacuteneas Cuando no quedan maacutes liacuteneas por leer se devuelve el valor null

Ejemplo de uso de la clase File Lectura de un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileNotFoundExceptionimport javaioFileReaderimport javaioIOException

class EjemploFichero01

public static void main(String[] args)

try

BufferedReader bf = new BufferedReader(new FileReader(malaga1txt))

String linea =

while (linea = null)

Systemoutprintln(linea)

linea = bfreadLine()

bfclose()

catch (FileNotFoundException e) queacute hacer si no se encuentra el ficheroSystemoutprintln(No se encuentra el fichero malagatxt)

catch (IOException e) queacute hacer si hay un error en la lectura del fichero

1httpeswikipediaorgwikiMC3A1laga

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 158

Systemoutprintln(No se puede leer el fichero malagatxt)

Es importante ldquocerrar el ficherordquo cuando se han realizado todas las operacionesnecesarias sobre eacutel En este ejemplo esta accioacuten se ha llevado a cabo con la sentenciabfclose()A continuacioacuten se muestra un programa un poco maacutes complejo Se trata de unaaplicacioacuten que pide por teclado un nombre de fichero Previamente en ese fichero(por ejemplo numerostxt) habremos introducido una serie de nuacutemeros a razoacuten de unopor liacutenea Se podriacutean leer tambieacuten los nuacutemeros si estuvieran separados por comaso espacios aunque seriacutea un poco maacutes complicado (no mucho maacutes) Los nuacutemerospueden contener decimales ya que se van a leer como Double Cada nuacutemero que selee del fichero se va sumando de tal forma que la suma total estaraacute contenida en lavariable suma a la par se va llevando la cuenta de los elementos que se van leyendoen la variable i Finalmente dividiendo la suma total entre el nuacutemero de elementosobtenemos la media aritmeacutetica de los nuacutemeros contenidos en el fichero

Ejemplo de uso de la clase File Calcula la media de los nuacutemeros que se encuentran en un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileReaderimport javaioIOException

class EjemploFichero08

public static void main(String[] args)

Systemoutprint(Introduzca el nombre del archivo donde se encuentran los nuacutemeros )

String nombreFichero = Systemconsole()readLine()

try

BufferedReader bf = new BufferedReader(new FileReader(nombreFichero))

String linea = 0

int i = 0

double suma = 0

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 159

while (linea = null)

i++

suma += DoubleparseDouble(linea)

linea = bfreadLine()

i--

bfclose()

Systemoutprintln(La media es + suma (double)i)

catch (IOException e)

Systemoutprintln(egetMessage())

112 Escritura sobre un fichero de texto

La escritura en un fichero de texto es si cabe maacutes faacutecil que la lectura Solo hay quecambiar Systemoutprint(texto) por manejadorwrite(texto) Se pueden incluir saltosde liacutenea tabuladores y espacios igual que al mostrar un mensaje por pantallaEs importante ejecutar close() despueacutes de realizar la escritura de esta manera nosaseguramos que se graba toda la informacioacuten en el discoAl realizar escrituras en ficheros con Java hay que tener ciertas precauciones Cuandotoca dar este tema en clase es frecuente que a maacutes de un alumno le empiece a irlento el ordenador luego se le queda inutilizado y por uacuteltimo ni siquiera le arrancaiquestqueacute ha pasado Pues que ha estado escribiendo datos en ficheros y por alguna razoacutensu programa se ha metido en un bucle infinito lo que da como resultado cuelgues yficheros de varios gigabytes de basura Por eso es muy importante asegurarse biende que la informacioacuten que se va a enviar a un fichero es la correcta iquestcoacutemo muy faacutecilenviaacutendola primero a la pantalla

Primero a pantalla y luego a ficheroEnviacutea primero a la pantalla todo lo que quieras escribir en el fichero Cuandocompruebes que lo que se ve por pantalla es realmente lo que quieres grabaren el fichero entonces y solo entonces cambia Systemoutprint(texto) pormanejadorwrite(texto)

A continuacioacuten se muestra un programa de ejemplo que crea un fichero de texto yluego esribe en eacutel tres palabras una por cada liacutenea

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 160

Ejemplo de uso de la clase File Escritura en un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedWriterimport javaioFileWriterimport javaioIOException

class EjemploFichero02

public static void main(String[] args)

try

BufferedWriter bw = new BufferedWriter(new FileWriter(frutatxt))

bwwrite(naranjan)

bwwrite(mangon)

bwwrite(chirimoyan)

bwclose()

catch (IOException ioe)

Systemoutprintln(No se ha podido escribir en el fichero)

113 Lectura y escritura combinadas

Las operaciones de lectura y escritura sobre ficheros se pueden combinar de tal formaque haya un flujo de lectura y otro de escritura uno de lectura y dos de escritura tresde lectura etcEn el ejemplo que presentamos a continuacioacuten hay dos flujos de lectura y uno deescritura Observa que se declaran en total tres manejadores de fichero (dos paralectura y uno para escritura) El programa va leyendo de forma alterna una liacutenea decada fichero - una liacutenea de fichero1txt y otra liacutenea de fichero2txt - mientras quedenliacuteneas por leer en alguno de los ficheros y al mismo tiempo va guardando esas liacuteneasen otro fichero con nombre mezclatxt

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 161

Ejemplo de uso de la clase File Mezcla de dos ficheros author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioBufferedWriterimport javaioFileReaderimport javaioFileWriterimport javaioIOException

class EjemploFichero03

public static void main(String[] args)

try

BufferedReader bf1 = new BufferedReader(new FileReader(fichero1txt))

BufferedReader bf2 = new BufferedReader(new FileReader(fichero2txt))

BufferedWriter bw = new BufferedWriter(new FileWriter(mezclatxt))

String linea1 =

String linea2 =

while ( (linea1 = null) || (linea2 = null) )

linea1 = bf1readLine()

linea2 = bf2readLine()

if (linea1 = null) bwwrite(linea1 + n)

if (linea2 = null) bwwrite(linea2 + n)

bf1close()

bf2close()

bwclose()

catch (IOException ioe)

Systemoutprintln(Se ha producido un error de lecturaescritura)

Systemerrprintln(ioegetMessage())

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 162

114 Otras operaciones sobre ficheros

Ademaacutes de leer desde o escribir en un fichero hay otras operaciones relacionadas conlos archivos que se pueden realizar desde un programa escrito en JavaVeremos tan solo un par de ejemplos Si quieres profundizar maacutes eacutechale un vistazo ala documentacioacuten oficial de la clase File2El siguiente ejemplo muestra por pantalla un listado con todos los archivos quecontiene un directorio

Ejemplo de uso de la clase File Listado de los archivos del directorio actual author Luis Joseacute Saacutenchez

import javaioFile

class EjemploFichero04

public static void main(String[] args)

File fichero = new File() se indica la ruta entre comillas el punto () es el directorio actual

String[] listaArchivos = ficherolist()

for(int i = 0 i lt listaArchivoslength i++)

Systemoutprintln(listaArchivos[i])

El siguiente programa de ejemplo comprueba si un determinado archivo existe ono mediante exists() y en caso de que exista lo elimina mediante delete() Siintentaacuteramos borrar un archivo que no existe obtendriacuteamos un error

2httpdocsoraclecomjavase7docsapijavaioFilehtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 163

Ejemplo de uso de la clase File Comprobacioacuten de existencia y borrado de un fichero author Luis Joseacute Saacutenchez

import javaioFile

class EjemploFichero05

public static void main(String[] args)

Systemoutprint(Introduzca el nombre del archivo que desea borrar )

String nombreFichero = Systemconsole()readLine()

File fichero = new File(nombreFichero)

if (ficheroexists())

ficherodelete()

Systemoutprintln(El fichero se ha borrado correctamente)

else

Systemoutprintln(El fichero + nombreFichero + no existe)

115 Paso de argumentos por liacutenea de comandos

Como dijimos al comienzo de este capiacutetulo el paso de argumentos por liacutenea decomandos no estaacute directamente relacionado con los ficheros aunque es muy frecuentecombinar estos dos recursosSeguro que has usado muchas veces el paso de argumentos por liacutenea de comandossin saberlo Por ejemplo si tecleas el siguiente comando en una ventana de terminal

$ head -5 etcbashbashrc

se muestran por pantalla las 5 primeras liacuteneas del fichero bashbashrc que se encuentraen el directorio etc En este caso head es el nombre del programa que estamosejecutando y los valores -5 y etcbashbashrc son los argumentosVolvamos al comienzo al primer capiacutetulo iquestRecuerdas coacutemo ejecutaste tu primerprograma en Java iexclQueacute tiempos aqueacutellos El programa HolaMundo se ejecutaba asiacute

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 164

$ java HolaMundo

Para probar los ejemplos que te presentamos maacutes adelante deberaacutes hacer lo mismo yademaacutes antildeadir a continuacioacuten y separados por espacios los argumentos que quieresque lea el programa Vamos a verlo en detalleEl siguiente programa de ejemplo simplemente muestra por pantalla los argumentosintroducidos Compila el programa y prueba a ejecutar lo siguiente

$ java EjemploArgumentos06 hola que tal 24 12 fin

con lo que obtendraacutes el siguiente resultado

Los argumentos introducidos son

hola

que

tal

24

12

fin

Los argumentos han pasado al programa en virtud del paraacutemetro que incluimos en laliacutenea del main

public static void main(String[] args)

Fiacutejate en lo que hay entre pareacutentesis String[] args Se trata de un array de cadenasde caracteres (String) donde cada uno de los elementos seraacute un argumento que se hapasado como paraacutemetro Si has ejecutado el ejemplo tal y como se ha indicado args[0]vale ldquoholardquo args[1] vale ldquoquerdquo args[2] vale ldquotalrdquo args[3] vale ldquo24rdquo args[4] vale ldquo12rdquo yargs[5] vale ldquofinrdquo

Paso de argumentos en la liacutenea de comandos author Luis Joseacute Saacutenchez

class EjemploArgumentos06

public static void main(String[] args)

Systemoutprintln(Los argumentos introducidos son )

for (int i = 0 i lt argslength i++)

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 165

Systemoutprintln(args[i])

Hagamos algo un poco maacutes uacutetil con los argumentos En el siguiente ejemplo se sumantodos los argumentos que se pasan como paraacutemetros y se muestra por pantalla elresultado de la sumaDespueacutes de compilar deberaacutes ejecutar desde una ventana de terminal lo siguiente(puedes cambiar los nuacutemeros si quieres)

$ java EjemploArgumentos07 10 36 44

con lo que obtendraacutes este resultado

90

es decir la suma de los nuacutemeros que has pasado como paraacutemetros

Paso de argumentos en la liacutenea de comandos author Luis Joseacute Saacutenchez

class EjemploArgumentos07

public static void main(String[] args)

int suma = 0

for (int i = 0 i lt argslength i++)

suma += IntegerparseInt(args[i])

Systemoutprintln(suma)

Observa que el programa convierte en nuacutemeros enteros todos y cada uno de losargumentos mediante el meacutetodo IntegerparseInt() para poder sumarlos

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 166

Los argumentos recogidos por liacutenea de comandos se guardan siempre enun array de String Cuando sea necesario realizar operaciones matemaacuteticascon esos argumentos habriacutea que convertirlos al tipo adecuado medianteIntegerparseInt() o DoubleparseDouble()

116 Combinacioacuten de ficheros y paso de argumentos

Llegoacute el momento de combinar las operaciones con ficheros con el paso de paraacutemetrospor liacutenea de comandos El ejemplo que mostramos a continuacioacuten es parecido al quehemos visto en el apartado anterior calcula la media de una serie de nuacutemeros peroesta vez esos nuacutemeros se leen desde un fichero y lo que se pasa como paraacutemetro por laliacutenea de comandos es precisamente el nombre del fichero donde estaacuten esos nuacutemerosCrea un fichero y noacutembralo numerostxt e introduce los siguientes nuacutemeros (es impor-tante que esteacuten separados por un salto de liacutena para que el programa funcione bien)

25

100

44

17

6

8

A continuacioacuten compila el programa de ejemplo EjemploFichero09java y teclea losiguiente en la ventana de terminal

$ java EjemploFichero09 numerostxt

Apareceraacute el siguiente resultado

La media es 33333333333333336

Ejemplo de uso de la clase File Calcula la media de los nuacutemeros que se encuentran en un fichero de texto El nombre del fichero se pasa como argumento en la liacutenea de comandos author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileReader

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 167

import javaioIOException

class EjemploFichero09

public static void main(String[] args)

if (argslength = 1)

Systemoutprintln(Este programa calcula la media de los nuacutemeros contenidos en un f

ichero)

Systemoutprintln(Uso del programa java EjemploFichero09 FICHERO)

Systemexit(-1) sale del programa

try

BufferedReader bf = new BufferedReader(new FileReader(args[0]))

String linea = 0

int i = 0

double suma = 0

while (linea = null)

i++

suma += DoubleparseDouble(linea)

linea = bfreadLine()

i--

bfclose()

Systemoutprintln(La media es + suma(double)i)

catch (IOException e)

Systemoutprintln(egetMessage())

Observa que el programa comprueba el nuacutemero de argumentos que se pasan por laliacutenea de comandos mediante if (argslength = 1) y si este nuacutemero es distinto de 1muestra este mensaje

Este programa calcula la media de los nuacutemeros contenidos en un fichero

Uso del programa java EjemploFichero09 FICHERO

y sale del programa De esta manera el usuario sabe exactamente coacutemo hay queutilizar el programa y coacutemo hay que pasarle la informacioacuten

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 168

117 Procesamiento de archivos de texto

La posibilidad de realizar desde Java operaciones con ficheros abre muchas posibili-dades a la hora de procesar archivos cambiar una palabra por otra eliminar ciertoscaracteres mover de sitio una liacutenea o una palabra borrar espacios o tabulaciones alfinal de las liacuteneas o cualquier otra cosa que se nos pueda ocurrirCuando se procesa un archivo de texto los pasos a seguir son los siguientes

1 Leer una liacutenea del fichero origen mientras quedan liacuteneas por leer2 Modificar la liacutenea (normalmente utilizando los meacutetodos que ofrece la clase String)3 Grabar la liacutenea modificada en el fichero destino4 Volver al paso 1

A continuacioacuten tienes algunos meacutetodos de la clase String que pueden resultar muyuacutetiles para procesar archivos de texto

bull charAt(int n) Devuelve el caraacutecter que estaacute en la posicioacuten n-eacutesima de la cadenaRecuerda que la primera posicioacuten es la nuacutemero 0

bull indexOf(String palabra) Devuelve un nuacutemero que indica la posicioacuten en la quecomienza una palabra determinada

bull length() Devuelve la longitud de la cadenabull replace(char c1 char c2) Devuelve una cadena en la que se han cambiado

todas las ocurrencias del caraacutecter c1 por el caraacutecter c2bull substring(int inicioint fin) Devuelve una subcadenabull toLowerCase() Convierte todas las letras en minuacutesculasbull toUpperCase() Convierte todas las letras en mayuacutesculas

Puedes consultar todos los meacutetodos de la clase String en la documentacioacuten oficial3A continuacioacuten tienes un ejemplo en el que se usan los meacutetodos descritos anterior-mente

Ejemplos de uso de String author Luis Joseacute Saacutenchez

public class EjemplosString

public static void main(String[] args)

Systemoutprintln(nEjemplo 1)

Systemoutprintln(En la posicioacuten 2 de berengena estaacute la letra

3httpdocsoraclecomjavase7docsapijavalangStringhtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 169

+ berengenacharAt(2))

Systemoutprintln(nEjemplo 2)

String frase = Hola caracola

char[] trozo = new char[10]trozo[0] = z trozo[1] = z trozo[2] = z

frasegetChars(2 7 trozo 1)

Systemoutprint(El array de caracteres vale )

Systemoutprintln(trozo)

Systemoutprintln(nEjemplo 3)

Systemoutprintln(La secuencia co aparece en la frase en la posicioacuten

+ fraseindexOf(co))

Systemoutprintln(nEjemplo 4)

Systemoutprintln(La palabra murcieacutelago tiene

+ murcieacutelagolength() + letras)

Systemoutprintln(nEjemplo 5)

String frase2 = frasereplace(o u)

Systemoutprintln(frase2)

Systemoutprintln(nEjemplo 6)

frase2 = frasesubstring(3 10)

Systemoutprintln(frase2)

Systemoutprintln(nEjemplo 7)

Systemoutprintln(frasetoLowerCase())

Systemoutprintln(nEjemplo 8)

Systemoutprintln(frasetoUpperCase())

A continuacioacuten se muestra un programa que procesa archivos de texto Lo que hacees cambiar cada tabulador por dos espacios en blanco Lo hice a propoacutesito cuandoestaba escribiendo este manual ya que el estaacutendar de Google para la codificacioacuten enJava4 especifica que la sangriacutea debe ser precisamente de dos espacios Teniacutea muchosprogramas escritos en Java (ejemplos y soluciones a ejercicios) que no cumpliacutean esterequisito porque la sangriacutea estaba aplicada con el caraacutecter de tabulacioacuten teniacutea dosposibilidades abrir todos y cada uno de los ficheros y cambiarlo a mano o escribir unprograma que lo hiciera Opteacute por la segunda opcioacuten y aquiacute tienes el programa iquestverdadque es muy sencillo

4httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 170

import javaioBufferedReaderimport javaioBufferedWriterimport javaioFileimport javaioFileReaderimport javaioFileWriterimport javaioIOException

Cambia los tabuladores por 2 espacios author Luis Joseacute Saacutenchez

public class EjemploProcesamiento10

public static void main(String[] args)

for (int i = 0 i lt argslength i++)

Systemoutprint(Procesando el archivo + args[i] + )

try

renombra el fichero antildeadiendo tmpFile ficheroOriginal = new File(args[i])

File ficheroTemporal = new File(args[i] + tmp)

ficheroOriginalrenameTo(ficheroTemporal)

lee los datos del archivo temporalBufferedReader bf = new BufferedReader(new FileReader(args[i] + tmp))

crea un fichero nuevo con el nombre originalBufferedWriter bw = new BufferedWriter(new FileWriter(args[i]))

String linea =

while ( linea = null )

linea = bfreadLine()

if (linea = null)

cambia el tabulador por 2 espacioslinea = lineareplace(t )

bwwrite(linea + n)

bfclose()

bwclose()

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 171

borra el fichero temporalficheroTemporaldelete()

catch (IOException ioe)

Systemoutprintln(Se ha producido un error de lecturaescritura)

Systemerrprintln(ioegetMessage())

Systemoutprintln(hecho)

118 Ejercicios

Ejercicio 1Escribe un programa que guarde en un fichero con nombre primosdat losnuacutemeros primos que hay entre 1 y 500

Ejercicio 2Realiza un programa que lea el fichero creado en el ejercicio anterior y quemuestre los nuacutemeros por pantalla

Ejercicio 3Escribe un programa que guarde en un fichero el contenido de otros dosficheros de tal forma que en el fichero resultante aparezcan las liacuteneas de losprimeros dos ficheros mezcladas es decir la primera liacutenea seraacute del primerfichero la segunda seraacute del segundo fichero la tercera seraacute la siguiente delprimer fichero etcLos nombres de los dos ficheros origen y el nombre del fichero destino se debenpasar como argumentos en la liacutenea de comandosHay que tener en cuenta que los ficheros de donde se van cogiendo las liacuteneaspueden tener tamantildeos diferentes

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 172

Ejercicio 4Realiza un programa que sea capaz de ordenar alfabeacuteticamente las palabrascontenidas en un fichero de texto El nombre del fichero que contiene laspalabras se debe pasar como argumento en la liacutenea de comandos El nombredel fichero resultado debe ser el mismo que el original antildeadiendo la coletillasort por ejemplo palabras_sorttxt Suponemos que cada palabra ocupa unaliacutenea

Ejercicio 5Escribe un programa capaz de quitar los comentarios de un programa de JavaSe utilizariacutea de la siguiente maneraquita_commentarios PROGRAMA_ORIGINAL PROGRAMA_LIMPIO

Por ejemploquita_comentarios holajava holav2java

crea un fichero con nombre holav2java que contiene el coacutedigo de holajava perosin los comentarios

Ejercicio 6Realiza un programa que diga cuaacutentas ocurrencias de una palabra hay en unfichero Tanto el nombre del fichero como la palabra se deben pasar comoargumentos en la liacutenea de comandos

12 Aplicaciones web en Java (JSP)Hasta el momento los programas realizados funcionan en una austera ventana determinal No se trata de algo casual hemos elegido esta manera de trabajar de formadeliberada para que el estudiante se centre en resolver el problema y no se distraigadaacutendole sombra a un botoacuten o escogiendo la mejor imagen de fondo para un listadoLlegamos no obstante a un punto en que algunos programas piden a gritos unaapariencia maacutes vistosaEn este capiacutetulo vamos a aprender coacutemo utilizar paacuteginas web como interfaz paraprogramas en Java Usaremos JSP (JavaServer Pages) que nos permitiraacute mezclar coacutedigoen Java con coacutedigo HTML El coacutedigo en Java que utilizaremos seraacute muy parecido alque hemos venido utilizando hasta ahora Cambiaraacute uacutenicamente lo relativo a mostrarinformacioacuten por pantalla (ahora se volcaraacute todo a HTML) y la manera en que seintroducen los datos que se realizaraacute mediante formularios

El lector deberaacute tener unos conocimientos baacutesicos de HTML para entender bieny sacar provecho de este capiacutetulo Una web excelente para aprender HTML esW3Schools1

El estaacutendar de programacioacuten de Google para el coacutedigo fuente escrito en Java2 noespecifica ninguna regla en cuanto a la manera de nombrar los ficheros correspon-dientes a las aplicaciones JSP Por tanto vamos a adoptar las convenciones de Oracle3

en esta materia Seguacuten estas convenciones los nombres de los ficheros JSP debenestar escritos en lowerCamelCase es decir la primera letra siempre es minuacutesculay en caso de utilizar varias palabras dentro del nombre eacutestas van seguidas unade otra empezando cada una por mayuacutescula Finalmente se antildeade la extensioacuten jspPor ejemplo listadoSociosjsp es un nombre correcto mientras que ListadoSociosjsplistado_sociosjsp o Listadosociosjsp son incorrectos

121 Hola Mundo en JSP

Para desarrollar aplicaciones en JSP utilizaremos el entorno de desarrollo NetbeansEste IDE se puede descargar de forma gratuita en httpsnetbeansorgdownloadsnota12_-14

Sigue estos pasos para crear una aplicacioacuten en JSP con Netbeans1httpw3schoolscom2httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml3httpwwworaclecomtechnetworkarticlesjavasecode-convention-138726html4ParamaacutesdetallessobrelainstalacioacutenyconfiguracioacutendeNetbeansverel[ApeacutendiceB](apendiceb)

173

Aplicaciones web en Java (JSP) 174

bull En el menuacute principal selecciona Archivo y a continuacioacuten Nuevo Proyecto Sepuede hacer maacutes raacutepido con la combinacioacuten Control + Mayuacutescula + N

bull Apareceraacute una ventana emergente para elegir el tipo de proyecto SeleccionaJava Web en el apartado ldquoCategoriacuteasrdquo y Aplicacioacuten Web en el apartadoldquoProyectosrdquo Haz clic en Siguiente

bull Ahora hay que darle el nombre al proyecto lo puedes llamar por ejemploSaludo1 Recuerda no utilizar caracteres especiales ni signos de puntuacioacuten Secrearaacute una carpeta con el mismo nombre que el proyecto que contendraacute todoslos ficheros necesarios Haz clic en Siguiente

bull En la siguiente ventana tendraacutes que elegir el servidor la versioacuten de Java y laruta Elige Glass Fish Server En caso de no haber ninguacuten servidor disponibleNetbeans permite antildeadir uno sobre la marcha (se lo descarga y lo instala) Hazclic en Finalizar

A la izquierda en la ventana de proyectos debe aparecer el que acabas de crearSaludo1 Navegando por la estructura del proyecto veraacutes que hay una carpeta connombre Web Pages en esta carpeta se deberaacuten guardar los archivos correspondien-tes a la aplicacioacuten archivos jsp html css imaacutegenes archivos de audio etc Para quelos archivos esteacuten ordenados se pueden organizar a su vez en subcarpetas dentrode Web PagesPor defecto cuando se crea un proyecto JSP se crea el archivo indexhtml Elimina estearchivo de tu proyecto y luego crea indexjsp haciendo clic con el botoacuten derecho enWeb Pages rarr Nuevo rarr JSP Al indicar el nombre no hay que poner la extensioacutenYa tienes un ldquoHola Mundordquo en ingleacutes Si lo quieres en espantildeol solo tienes que cambiarldquoHello Worldrdquo por ldquoHola Mundordquo con lo que la aplicacioacuten quedariacutea como sigue

lt-- saludo1jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Mundolth1gt

En esta paacutegina se usa uacutenicamente HTML

ltbodygt

lthtmlgt

Para ejecutar la aplicacioacuten hay que hacer clic en el botoacuten verde Ejecutar Proyecto opulsar F6 En ese momento Netbeans buscaraacute un fichero con el nombre indexjsp ylo lanzaraacute en el navegador

Aplicaciones web en Java (JSP) 175

Observa que el programa del ejemplo se llama saludo1jsp y no indexjsp En estecaso para ejecutar la aplicacioacuten hay que hacer clic con el botoacuten derecho encima desaludo1jsp y seleccionar EjecutarDe momento solo hemos visto coacutedigo HTML iquestdoacutende estaacute Java Bien vamos a verlopero antes hay entender bien coacutemo funciona JSPUna aplicacioacuten JSP consistiraacute en una o varias paacuteginas web que normalmente contendraacutecoacutedigo HTML y que llevaraacuten ldquoinsertadordquo coacutedigo en Java Este coacutedigo en Java puedecolocarse en cualquier parte del archivo y se delimita mediante las etiquetas lt y gtCuando se pulsa F6 para ejecutar la aplicacioacuten sucede lo siguiente

1 Todo el coacutedigo (tanto HTML como JAVA) se enviacutea al servidor (Glass Fish o ApacheTomcat por ejemplo)

2 El servidor deja intacto el coacutedigo HTML y compila y ejecuta el coacutedigo en JavaGeneralmente el coacutedigo Java genera coacutedigo HTML mediante las instruccionesoutprint y outprintln

3 Por uacuteltimo todo el coacutedigo (ya solo queda HTML) se enviacutea al navegador que es elque muestra la paacutegina Recuerda que el navegador no entiende Java (entiendeJavascript que es otro lenguaje diferente) y es imprescindible que todo el coacutedigoJava haya sido traducido previamente

122 Mezclando Java con HTML

A continuacioacuten se muestra un ejemplo que siacute tiene Java Como ves el coacutedigo Java estaacutedelimitado por los caracteres lt y gt

lt-- saludo2jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt outprintln(lth1gtiexclHola Mundolth1gt) gt

ltbodygt

lthtmlgt

Mediante Java se puede generar cualquier contenido HTML por ejemplo para modi-ficar estilos crear tablas mostrar imaacutegenes etc Trabajando en consola lo que seincluye en un print es exactamente lo que se muestra por pantalla Ahora con JSP loque se incluye dentro del print es ldquorenderizadordquo a posteriori por el navegador En elsiguiente ejemplo se puede ver claramente este comportamiento

Aplicaciones web en Java (JSP) 176

lt-- saludo3jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Caracolalth1gt

lt outprint(ltbgtltigt) gt

Esta liacutenea se ha puesto en negrita y cursiva mediante Java

lt outprint(ltigtltbgt) gt

ltbodygt

lthtmlgt

Es muy uacutetil ver el coacutedigo fuente que se ha generado una vez que se puede visualizarla aplicacioacuten en el navegador Para ver el coacutedigo fuente tanto en Firefox como enChrome hay que hacer clic con el botoacuten derecho en la paacutegina y seleccionar la opcioacutenldquoVer coacutedigo fuente de la paacuteginardquoCuando el contenido que se quiere volcar en HTML es el resultado de una expresioacutense pueden utilizar de forma opcional las etiquetas lt= y gt

lt-- saludo4jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Caracolalth1gt

lt= ltbgtltigt gt

Esta liacutenea se ha puesto en negrita y cursiva mediante Java

lt= ltigtltbgt gt

ltbodygt

lthtmlgt

En el coacutedigo Java que se inserta en las aplicaciones JSP se pueden utilizar todos loselemento del lenguaje vistos anteriormente bucles sentencias de control arraysdiccionarios etcEn el siguiente ejemplo se utiliza un bucle for para mostrar texto en diferentestamantildeos utilizando las etiquetas desde la lth6gt (cabecera pequentildea) hasta la lth1gt

(cabecera maacutes grande)

Aplicaciones web en Java (JSP) 177

lt-- pruebaVariable1 --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

for (int i = 1 i lt 7 i++)

outprintln(lth + (7-i) + gt+ i + lth + (7-i) + gt)

gt

ltbodygt

lthtmlgt

El coacutedigo en Java se puede insertar en cualquier parte dentro del coacutedigo HTML eincluso se pueden insertar varios trozos como se puede ver en el siguiente ejemploAunque una variable se haya definido en una determinada zona su aacutembito deactuacioacuten no se ve reducido a ese fragmento de coacutedigo sino que se puede utilizarposteriormente en otro lugar de la aplicacioacutenObserva que en el siguiente ejemplo la definicioacuten e inicializacioacuten de la variable x serealiza en un bloque de coacutedigo en Java y que luego esta variable se utiliza en otros dosbloques diferentes

lt-- pruebaVariable2 --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt int x = 3 gt

lthlt outprint(x) gtgtholalthlt outprint(x) gtgt

ltbodygt

lthtmlgt

En ocasiones puede ser uacutetil recabar informacioacuten del sistema versioacuten de Java en usosistema operativo nombre de usuario etc Estos datos se pueden obtener medianteSystemgetProperty(propiedad)

Aplicaciones web en Java (JSP) 178

lt-- muestraInfojsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtInformacioacuten del entorno de trabajolth1gt

lt

outprint(Fabricante de Java + SystemgetProperty(javavendor))

outprint(ltbrgtUrl del fabricante + SystemgetProperty(javavendorurl))

outprint(ltbrgtVersioacuten + SystemgetProperty(javaversion))

outprint(ltbrgtSistema operativo + SystemgetProperty(osname))

outprint(ltbrgtUsuario + SystemgetProperty(username))

gt

ltbodygt

lthtmlgt

Para mostrar informacioacuten en una paacutegina de forma ordenada es muy frecuente utilizartablas Las tablas son especialmente uacutetiles para mostrar listados obtenidos de unabase de datos como veremos en el siguiente capiacutetuloEn el siguiente ejemplo se muestra una tabla con dos columnas en la primera columnase muestran los nuacutemeros del 0 al 9 y en la segunda sus correspondientes cuadrados

lt-- tablajsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltbodygt

lth1gtEjemplo de tablalth1gt

lttable border=2gt

lttrgt

lttdgtNuacutemerolttdgtlttdgtCuadradolttdgt

lttrgt

lt

for(int i = 0 i lt 10 i++)

outprintln(lttrgt)

outprintln(lttdgt + i + lttdgt)

outprintln(lttdgt)

outprintln(i i)

outprintln(lttdgtlttrgt)

Aplicaciones web en Java (JSP) 179

gt

lttablegt

ltbodygt

lthtmlgt

123 Recogida de datos en JSP

En cualquier aplicacioacuten web la introduccioacuten de datos se realiza mediante formulariosAunque se puede hacer todo en la misma paacutegina de momento vamos a tener dos Laprimera paacutegina contendraacute un formulario y seraacute la encargada de recoger la informacioacuteny enviarla a una segunda paacutegina Esta uacuteltima paacutegina recibiraacute los datos realizaraacute unaserie de caacutelculos u operaciones si procede y por uacuteltimo mostraraacute un resultadoEn el primer ejemplo - un proyecto que llamaremos PasoDeCadena - tenemos una paacuteginacon nombre indexjsp que contiene un formulario HTML Este formulario contiene unaentrada de texto donde el usuario introduciraacute una cadena de caracteres Es muyimportante darle un valor a la etiqueta name En el caso que nos ocupa tenemosname=cadenaIntro por tanto el dato que recoge el formulario se llama de esa maneraseriacutea el equivalente al nombre de la variable en Java No menos importante es indicarla paacutegina que recibiraacute los datos que recoge el formulario Esta informacioacuten se indicacon la etiqueta action en nuestro ejemplo action=frasejsp indica que seraacute el ficherofrasejsp el que recibiraacute cadenaIntroEl fichero indexjsp uacutenicamente contiene coacutedigo HTML por tanto se podriacutea llamarindexhtml y la aplicacioacuten funcionariacutea exactamente igual

lt-- indexjsp (proyecto PasoDeCadena) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtPaso de cadenalttitlegt

ltheadgt

ltbodygt

lth1gtPasando una cadena de caractereslth1gt

ltform method=post action=frasejspgt

Introduzca el nombre de una fruta

ltinput type=text name=cadenaIntrogt

ltinput type=submit value=OKgt

ltformgt

ltbodygt

lthtmlgt

Para recoger los datos enviados por un formulario se utiliza requestgetParameter(nombreDeVariable)

donde nombreDeVariable es el dato que se enviacutea desde el formulario En caso de que el

Aplicaciones web en Java (JSP) 180

dato enviado sea un texto que pueda contener tildes o entildees hay que especificar lacodificacioacuten mediante requestsetCharacterEncoding(UTF-8) antes de recoger el dato

lt-- frasejsp (proyecto PasoDeCadena) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtPaso de cadenalttitlegt

ltheadgt

ltbodygt

lt requestsetCharacterEncoding(UTF-8) gt

Me gusta mucho comer

lt outprint(requestgetParameter(cadenaIntro))gt

ltbodygt

lthtmlgt

En el siguiente ejemplo llamado Incrementa5 se muestra coacutemo manipular en JSP un datonumeacuterico La aplicacioacuten recoge un nuacutemero y luego muestra ese nuacutemero incrementadoen 5 unidades

lt-- indexjsp (proyecto Incrementa5) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

ltform method=get action=incrementa5jspgt

Introduzca un nuacutemero (puede tener decimales)

ltinput type=text name=numeroIntrogt

ltinput type=submit value=OKgt

ltformgt

ltbodygt

lthtmlgt

Observa en el fichero incrementa5jsp coacutemo se transforma la cadena de caracteresque se recibe en numeroIntro en un dato numeacuterico con el meacutetodo DoubleparseDoubleexactamente igual que si estuvieacuteramos leyendo un nuacutemero desde teclado en laventana de terminal

Aplicaciones web en Java (JSP) 181

lt-- incrementa5jsp (proyecto Incrementa5) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

El nuacutemero introducido maacutes cinco es

lt

double resultado

resultado = DoubleparseDouble(requestgetParameter(numeroIntro)) + 5

outprint(resultado)

gt

ltbodygt

lthtmlgt

El siguiente ejemplo ilustra la recogida y enviacuteo de dos variables x e y Observa queahora el formulario contiene dos entradas de texto una para cada variable

lt-- indexjsp (proyecto Suma) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtSumalttitlegt

ltheadgt

ltbodygt

lth1gtSupercalculadoralth1gt

ltform method=get action=resultadojspgt

x ltinput type=text name=xgtltbrgt

y ltinput type=text name=ygtltbrgt

ltinput type=submitgt

ltformgt

ltbodygt

lthtmlgt

En el fichero resultadojsp se reciben las variables recogidas en indexjsp y se sumanRecuerda que por defecto la informacioacuten enviada por un formulario es una cadenade caracteres Si queremos sumar los valores introducidos debemos transformar lascadenas de caracteres a nuacutemeros enteros con el meacutetodo IntegervalueOf()

Aplicaciones web en Java (JSP) 182

lt-- resultadojsp (proyecto Suma) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtSumalttitlegt

ltheadgt

ltbodygt

La suma es

lt

int primerNumero = IntegervalueOf(requestgetParameter(x))

int segundoNumero = IntegervalueOf(requestgetParameter(y))

outprintln(primerNumero + segundoNumero)

gt

ltbodygt

lthtmlgt

El siguiente proyecto de ejemplo es Animales En la paacutegina principal (indexjsp) se puedeseleccionar un animal - gato o caracol - y un nuacutemero Una vez introducidos los datoseacutestos se enviacutean a animalesjsp

lt-- indexjsp (proyecto Animales) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtAnimaleslttitlegt

ltheadgt

ltbodygt

ltform method=post action=animalesjspgt

Seleccione animal a visualizar

ltselect name=animalgt

ltoptiongtGatoltoptiongt

ltoptiongtCaracolltoptiongt

ltselectgt

ltbrgt

Nuacutemero de animales ltinput type=text name=numero size=3gt

ltbrgt

ltinput type=submitgt

ltformgt

ltbodygt

lthtmlgt

Aplicaciones web en Java (JSP) 183

La paacutegina animalesjsp nos mostraraacute una imagen del animal elegido repetida el nuacutemerode veces que hemos indicado

lt-- animalesjsp (proyecto Animales) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtAnimaleslttitlegt

ltheadgt

ltbodygt

lt

String nombreAnimal = requestgetParameter(animal)

String nombreImagen

if (nombreAnimalequals(Gato))

nombreImagen = gatojpg

else

nombreImagen = caracoljpg

int veces = IntegerparseInt(requestgetParameter(numero))

for (int i = 0 i lt veces i++)

outprint(ltimg src= + nombreImagen + width=20gt)

gt

ltbodygt

lthtmlgt

124 POO en JSP

En las aplicaciones realizadas en JSP se puenden incluir clases definidas por el usuariopara posteriormente crear objetos de esas clases Lo habitual es que el fichero quecontiene la definicioacuten de la clase se encuentre separado del programa principalEn un nuevo proyecto con nombre GatosConClase vamos a crear la clase Gato paraello haz clic derecho sobre el icono del proyecto selecciona Nuevo y luego seleccionaClase de Java El nombre de la clase seraacute Gato y el nombre del paquete seraacute porejemplo daw1El fichero Gatojava quedariacutea como el que se muestra a continuacioacuten

Aplicaciones web en Java (JSP) 184

Gatojava (proyecto GatosConClase)

package daw1

public class Gato

private String nombre

private String imagen

public Gato(String nombre String imagen)

thisnombre = nombre

thisimagen = imagen

public String getNombre()

return nombre

public String getImagen()

return imagen

Override

public String toString()

return ltimg src= + imagen + width=80gtHola soy + nombre + ltbrgt

public String maulla()

return ltimg src= + imagen + width=80gtMiauuuuuuuultbrgt

public String come(String comida)

return ltimg src= + imagen + width=80gtEstoy comiendo + comida + ltbrgt

Hemos creado una clase Gato muy sencilla que uacutenicamente contiene dos atributosel nombre del gato y el nombre del fichero de su foto Como meacutetodos se hanimplementado toString() maulla() y come()

Aplicaciones web en Java (JSP) 185

lt-- indexjsp (proyecto GatosConClase) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltpage import=daw1Gatogt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtGatos con claselttitlegt

ltheadgt

ltbodygt

lth1gtGatos con claselth1gt

lthrgt

lt

Gato g1 = new Gato(Pepe gatojpg)

Gato g2 = new Gato(Garfield garfieldjpg)

Gato g3 = new Gato(Tom tompng)

outprintln(g1)

outprintln(g2)

outprintln(g3)

outprintln(g1maulla())

outprintln(g2come(sardinas))

gt

ltbodygt

lthtmlgt

El coacutedigo Java del programa principal es casi ideacutentico al que tendriacuteamos en unprograma para consolaEl siguiente ejemplo - GatosConClaseYBocadillos - es una mejora del anterior Seantildeaden estilos5 para mostrar lo que dicen los gatos igual que en un coacutemic

Gatojava (proyecto GatosConClaseYBocadillos)

package daw1

public class Gato

private String nombre

private String imagen

public Gato(String nombre String imagen)

thisnombre = nombre

thisimagen = imagen

5httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos12_JSPGatosConClaseYBocadillosestiloscss

Aplicaciones web en Java (JSP) 186

public String getNombre()

return nombre

public String getImagen()

return imagen

Override

public String toString()

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspHola soy + nombre + ampnbspltdivgtltdivgt

public String maulla()

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspMiauuuuuuuuampnbspltdivgtltdivgt

public String come(String comida)

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspEstoy comiendo + comida + ampnbspltdivgtltdivgt

El uacutenico antildeadido al programa principal es una liacutenea situada en la cabecera de la paacuteginaque carga la hoja de estilos estiloscss

lt-- indexjsp (proyecto GatosConClaseYBocadillos) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltpage import=daw1Gatogt

ltDOCTYPE htmlgtlthtmlgt

ltheadgtltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gtlttitlegtGatos con clase y bocadilloslttitlegt

ltlink rel=stylesheet type=textcss href=estiloscss gtltheadgtltbodygtlth1gtGatos con claselth1gtlthrgtlt

Gato g1 = new Gato(Pepe gatojpg)

Aplicaciones web en Java (JSP) 187

Gato g2 = new Gato(Garfield garfieldjpg)

Gato g3 = new Gato(Tom tompng)

outprintln(g1)

outprintln(g2)

outprintln(g3)

outprintln(g1maulla())

outprintln(g2come(sardinas))

gt

ltbodygtlthtmlgt

Aplicaciones web en Java (JSP) 188

125 Ejercicios

Ejercicio 1Crea una aplicacioacuten web en Java que muestre tu nombre y tus datos personalespor pantalla La paacutegina principal debe ser un archivo con la extensioacuten jspComprueba que se lanzan bien el servidor y el navegador web Observa losmensajes que da el servidor Fiacutejate en la direccioacuten que aparece en la barra dedirecciones del navegador

Ejercicio 2Mejora el programa anterior de tal forma que la apariencia de la paacuteginaweb que muestra el navegador luzca maacutes bonita mediante la utilizacioacuten deCSS (utiliza siempre ficheros independientes para CSS para no mezclarlo conHTML)

Ejercicio 3Escribe una aplicacioacuten que pida tu nombre A continuacioacuten mostraraacute ldquoHolardquoseguido del nombre introducido El nombre se deberaacute recoger mediante unformulario

Ejercicio 4Realiza una aplicacioacuten que calcule la media de tres notas

Ejercicio 5Realiza un conversor de euros a pesetas

Ejercicio 6Realiza un conversor de pesetas a euros

Ejercicio 7Combina las dos aplicaciones anteriores en una sola de tal forma que en lapaacutegina principal se pueda elegir pasar de euros a pesetas o de pesetas a eurosAdorna la paacutegina con alguna foto o dibujo

Aplicaciones web en Java (JSP) 189

Ejercicio 8Realiza una aplicacioacuten que pida un nuacutemero y que luego muestre la tabla demultiplicar de ese nuacutemero El resultado se debe mostrar en una tabla (lttablegten HTML)

Ejercicio 9Realiza una aplicacioacuten que pinte una piraacutemide La altura se pediraacute en unformulario La piraacutemide estaraacute hecha de bolitas ladrillos o cualquier otraimagen

Ejercicio 10Realiza un cuestionario con 10 preguntas tipo test sobre las asignaturasque se imparten en el curso Cada pregunta acertada sumaraacute un punto Elprograma mostraraacute al final la calificacioacuten obtenida Paacutesale el cuestionario a tuscompantildeeros y piacutedeles que lo hagan para ver queacute tal andan de conocimientosen las diferentes asignaturas del curso Utiliza radio buttons en las preguntasdel cuestionario

Ejercicio 11Escribe una aplicacioacuten que genere el calendario de un mes Se pediraacute elnombre del mes el antildeo el texto que queremos que aparezca sobre elcalendario el diacutea de la semana en que cae el diacutea 1 y el nuacutemero de diacuteas quetiene el mes

Ejercicio 12Mejora la aplicacioacuten anterior de tal forma que no haga falta introducir el diacuteade la semana en que cae el diacutea 1 y el nuacutemero de diacuteas que tiene el mes Elprograma debe deducir estos datos del mes y el antildeo Pista puedes usar laclase Calendar (javautilCalendar)

Ejercicio 13Transforma el test de infidelidad realizado anteriormente para consola en unaaplicacioacuten web

Aplicaciones web en Java (JSP) 190

Ejercicio 14Escribe un programa que muestre los n primeros teacuterminos de la serie deFibonacci El primer teacutermino de la serie de Fibonacci es 0 el segundo es 1y el resto se calcula sumando los dos anteriores por lo que tendriacuteamos quelos teacuterminos son 0 1 1 2 3 5 8 13 21 34 55 89 144hellip El nuacutemero n sedebe introducir por teclado

Ejercicio 15Realiza una aplicacioacuten que genere 100 nuacutemeros aleatorios del 1 al 200 Losprimos deberaacuten aparecer en un color diferente al resto

Ejercicio 16Realiza una aplicacioacuten que muestre la tirada aleatoria de tres dados de poacutekerUtiliza imaacutegenes de dados reales

Ejercicio 17Realiza un configurador del interior de un vehiacuteculo El usuario puede elegirmediante un formulario el color de la tapiceriacutea ndash blanco negro o berengena -y el material de las molduras ndash madera o carbono Se debe mostrar el interiordel coche tal y como lo quiere el usuario

Ejercicio 18Crea la aplicacioacuten ldquoEl Trilerdquo Deben aparecer tres cubiletes por pantalla y elusuario deberaacute seleccionar uno de ellos Para dicha seleccioacuten se puede usar unformulario con radio-button una lista desplegable hacer clic en el cubilete o loque resulte maacutes faacutecil Se levantaraacuten los tres cubiletes y se veraacute si estaba o nola bolita dentro del que el usuario indicoacute asiacute mismo se mostraraacute un mensajediciendo ldquoLo siento no has acertadordquo o ldquoiexclEnhorabuena has encontrado labolitardquo La probabilidad de encontrar la bolita es de 13

Ejercicio 19Crea el juego ldquoApuesta y ganardquo El usuario debe introducir inicialmente unacantidad de dinero A continuacioacuten apareceraacute por pantalla una imagen deforma aleatoria Si sale una calavera el usuario pierde todo su dinero y terminael juego Si sale medio limoacuten el usuario pierde la mitad del dinero y puedeseguir jugando con esa cantidad o puede dejar de jugar Si sale el gato chinode la suerte el usuario multiplica por dos su dinero y puede seguir jugandocon esa cantidad o puede dejar de jugar

Aplicaciones web en Java (JSP) 191

Ejercicio 20Crea una aplicacioacuten que dibuje un tablero de ajedrez mediante una tabla HTMLgenerada con bucles usando JSP y que situacutee dentro del tablero un alfil y uncaballo en posiciones aleatorias Las dos figuras no pueden estar colocadas enla misma casilla Las filas y las columnas del tablero deben estar etiquetadascorrectamente

13 Acceso a bases de datosEn el capiacutetulo 11 vimos coacutemo almacenar informacion en ficheros de texto de tal formaque esta informacioacuten no se pierde cuando el programa se cierra Normalmente losficheros de texto se usan en casos concretos como archivos de configuracioacuten o archivosde registro (log)Las bases de datos relacionales entran en juego cuando se necesita almacenar muchainformacioacuten y ademaacutes esta informacioacuten es homogeacutenea y se puede representarmediante tablas Por ejemplo una aplicacioacuten que permita gestionar la matriculacioacutende los alumnos de un centro educativo deberaacute ser capaz de almacenar los datos degran cantidad de alumnos (puede que miles) En este caso concreto cada alumno serepresenta mediante un registro que contiene determinados datos como el nuacutemerode expediente el nombre los apellidos la nota media etc A estos datos se les llamacamposEn este capiacutetulo vamos a ver coacutemo se puede acceder mediante Java a una basede datos relacional MySQL para hacer listados insertar nuevos elementos y borrarelementos existentesLos programas de ejemplo que se muestran en este capiacutetulo son aplicaciones JSPaprovechando lo visto en el capiacutetulo anterior aunque tambieacuten se puede acceder auna base de datos desde un programa en Java escrito para la consola

131 Socios de un club de baloncesto

Para ilustrar el acceso a una base de datos mediante Java vamos a utilizar comoejemplo un club de baloncesto Nuestro club necesita tener almacenada la informacioacutende todos los socios Sobre cada socio se necesita saber su nombre completo suestatura su edad y su localidad de residencia Cada socio tendraacute ademaacutes un nuacutemerode identificacioacuten uacutenico que seraacute el nuacutemero de socioNuestra aplicacioacuten consistiraacute en varias paacuteginas JSP que van a permitir ver un listadocon los datos de todos los socios dar de alta un nuevo miembro en el club y tambieacutenborrar o modificar los datos de un determinado socioSi todaviacutea no tienes instalado en tu equipo el gestor de bases de datosMySQL deberaacutesinstalarlo Tambieacuten es recomendable instalar PHPMyAdmin que es una aplicacioacuten quepermite crear y manejar bases de datos MySQL de una forma muy sencilla medianteuna interfaz web

192

Acceso a bases de datos 193

Instalacioacuten de MySQL

sudo apt-get install mysql-server

sudo apt-get install mysql-client

Para el usuario root de MySQL deberaacutes establecer la contrasentildea root para quete funcionen correctamente los ejemplos

Instalacioacuten de PHPMyAdmin

sudo apt-get install phpmyadmin

Para acceder a PHPMyAdmin debes escribir httplocalhostphpmyadmin en labarra de direcciones del navegador

Deberaacutes crear la base de datos MySQL a la que llamaraacutes baloncesto que contendraacuteuna tabla de nombre socio con los campos socioID nombre estatura edad y localidad yluego deberaacutes antildeadir los datos de los socios Todo esto lo tienes ya preparado en unfichero con nombre baloncestosql que estaacute en GitHub en la direccioacuten httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDbaloncestosql Descaacutergate este fichero lo utilizaremos en seguidaA continuacioacuten mostramos un fragmento del fichero baloncestosql para que veas coacutemose crea la base de datos la tabla socio y coacutemo se introducen los datos de muestra

---- Base de datos `baloncesto`--CREATE DATABASE IF NOT EXISTS `baloncesto` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

USE `baloncesto`

-- --------------------------------------------------------

---- Estructura de tabla para la tabla `socio`--

CREATE TABLE IF NOT EXISTS `socio` (

`socioID` int(11) NOT NULL`nombre` varchar(40) COLLATE utf8_spanish2_ci DEFAULT NULL`estatura` int(11) DEFAULT NULL`edad` int(11) DEFAULT NULL`localidad` varchar(30) COLLATE utf8_spanish2_ci DEFAULT NULLPRIMARY KEY (`socioID`)

Acceso a bases de datos 194

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci

---- Volcado de datos para la tabla `socio`--

INSERT INTO `socio` (`socioID` `nombre` `estatura` `edad` `localidad`) VALUES(1235 Bermuacutedez Espada Ana Mariacutea 186 46 Maacutelaga)

(1236 Cano Cuenca Margarita 161 48 Maacutelaga)

En dos sencillos pasos tendraacutes preparada y lista para usar la base de datos de ejemploPara acceder a PHPMyAdmin debes escribir httplocalhostphpmyadmin en la barrade direcciones de tu navegador A continuacioacuten teclea el nombre de usuario y lacontrasentildea Si has instalado MySQL como te hemos indicado tanto el nombre deusuario como la contrasentildea deberiacutean ser root

A continuacioacuten haz clic en la pestantildea Importar y seguidamente en el botoacuten Exami-nar Selecciona el fichero baloncestosql que descargaste antes

Acceso a bases de datos 195

Si has seguido correctamente los pasos ya tienes la base de datos lista para usardesde un programa escrito en Java

132 Preparacioacuten del proyecto de ejemplo

1321 Activar la conexioacuten a MySQL

Abre el entorno Netbeans y crea un nuevo proyecto del tipo Java Web - como vimosen el capiacutetulo 12 - y noacutembralo BaloncestoAhora es necesario activar el servicio de bases de datos Haz clic en la pestantildeaServicios (estaacute junto a la pestantildea Proyectos) Haz clic con el botoacuten derecho enBasesde datos y luego selecciona Nueva conexioacuten A continuacioacuten aparece una ventanapara seleccionar el driver debes seleccionar MySQL (ConnectorJdriver)

Acceso a bases de datos 196

Una vez se haya establecido el servicio veraacutes las bases de datos disponibles en unaestructura de aacuterbol Puedes ir desplegando hasta encontrar la base de datos baloncesto

y la tabla socio que contiene los campos socioID nombre estatura edad y localidad

Una vez activada la conexioacuten a MySQL no es necesario realizarla de nuevo para cada

Acceso a bases de datos 197

proyecto

1322 Incluir la libreriacutea MySQL JDBC

Cada proyecto de aplicacioacuten en Java que haga uso de una base de datos MySQLdeberaacute incluir la libreriacutea MySQL JDBC Para incluir esta libreriacutea despliega el proyectoBaloncesto haz clic con el botoacuten derecho en Libreriacuteas selecciona Antildeadir libreriacuteay por uacuteltimo selecciona MySQL JDBC Driver

133 Listado de socios

El primer ejemplo de acceso a una base de datos mediante Java que veremos seraacute unlistado Si echas un vistazo desde PHPMyAdmin a la tabla socio de la base de datosbaloncesto veraacutes que ya contiene informacioacuten sobre maacutes de 20 socios Nuestro primerejemplo seraacute una aplicacioacuten en Java que mueste todos esos datos en una paacuteginaweb Copia el archivo listadoSociosjsp1 a la carpeta principal del proyecto (donde estaacuteindexhtml) Para ejecutarlo haz clic con el botoacuten derecho y selecciona EjecutarA continuacioacuten tienes el coacutedigo JSP del listado de socios

1httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDBaloncestolistadoSociosjsp

Acceso a bases de datos 198

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtListado Socioslttitlegt

ltheadgt

ltbodygt

lth1gtListado de Socioslth1gt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balonce

storoot root)

Statement s = conexioncreateStatement()

ResultSet listado = sexecuteQuery (SELECT FROM socio)

while (listadonext())

outprintln(listadogetString(socioID) + + listadogetString(nombre) + ltbrgt

)

conexionclose()

gt

ltbodygt

lthtmlgt

Si todo ha salido bien al ejecutar el archivo - haciendo clic con el botoacuten derecho sobreel archivo y seleccionando Ejecutar - veraacutes por pantalla un listado como el siguientecon el nuacutemero y el nombre de cada socio

Acceso a bases de datos 199

Vamos a ldquodiseccionarrdquo el coacutedigo Las siguientes tres liacuteneas son obligatorias y deberaacutescopiarlas en todas las paacuteginas JSP que accedan a una base de datos Lo uacutenico quetendraacutes que cambiar es el nombre de la base de datos - la de nuestro ejemplo sellama baloncesto - seguacuten el caso

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306baloncesto

root root)

Statement s = conexioncreateStatement()

La siguiente liacutenea ejecuta la consulta

SELECT FROM socio

sobre la base de datos y guarda el resultado en el objeto listado Esta consulta extraetodos los datos () de la tabla socio Si quisieacuteramos obtener esos datos ordenados pornombre la consulta seriacutea

SELECT FROM socio ORDER BY nombre

Aquiacute estaacute la liacutenea en cuestioacuten

Acceso a bases de datos 200

ResultSet listado = sexecuteQuery (SELECT FROM socio)

Una vez extraiacutedos los datos en bruto hace falta ir sacando cada uno de los registroses decir cada una de las liacuteneas En cada liacutenea se van a mostrar los datos de un socioPara ello usamos un while que va extrayendo liacuteneas mientras quede alguna en el objetolistado

while (listadonext())

outprintln(listadogetString(socioID) + + listadogetString(nombre) + ltbrgt)

Observa que el meacutetodo getString toma como paraacutemetro el nombre de un campoEn este ejemplo estamos mostrando uacutenicamente los nuacutemeros de socio con suscorrespondientes nombres Si quisieacuteramos mostrar tambieacuten la altura de cada sociola podemos extraer mediante listadogetString(altura)

134 Alta

Para dar de alta un nuevo socio necesitamos recoger los datos mediante un formularioque puede ser un programa JSP o simplemente una paacutegina HTML Estos datos recogidospor el formulario seraacuten enviados a otra paacutegina encargada de grabarlos en la tabla socio

de la base de datos baloncesto mediante el comando INSERT de SQLA continuacioacuten se muestra el coacutedigo de formularioSociojsp que recoge los datos delnuevo socio Como puedes comprobar es un simple formulario HTML y no contienecoacutedigo en Java

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgtlthtmlgtltheadgtltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgtltbodygtlth2gtIntroduzca los datos del nuevo sociolth2gtltform method=get action=grabaSociojspgtNordm socio ltinput type=text name=numerogtltbrgtNombre ltinput type=text name=nombregtltbrgtEstatura ltinput type=text name=estaturagtltbrgtEdad ltinput type=text name=edadgtltbrgtLocalidad ltinput type=text name=localidadgtltbrgtltinput type=submit value=Aceptargt

ltformgtltbodygt

lthtmlgt

Acceso a bases de datos 201

El siguiente programa - grabaSociojsp - se encarga de tomar los datos que enviacuteaformularioSociojsp y grabarlos en la base de datosIgual que en los programas del capiacutetulo 12 incluimos esta liacutenea para poder recogercorrectamente cadenas de caracteres que contienen tildes la letra ntilde etc

requestsetCharacterEncoding(UTF-8)

La variable insercion es una cadena de caracteres en la que se va componiendo a basede ir juntando trozos la sentencia SQL correspondiente a la insercioacuten

String insercion = INSERT INTO socio VALUES (

+ IntegervalueOf(requestgetParameter(numero))

+ + requestgetParameter(nombre)

+ + IntegervalueOf(requestgetParameter(estatura))

+ + IntegervalueOf(requestgetParameter(edad))

+ + requestgetParameter(localidad) + )

Una vez que se han recogido los datos del formulario y se ha creado la cadena en lavariable insercion deberiacutea quedar algo como esto

INSERT INTO socio VALUES (6789 Brito Fino Alan 180 40 Benalmaacutedena)

Por uacuteltimo se ejecuta la sentencia de insercioacuten mediante sexecute(insercion)A continuacioacuten tienes el coacutedigo completo de grabaSociojsp

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

requestsetCharacterEncoding(UTF-8)

Acceso a bases de datos 202

String insercion = INSERT INTO socio VALUES (

+ IntegervalueOf(requestgetParameter(numero))

+ + requestgetParameter(nombre)

+ + IntegervalueOf(requestgetParameter(estatura))

+ + IntegervalueOf(requestgetParameter(edad))

+ + requestgetParameter(localidad) + )

sexecute(insercion)

conexionclose()

gt

Socio dado de alta

ltbodygt

lthtmlgt

Al componer una sentencia SQL concatenando trozos es frecuente que seproduzcan errores porque faltan o sobran comillas pareacutentesis comas etc Sise produce un error al ejecutar la sentencia la manera maacutes faacutecil de detectarloes mostrar por pantalla la sentencia Por ejemplo si la sentencia es unainsercioacuten de datos y la cadena de caracteres que la contiene se llama insercioncomo en el ejemplo que acabamos de ver simplemente tendriacuteamos queescribir outprintln(insercion)

135 Borrado

El borrado al igual que el alta se realiza en dos pasos En el primer paso se carga lapaacutegina pideNumeroSociojsp que muestra en una tabla todos los socios cada uno en unafila Junto a cada socio se coloca un botoacuten borrar que al ser pulsado enviacutea el nuacutemerode socio a la paacutegina borraSociojsp que se encarga de ejecutar la sentencia SQL deborradoLa tabla con los socios y los botones de borrado quedariacutea como se muestra acontinuacioacuten

Acceso a bases de datos 203

A continucacioacuten se muestra el coacutedigo de pideNumeroSociojsp El fichero estiloscss2 seencuentra disponible en GitHub igual que el resto de archivos

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltlink rel=stylesheet type=textcss href=estiloscss gt

ltheadgt

ltbodygt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

2httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDBaloncestoestiloscss

Acceso a bases de datos 204

ResultSet listado = sexecuteQuery (SELECT FROM socio)

gt

lttablegt

lttrgtltthgtCoacutedigoltthgtltthgtNombreltthgtltthgtEstaturaltthgtltthgtEdadltthgtltthgtLocalidadltthgtlt

trgt

lt

while (listadonext())

outprintln(lttrgtlttdgt)

outprintln(listadogetString(socioID) + lttdgt)

outprintln(lttdgt + listadogetString(nombre) + lttdgt)

outprintln(lttdgt + listadogetString(estatura) + lttdgt)

outprintln(lttdgt + listadogetString(edad) + lttdgt)

outprintln(lttdgt + listadogetString(localidad) + lttdgt)

gt

lttdgt

ltform method=get action=borraSociojspgt

ltinput type=hidden name=codigo value=lt=listadogetString(socioID) gtgt

ltinput type=submit value=borrargt

ltformgt

lttdgtlttrgt

lt

whileconexionclose()

gt

lttablegt

ltbodygt

lthtmlgt

A continuacioacuten se muestra el coacutedigo de borraSociojsp Como puedes comprobar lasentencia SQL que borra el registro deseado es un DELETE que toma como referencia elnuacutemero de socio para realizar el borrado

ltpage import=javasqlResultSetgt

ltpage import=javasqlStatementgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

Acceso a bases de datos 205

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

sexecute (DELETE FROM socio WHERE socioID= + requestgetParameter(codigo))

gt

ltscriptgtdocumentlocation = pideNumeroSociojspltscriptgt

ltbodygt

lthtmlgt

136 CRUD completo con Bootstrap

Los programas que ofrecen la posibilidad de hacer listados y de realizar modificacionesy borrado sobre los registros de una tabla se denominan CRUD que son las siglas eningleacutes de Create Read Update y Delete en espantildeol se diriacutea que es un programa dealta listado modificacioacuten y borrado El coacutedigo fuente completo estaacute disponible en lacarpeta BaloncestoMejorado de nuestro repositorio en GitHub3

Para dar de alta un nuevo socio simplemente habriacutea que rellenar los campos delformulario que aparecen en la primera liacutenea y hacer clic en el botoacuten Antildeadir Laaplicacioacuten comprueba si el nuacutemero de socio introducido ya existe en la base de datosy en tal caso muestra un mensaje de error recuerda que el nuacutemero de socio es uacutenico

3httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciostreemasterejemplos13_JSP_y_BBDDBaloncestoMejorado

Acceso a bases de datos 206

El borrado se lleva a cabo de la misma manera que en el ejemplo del apartado anteriorEl botoacuten Modificar nos lleva a otra paacutegina que contiene un formulario con todos losdatos del socio donde podemos modificar la informacioacuten necesaria A continuacioacuten semuestra una captura

Para los estilos - colores botones iconos etc - hemos utilizado Boostrap4 Boostrapes un framework que incluye unos estilos predefinidos para que con solo incluirloen nuestro proyecto la aplicacioacuten tenga una apariencia bonita y homogeacutenea Puedesencontrar maacutes informacioacuten de coacutemo utilizar este framework en la paacutegina oficial deBoostrap5

4httpgetbootstrapcom5httpgetbootstrapcom

Acceso a bases de datos 207

137 Ejercicios

Ejercicio 1Establece un control de acceso mediante nombre de usuario y contrasentildeapara alguno de los programas de la relacioacuten anterior (por ejemplo el quepinta una piraacutemide) Lo primero que apareceraacute por pantalla seraacute un formulariopidiendo el nombre de usuario y la contrasentildea Si el usuario y la contrasentildea soncorrectos se podraacute acceder al ejercicio en caso contrario volveraacute a aparecerel formulario pidiendo los datos de acceso y no se nos dejaraacute ejecutar laaplicacioacuten hasta que iniciemos sesioacuten con un nombre de usuario y contrasentildeacorrectos Los nombres de usuario y contrasentildeas deben estar almacenados enla tabla de una base de datos

Acceso a bases de datos 208

Ejercicio 2Mejora el programa anterior de tal forma que se puedan dar de alta nuevosusuarios para acceder a la aplicacioacuten Si se introduce un nombre de usuarioque no sea el administrador (admin) y una contrasentildea correcta la aplicacioacutenfuncionaraacute exactamente igual que el ejercicio anterior Si se introduce elusuario admin y la contrasentildea correcta la aplicacioacuten entra en la gestioacuten deusuarios donde se podraacuten dar de alta nuevos usuarios indicando nombre deusuario y contrasentildea No puede haber dos nombres de usuario iguales aunquesiacute puede haber claves repetidas

Acceso a bases de datos 209

Ejercicio 3Ampliacutea el programa anterior para que se pueda asignar o quitar permiso paraejecutar las aplicaciones de la relacioacuten anterior a los distintos usuarios Porejemplo que se pueda especificar que el usuario ldquojaimitordquo pueda ejecutar losejercicios 2 3 y 5 Para ello en la base de datos deberaacute existir una tabla con lasparejas (usuario nordm ejercicio) Por ejemplo si el usuario ldquojaimitordquo tiene accesoa los ejercicios 2 3 y 5 en la tabla correspondiente estaraacuten las parejas (jaimito2) (jaimito 3) y (jaimito 5) Lo ideal es que la asignacioacuten de permisos se hagamediante el marcado de muacuteltiples ldquocheckboxrdquo

Acceso a bases de datos 210

Ejercicio 4Crea una aplicacioacuten web que permita hacer listado alta baja y modificacioacutensobre la tabla cliente de la base de datos banco Un cliente tiene su identifica-dor nombre completo direccioacuten teleacutefono y fecha de nacimiento

Acceso a bases de datos 211

Ejercicio 5Ampliacutea el programa anterior para que se pueda hacer una buacutesqueda por nom-bre El programa buscaraacute la cadena introducida dentro del campo ldquonombrerdquoy si hay varias coincidencias se mostraraacute una lista de clientes para poderseleccionar uno de ellos y ver todos los datos Si solo hay una coincidencia semostraraacuten directamente los datos del cliente en cuestioacuten

Acceso a bases de datos 212

Ejercicio 6Crea una versioacuten web del programa GESTISIMAL (GESTIoacuten SIMplifcada deAlmaceacuten) para llevar el control de los artiacuteculos de un almaceacuten De cada artiacuteculose debe saber el coacutedigo la descripcioacuten el precio de compra el precio de ventay el stock (nuacutemero de unidades) La entrada y salida de mercanciacutea suponerespectivamente el incremento y decremento de stock de un determinadoartiacuteculo Hay que controlar que no se pueda sacar maacutes mercanciacutea de la que hayen el almaceacuten Aprovecha las opciones que puede ofrecer una interfaz webpor ejemplo para eliminar un artiacuteculo ya no seraacute necesario pedir el coacutedigo sinoque se puede mostrar un listado de todos los artiacuteculos de tal forma que sepuedan borrar un artiacuteculo directamente pulsando un botoacuten

213

Apeacutendice A Ejercicios de ampliacioacuten 214

Apeacutendice A Ejercicios de ampliacioacuten

Ejercicio 1 Transcomunicacioacuten instrumental mediante ficherosde texto digitalesSe conoce la transcomunicacioacuten instrumental (TCI) como la teacutecnica decomunicacioacuten que utiliza aparatos electroacutenicos para establecer comunicacioacutencon los espiacuteritus El caso de TCI maacutes conocido es el de la psicofoniacuteaPara realizar una psicofoniacutea se pone a grabar al aire un dispositivo en unlugar donde previamente hayan ocurrido fenoacutemenos extrantildeos o simplementese invoca la entidad que queremos que se comunique mediante el ritualadecuado Posteriormente se escucha la grabacioacuten para comprobar si se hagrabado algo un mensaje una palabra un grito un lamentohellipLos sonidos extrantildeos se graban gracias a lo que se llama en teacuterminosparapsicoloacutegicos una sentildeal portadora puede ser el chasquido de una ramauna racha de viento un golpe La entidad comunicante aprovecha ese sonidopara supuestamente moldearlo y convertirlo en un mensaje inteligible Muchasde las psicofoniacuteas se realizan utilizando como portadora el ruido que produceuna radio que no estaacute sintonizadaEl ejercicio que se propone es la realizacioacuten de un programa que permitarealizar la TCI mediante la creacioacuten y el posterior anaacutelisis de ficherosde textoEn primer lugar el programa deberaacute generar la portadora que seraacute un ficherode texto creado con caracteres producidos de forma aleatoria Se podraacutenespecificar varios paraacutemetros como el nuacutemero de liacuteneas o paacuteginas que sequieren generar si se incluyen letras uacutenicamente o bien letras y nuacutemerosfrecuencia aproximada de espacios saltos de liacutenea y signos de puntuacioacutenetc Se obtienen portadoras de calidad - con maacutes probabilidad de contenermensajes - cuando la proporcioacuten de las letras que contienen eacutestas coincidecon las del idioma espantildeolFrecuencia de aparicioacuten de letrashttpeswikipediaorgwikiFrecuencia_de_apariciC3B3n_de_letras

Una vez creado el fichero de texto el programa deberaacute ser capaz de analizarloal menos de una forma superficial de modo que nos resulte faacutecil encontrar losposibles mensajes Para realizar este anaacutelisis el programa iraacute comparandouna a una todas las palabras que aparecen en el texto con las que hay enel diccionario de espantildeol En caso de coincidencia la palabra o palabrasencontradas deben aparecer resaltadas con un color diferente al resto deltexto o bien en viacutedeo inverso Opcionalmente se pueden mostrar estadiacutesticascon el nuacutemero total de palabras encontradas distancia media entre esaspalabras palabras reales por cada mil palabras generadas etcEl alumno puede encontrar ficheros con las palabras que tiene el idiomaespantildeol en formato digital en la siguiente direccioacuten Se trata de una muestrahay otros muchos diccionarios disponibles en internethttplasrcsuclaedugeoffispell-dictionarieshtmlSpanish-dicts

Apeacutendice A Ejercicios de ampliacioacuten 215

Ejercicio 2 Coleccioacuten de discos ampliado (con canciones)Este ejercicio consiste en realizar una mejora del ejercicio del capiacutetulo 10que permite gestionar una coleccioacuten de discos Ahora cada disco contienecanciones Deberaacutes crear la clase Cancion con los atributos y meacutetodos queestimes oportunos Antildeade el atributo canciones a la clase Disco Este atributocanciones debe ser un array de objetos de la clase CancionFiacutejate bien que Cancion NO ES una subclase de Disco sino que ahora cadadisco puede tener muchas canciones que estaacuten almacenadas en el atributocancionesModifica convenientemente el meacutetodo toString para que al mostrarse los datosde un disco se muestre tambieacuten la informacioacuten sobre las canciones quecontieneLa aplicacioacuten debe permitir antildeadir borrar y modificar las canciones de losdiscos

Apeacutendice B Entorno de Desarrollo IntegradoNetbeansNetbeans es un IDE (Integrated Development Environment) es decir un Entornode Desarrollo Integrado Consta de un potente editor y de todas las herramientasnecesarias para codificar compilar depurar y ejecutar una aplicacioacutenEste IDE tiene algunas caracteriacutesticas que lo hacen muy atractivo para los programa-dores

bull Es el IDE oficial para desarrollar en Java6bull Chequea errores de sintaxis y da advertencias al mismo tiempo que se escribe el

coacutedigobull Tiene autocompletado inteligente de palabras clave clases meacutetodos paraacuteme-

troshellipbull Permite depurar una aplicacioacuten ejecutaacutendola paso a paso y ver el contendido de

todas las variables en tiempo realbull Soporta muchos lenguajes de programacioacuten ademaacutes de Java PHP Groovy HTML

XML Javascript JSPhellipbull Existe una gran variedad de plugins que ampliacutean las funcionalidades del entorno

Descarga e instalacioacuten

Netbeans se puede descargar de forma gratuita y para cualquier plataforma desdehttpsnetbeansorgdownloads

6Esto no es casualidad ya que es la misma empresa - Oracle - la que estaacute detraacutes del desarrollo de Java y tambieacuten la quesoporta Netbeans

216

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 217

Figura B1 Descarga de Netbeans

El programa de instalacioacuten de Netbeans estaacute disponible en varios paquetes seguacutenel lenguaje de programacioacuten y las tecnologiacuteas que se incluyen En el momento deescribir este libro los paquetes disponibles son Java SE Java EE HTML5JavaScriptPHP CC++ All Este uacuteltimo paquete (All) instala todos los lenguajes y tecnologiacuteasdisponibles para el IDE (sin contar los plugins) Para seguir este libro es suficientecon la versioacuten Java EE sin embargo animo al lector a descargar la versioacuten completa yexperimentar con otros lenguajes diferentes a Java por ejemplo con PHP7

Configuracioacuten

En los ejemplos y soluciones a los ejercicios de este libro nos centildeimos al los estaacuten-dares de programacioacuten de Google para el coacutedigo fuente escrito en el lenguaje deprogramacioacuten Java8 Por tanto despueacutes de la instalacioacuten de Netbeans es necesariorealizar algunso ajustes en la configuracioacuten del editor para cumplir con las siguientescondiciones

7httpsleanpubcomaprendephpconejercicios8httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 218

bull La tecla TAB debe insertar espacios no debe insertar el caraacutecter de tabulacioacutenbull La indentacioacuten debe ser de 2 caracteres (por defecto suele estar a 4)bull La condificacioacuten de caracteres debe ser UTF-8

Para ello selecciona Herramientas rarr Opciones rarr Editor A continuacioacuten seleccionala pestantildea Formato y en el menuacute desplegable correspondiente al lenguaje deprogramacioacuten selecciona Java La configuracioacuten deberiacutea quedar como se indica enla imagen

Figura B2 Configuracioacuten de Netbeans

Creacioacuten de un proyecto

Sigue los pasos que damos a continuacioacuten para crear un nuevo proyecto de Java enNetbeansEn primer lugar desde el menuacute principal selecciona Archivo y a continuacioacuten NuevoProyecto Se puede hacer maacutes raacutepido con la combinacioacuten Control + Mayuacutescula + NVeraacutes que aparece una ventana emergente para elegir el tipo de proyecto SeleccionaJava en el apartado ldquoCategoriacuteasrdquo y Aplicacioacuten Java en el apartado ldquoProyectosrdquo Hazclic en Siguiente

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 219

Figura B3 Nuevo proyecto en Java

Ahora es necesario darle el nombre al proyecto lo puedes llamar por ejemplo SaludoRecuerda no utilizar caracteres especiales ni signos de puntuacioacuten Se crearaacute unacarpeta con el mismo nombre que el proyecto que contendraacute todos los ficherosnecesarios Aseguacuterate de que la casilla Crear la clase principal estaacute marcada Hazclic en Terminar

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 220

Figura B4 Proyecto ldquoSaludordquo

Veraacutes que se ha creado el ldquoesqueletordquo de la aplicacioacuten La clase principal se llamaSaludo y contiene el main que seraacute el cuerpo principal del programa Observa que en laparte de la izquierda donde estaacuten todos los proyectos que se van realizando puedesver la estructura de carpetas y ficheros El coacutedigo fuente de nuestra aplicacioacuten estaacuteen el fichero Saludojava Escribe dentro del main la siguiente liacutenea

Systemoutprintln(iexclHola mundo)

Para guardar compilar y ejecutar basta con hacer clic en el botoacuten verde con el iconode Play o bien pulsar la tecla F6

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 221

Figura B5 Ejecucioacuten del proyecto

Si todo ha salido bien veraacutes el mensaje iexclHola mundo en la ventana de terminal integradade Netbeans que hay justo debajo del editor

Depuracioacuten

El entornoNetbeans permite la depuracioacuten paso a paso de un programa En ocasioneses complicado encontrar y corregir los fallos de una aplicacioacuten y ayuda mucho tenerla posibilidad de ir ejecutando un programa liacutenea a liacutenea y ver coacutemo van cambiandolas variablesPara ilustrar la depuracioacuten paso a paso vamos a utilizar un programa de ejemplo delCapiacutetulo 7 Arrays en concreto usaremos el coacutedigo de Array03javaCrea un nuevo proyecto de Java como se ha indicado en el apartado anterior y llaacutemaloArray03 A continuacioacuten copia el contenido del main del fichero Array03java en tuproyecto Ten cuidado de no borrar la liacutenea package array03Comenzaremos la ejecucioacuten paso a paso del programa pulsando de manera sucesivala tecla F7

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 222

Figura B6 Ejecucioacuten paso a paso

Observa coacutemo Netbeans resalta una liacutenea la ejecuta se detiene y espera quesigamos pulsando F7 En la parte de abajo ha aparecido una nueva ventana que resultatremendamente uacutetil Se trata de una zona donde puedes ver en tiempo real el valorque tiene cada variable (por supuesto se incluyen los arrays)Ve pulsando F7 hasta colocarte en la liacutenea siguiente

num[2] = 200

En la ventana inferior donde aparecen todos los datos despliega el array num veraacutesque los elementos 0 y 1 ya tienen los valores 8 y 33 respectivamente Si vuelves apulsar F7 veraacutes que ahora en la posicioacuten 2 se ha almacenado el 200Para salir del modo ldquopaso a pasordquo y terminar de ejecutar el programa pulsa F5Ademaacutes de la ejecucioacuten ldquopaso a pasordquo tambieacuten resultan muy uacutetiles los puntos deruptura o breakpoints Se trata de marcas a modo de sentildeales de STOP dondeindicamos pausas en la ejecucioacuten del programa La depuracioacuten de un programa devarios cientos o miles de liacuteneas puede ser muy tediosa si se ejecuta cada liacutenea paso a

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 223

paso con F7 Los breakpoints permiten parar la ejecucioacuten en liacuteneas concretas dondequeremos ver con maacutes detalle queacute estaacute sucediendo en nuestro programaVamos a colocar varios breakpoints en nuestro coacutedigo Haz clic sobre las liacuteneas 15 20y 24 (justo encima del nuacutemero de liacutenea) Observa que estas liacuteneas quedan marcadascon un pequentildeo cuadradito

Figura B7 Breakpoints

Pulsa la combinacioacuten de teclas Control + F5 Observa coacutemo el programa empiezaa ejecutarse con normalidad y se para justo en la liacutenea 15 donde estaacute el primerbreakpoint Pulsando ahora F5 el programa continuacutea ejecutaacutendose hasta que se paraen la liacutenea 20 donde estaacute el segundo breakpoint Otra pulsacioacuten de F5 hace quecontinuacutee la ejecucioacuten hasta la liacutenea 24 Una uacuteltima pulsacioacuten de esta tecla hace que elprograma continuacutee la ejecucioacuten hasta el final

Apeacutendice C Caracteres especialesLiacuteneas para tablas

Bloques

⊞ ⊟ ⊠ ⊡

Figuras de ajedrez

Ciacuterculos

oplus ⊖ otimes ⊘ ⊙ ⊛ ⊜ ⊝ ⴱ ⴲ ⵀ ⵁ ⵔ ⵕ ⵙ ⵚ

Flechas

larr uarr rarr darr harr ↚ ↛ ↠ ↣ ↦ ↮ crarr ⇎ ⇏ lArr uArr rArr dArr hArr ⇴ ⇵ ⇶ ⇷ ⇸ ⇹ ⇺ ⇻ ⇼ ⇽ ⇾ ⇿

Nuacutemeros en ciacuterculos

❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓

Dados

Fichas de dominoacute

127024 127025 127026 127027 127028 127029 127030 127031 127032 127033 127034 127035 127036 127037 127038 127039 127040 127041 127042 127043 127044 127045 127046 127047 127048 127049127050 127051 127052 127053 127054 127055 127056 127057 127058 127059 127060 127061 127062 127063 127064 127065 127066 127067 127068 127069 127070 127071 127072 127073 127074 127075127076 127077 127078 127079 127080 127081 127082 127083 127084 127085 127086 127087 127088 127089 127090 127091 127092 127093 127094 127095 127096 127097 127098 127099 127100 127101 127102 127103 127104 127105 127106 127107 127108 127109 127110 127111 127112 127113127114 127115 127116 127117 127118 127119 127120 127121 127122 127123

224

Apeacutendice C Caracteres especiales 225

Cartas

127136 127137 127138 127139 127140 127141 127142 127143 127144 127145 127146 127147 127148 127149 127150 127153 127154 127155 127156 127157 127158 127159 127160 127161 127162 127163 127164 127165 127166 127169 127170 127171127172 127173 127174 127175 127176 127177 127178 127179 127180 127181 127182 127183 127185 127186 127187 127188 127189 127190 127191 127192 127193 127194 127195 127196 127197 127198 127199

Caras

128045 128046 128049 128053 128512 128513 128514 128515 128516 128517 128518 128519 128520 128521 128522 128523 128524 128525 128526 128527 128528 128529 128530 128531 128532 128533 128534 128535 128536128537 128538 128539 128540 128541 128542 128543 128544 128545 128546 128547 128549 128550 128551 128552 128553 128554 128555 128557 128558 128559 128560 128561 128562 128563 128564 128565 128566 128567 128568 128569128570 128571 128572 128573 128574 128575 128576

Horoacutescopo

Miscelaacutenea

Ω ꙮ

  • Tabla de contenidos
  • Sobre este libro
  • Sobre el autor
  • Centros en los que se usa este libro
  • Introduccioacuten
  • Instalacioacuten y configuracioacuten del entorno de programacioacuten Java
  • iexclHola mundo - Salida de datos por pantalla
    • iexclHola mundo - Mi primer programa
    • Coloreado de texto
    • Ejercicios
      • Variables
        • Definicioacuten y tipos de variables
          • Enteros (int y long)
          • Nuacutemeros decimales (double y float)
          • Cadenas de caracteres (String)
            • Operadores artimeacuteticos
            • Asignacioacuten de valores a variables
            • Conversioacuten de tipos (casting)
            • Ejercicios
              • Lectura de datos desde teclado
                • Lectura de texto
                • Lectura de nuacutemeros
                • La clase Scanner
                • Ejercicios
                  • Sentencia condicional (if y switch)
                    • Sentencia if
                    • Operadores de comparacioacuten
                    • Operadores loacutegicos
                    • Sentencia switch (seleccioacuten muacuteltiple)
                    • Ejercicios
                      • Bucles
                        • Bucle for
                        • Bucle while
                        • Bucle do-while
                        • Ejercicios
                          • Nuacutemeros aleatorios
                            • Generacioacuten de nuacutemeros aleatorios con y sin decimales
                            • Generacioacuten de palabras de forma aleatoria de un conjunto dado
                            • Ejercicios
                              • Arrays
                                • Arrays de una dimensioacuten
                                • Arrays bidimensionales
                                • Recorrer arrays con for al estilo foreach
                                • Ejercicios
                                  • Arrays de una dimensioacuten
                                  • Arrays bidimensionales
                                      • Funciones
                                        • Implementando funciones para reutilizar coacutedigo
                                        • Comentarios de funciones
                                        • Creacioacuten de bibliotecas de rutinas mediante paquetes
                                        • Aacutembito de las variables
                                        • Paso de paraacutemetros por valor y por referencia
                                        • Ejercicios
                                          • Programacioacuten orientada a objetos
                                            • Clases y objetos
                                            • Encapsulamiento y ocultacioacuten
                                            • Meacutetodos
                                              • Creiacute haber visto un lindo gatito
                                              • Meacutetodos getter y setter
                                              • Meacutetodo toString
                                                • Aacutembitovisibilidad de los elementos de una clase - public protected y private
                                                • Herencia
                                                  • Sobrecarga de meacutetodos
                                                    • Atributos y meacutetodos de clase (static)
                                                    • Interfaces
                                                    • Arrays de objetos
                                                    • Ejercicios
                                                      • Conceptos de POO
                                                      • POO en Java
                                                      • Arrays de objetos
                                                          • Colecciones y diccionarios
                                                            • Colecciones la clase ArrayList
                                                              • Principales meacutetodos de ArrayList
                                                              • Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de sus elementos
                                                              • ArrayList de objetos
                                                              • Ordenacioacuten de un ArrayList
                                                                • Diccionarios la clase HashMap
                                                                  • Principales meacutetodos de HashMap
                                                                  • Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas
                                                                    • Ejercicios
                                                                      • Ficheros de texto y paso de paraacutemetros por liacutenea de comandos
                                                                        • Lectura de un fichero de texto
                                                                        • Escritura sobre un fichero de texto
                                                                        • Lectura y escritura combinadas
                                                                        • Otras operaciones sobre ficheros
                                                                        • Paso de argumentos por liacutenea de comandos
                                                                        • Combinacioacuten de ficheros y paso de argumentos
                                                                        • Procesamiento de archivos de texto
                                                                        • Ejercicios
                                                                          • Aplicaciones web en Java (JSP)
                                                                            • Hola Mundo en JSP
                                                                            • Mezclando Java con HTML
                                                                            • Recogida de datos en JSP
                                                                            • POO en JSP
                                                                            • Ejercicios
                                                                              • Acceso a bases de datos
                                                                                • Socios de un club de baloncesto
                                                                                • Preparacioacuten del proyecto de ejemplo
                                                                                  • Activar la conexioacuten a MySQL
                                                                                  • Incluir la libreriacutea MySQL JDBC
                                                                                    • Listado de socios
                                                                                    • Alta
                                                                                    • Borrado
                                                                                    • CRUD completo con Bootstrap
                                                                                    • Ejercicios
                                                                                      • Apeacutendice A Ejercicios de ampliacioacuten
                                                                                      • Apeacutendice B Entorno de Desarrollo Integrado Netbeans
                                                                                        • Descarga e instalacioacuten
                                                                                        • Configuracioacuten
                                                                                        • Creacioacuten de un proyecto
                                                                                        • Depuracioacuten
                                                                                          • Apeacutendice C Caracteres especiales
                                                                                            • Liacuteneas para tablas
                                                                                            • Bloques
                                                                                            • Figuras de ajedrez
                                                                                            • Ciacuterculos
                                                                                            • Flechas
                                                                                            • Nuacutemeros en ciacuterculos
                                                                                            • Dados
                                                                                            • Fichas de dominoacute
                                                                                            • Cartas
                                                                                            • Caras
                                                                                            • Horoacutescopo
                                                                                            • Miscelaacutenea
Page 7: Aprende Java con Ejercicios - DAM

Sobre el autorLuis Joseacute Saacutenchez Gonzaacutelez es Ingeniero Teacutecnico en Informaacutetica de Gestioacuten por laUniversidad de Maacutelaga (Espantildea) y funcionario de carrera de la Junta de Andaluciacuteadesde 1998 En su trabajo de profesor de Informaacutetica combina sus dos pasiones laensentildeanza y la programacioacutenEn el momento de publicar este libro es profesor del IES Campanillas (Maacutelaga) eimparte clases en el Ciclo Superior de Desarrollo de Aplicaciones WebPuedes ponerte en contacto con el autor mediante la direccioacuten de correo electroacute-nico luisjoseprofegmailcom o mediante LinkedIn (httpseslinkedincompubluis-joseacute-saacutenchez86b0834)

ii

Centros en los que se usa este librobull IES Campanillas Maacutelaga (Espantildea)bull IES Poliacutegono Sur Sevilla (Espantildea)bull IES Murgi El Ejido - Almeriacutea (Espantildea)bull IES Punta del Verde Sevilla (Espantildea)

Si eres profesor y utilizas este libro para ensentildear Java piacutedele al autor que antildeada enesta seccioacuten el nombre de tu centro educativo o empresa escribiendo un correo a ladireccioacuten luisjoseprofegmailcom indicando la localidad y el paiacutes del centro

iii

IntroduccioacutenJava es un lenguaje de programacioacuten es de hecho desde hace maacutes de 10 antildeos ellenguaje de programacioacuten maacutes utilizado en el mundo seguacuten el iacutendice PYPL2(PopularitYof Programming Language index)Los ordenadores no entienden - por ahora - el espantildeol ni el ingleacutes ni ninguacuten otroidioma natural De una forma muy simplificada podriacuteamos decir que un lenguaje deprogramacioacuten es un idioma que entiende el ordenador3 Cualquier aplicacioacuten - proce-sador de textos navegador programa de retoque fotograacutefico etc - estaacute compuesta deuna serie de instrucciones convenientemente empaquetadas en ficheros que le dicenal ordenador de una manera muy precisa queacute tiene que hacer en cada momentoJava es un lenguaje de programacioacuten estructurado y como tal hace uso de variablessentencias condicionales bucles funcioneshellip Java es tambieacuten un lenguaje de progra-macioacuten orientado a objetos y por consiguiente permite definir clases con sus meacutetodoscorrespondientes y crear instancias de esas clases Java no es un lenguaje de marcascomo HTML o XML aunque puede interactuar muy bien con ellos4Las aplicaciones Java se suelen compilar a bytecode que es independiente del sistemaoperativo no a binario que siacute depende del sistema operativo De esta forma elbytecode generado al compilar un programa escrito en Java deberiacutea funcionar encualquier sistema operativo que tenga instalada una maacutequina virtual de java (JVM)Cualquier editor simple como Nano o GEdit es suficiente para escribir coacutedigo enJava aunque se recomiendan IDEs5 como NetBeans o Eclipse ya que tienen algunascaracteriacutesticas que facilitan mucho la programacioacuten como el chequeo de erroresmientras se escribe el autocompletado de nombres de variables y funciones y muchomaacutes

2httppyplgithubioPYPLhtml3En realidad un ordenador no entiende directamente los lenguajes de programacioacuten como Java C Ruby etc Mediante una

herramienta que se llama compilador o traductor seguacuten el caso lo que hay escrito en cualquiera de estos lenguajes se convierteen coacutedigo maacutequina - secuencias de unos y ceros - que es el uacutenico lenguaje que de verdad entiende el ordenador

4El lector deberaacute tener unos conocimientos baacutesicos de HTML para entender bien y sacar provecho del capiacutetulo relativo a JSPde este mismo libro Una web excelente para aprender HTML es httpw3schoolscom

5IDE Integrated Development Enviroment (Entorno de Desarrollo Integrado)

iv

Instalacioacuten y configuracioacuten del entorno deprogramacioacuten JavaTodos los ejemplos que contiene este libro asiacute como las soluciones a los ejerciciosse han escrito sobre Linux en concreto sobre Ubuntu (httpwwwubuntucom) Noobstante todo el coacutedigo deberiacutea compilar y funcionar sin ninguacuten problema en cualquierotra plataformaEl software necesario para seguir este manual es el siguiente6

OpenJDKEl Open Java Development Kit (OpenJDK) contiene una serie de componentesque permiten desarrollar y ejecutar aplicaciones escritas en Java Incluye la maacute-quina virtual de Java (JVM) que permite ejecutar bytecode Como mencionamosen el apartado Introduccioacuten el bytecode es el ejecutable en Java El OpenJDKtambieacuten incluye el compilador javac que permite compilar el coacutedigo fuente paragenerar el bytecode En Ubuntu basta ejecutar una liacutenea en la ventana determinal para instalar el OpenJDK

$ sudo apt-get install openjdk-8-jdk

Para los sitemas operativos Mac OS X y Windows se encuentran disponiblespara su descarga los archivos de instalacioacuten del OpenJDK en la paacutegina UnofficialOpenJDK installers for Windows Linux and Mac OS X7 Otra opcioacuten consiste enutilizar el JDK oficial de Oracle que se puede descargar en el apartado Java SEDevelopment Kit 8 - Downloads8 de la web de esta misma empresa No vamos aexplicar las diferencias entre el OpenJDK y el JDK ya que se escapa al aacutembitode este libro A efectos praacutecticos todos los ejemplos contenidos en este manualfuncionan tanto con en el OpenJDK como con el JDK y los ejercicios se puedenrealizar sin problema sea cual sea el kit de desarrollo instalado

Editor de textos simplePara seguir este manual recomendamos utilizar al principio un editor de textossencillo para probar los primeros programas y realizar los primeros ejercicioscompilando en liacutenea de comandos De esta manera el lector se va familiarizandocon el proceso de edicioacuten de coacutedigo compilacioacuten y ejecucioacuten y va entendiendo loque sucede en cada paso En Ubuntu viene instalado por defecto el editor GEditel sistema operativo Mac OS X viene con TextEdit y en Windows podemos usarel programa Bloc de notas

6En la paacutegina httphelloworldcollectionde se muestra el programa Hola mundo escrito en maacutes de 400 lenguajes deprogramacioacuten

7httpsgithubcomalexkaskoopenjdk-unofficial-builds8httpwwworaclecomtechnetworkjavajavasedownloadsjdk8-downloads-2133151html

v

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java vi

GeanyUna vez que el lector ha superado la barrera de escribir sus primeros programasrecomendamos utilizar el entorno de programacioacuten Geany (por ejemplo a partirdel capiacutetulo 2) Se trata de un IDE muy ligero que permite realizar aplicacionessencillas con rapidez Mediante Geany se puede escribir el coacutedigo chequearsi contiene errores compilar y ejecutar el bytecode generado Para programaspequentildeos - por ej calcular la media de varios nuacutemeros - es recomendable utilizarGeany en lugar de un IDE maacutes complejo como Netbeans Mientras con Geanyda tiempo a escribir el coacutedigo compilar y ejecutar Netbeans todaviacutea estariacuteaarrancandoInstalacioacuten de Geany (y los plugins adicionales) en Ubuntu

$ sudo apt-get install geany

$ sudo apt-get install geany-plugins

En la seccioacuten de descargas de la paacutegina oficial de Geany9 se encuentran losficheros de instalacioacuten de este programa tanto para Mac OS X como paraWindowsUna vez instalado Geany es conveniente realizar algunos ajustes en la configu-racioacuten Presiona Control + Alt + P para abrir la ventana de preferencias Hazclic en la pestantildea Editor y luego en la pestantildea Sangriacutea Establece las opcionestal y como se indican a continuacioacuten

9httpwwwgeanyorgDownloadReleases

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java vii

Figura 01 Configuracioacuten de Geany (sangriacutea)

Tambieacuten es recomendable marcar las casillas Mostrar guiacuteas de sangriacutea y Mostrarnuacutemeros de liacutenea Estas opciones se activan en la pestantildea Mostrar

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java viii

Figura 02 Configuracioacuten de Geany (guiacuteas de sangriacutea y nuacutemeros de liacutenea)

NetbeansCuando las aplicaciones a desarrollar son maacutes complejas y sobre todo cuandoeacutestas constan de varios ficheros se recomienda utilizar Netbeans de la empresaOracle En el capiacutetulo 9 el lector ya podriacutea sacarle mucho partido al uso de esteIDE Se trata de un entorno integrado muy potente y muy usado a nivel profesionalque incluye el autocompletado de sintaxis y permite una depuracioacuten avanzadapaso a paso Netbeans se puede descargar de forma gratuita y para cualquierplataforma desde httpsnetbeansorgdownloadsDespueacutes de la instalacioacuten de Netbeans procedemos a configurar el editorPara ello seleccionamos Herramientas rarr Opciones rarr Editor A continuacioacutenseleccionamos la pestantildea Formato y en el menuacute desplegable correspondiente allenguaje de programacioacuten seleccionamos Java La configuracioacuten deberiacutea quedarcomo se indica en la imagen

Instalacioacuten y configuracioacuten del entorno de programacioacuten Java ix

Figura 03 Configuracioacuten de Netbeans

Es muy importante que los editoresIDEs que se utilicen para esribir coacutedigoen Java se configuren adecuadamente Hemos visto coacutemo configurar Geanyy Netbeans pero si el lector decide utilizar otras herramientas deberaacuteconfigurarlas igualmente En definitiva la configuracioacutenpreferencias de lasherramientas que se utilicen deben establecerse de tal forma que se cumplanestos requisitos

bull La tecla TAB debe insertar espacios no debe insertar el caraacutecter detabulacioacuten

bull La indentacioacuten debe ser de 2 caracteres (por defecto suele estar a 4)bull La condificacioacuten de caracteres debe ser UTF-8

1 iexclHola mundo - Salida de datos por pantalla

11 iexclHola mundo - Mi primer programa

El primer programa que aprende a hacer cualquier aspirante a programador es unHolamundo 1 Es seguramente el programa maacutes sencillo que se puede escribir Se trata deun programa muestra el mensaje ldquoHola mundordquo por pantalla Abre el programa GEditque como hemos comentado en la seccioacuten Instalacioacuten y configuracioacuten del entorno deprogramacioacuten Java viene instalado por defecto en Ubuntu y teclea el siguiente coacutedigo

Muestra por pantalla la frase iexclHola mundo author Luis J Saacutenchez

public class HolaMundo Clase principalpublic static void main(String[] args)

Systemoutprintln(iexclHola mundo)

Veraacutes que en principio el texto del coacutedigo no aparece en colores El coloreado desintaxis es muy uacutetil como comprobaraacutes maacutes adelante sobre todo para detectar erroresGraba el programa como HolaMundojava Al grabar con la extensioacuten java ahora elprograma GEdit siacute sabe que se trata de un programa escrito en Java y reconoce lasintaxis de este lenguaje de forma que puede colorear los distintos elementos queaparecen en el coacutedigo

1En la paacutegina httphelloworldcollectionde se muestra el programa Hola mundo escrito en maacutes de 400 lenguajes deprogramacioacuten

1

iexclHola mundo - Salida de datos por pantalla 2

Figura 11 Programa Hola mundo escrito en el editor GEdit

Fiacutejate que el nombre que le damos al fichero es exactamente igual que la clase principalseguido de la extensioacuten java Abre una ventana de terminal entra en el directoriodonde se encuentra el fichero y teclea lo siguiente

$ javac HolaMundojava

Este comando crea HolaMundoclass que es el bytecode Para ejecutar el programateclea

$ java HolaMundo

iexclEnhorabuena Acabas de realizar tu primer programa en JavaEn la siguiente captura de pantalla puedes ver la ventana de terminal y los comandosque acabamos de describir

iexclHola mundo - Salida de datos por pantalla 3

Figura 12 HolaMundoclass es el bytecode generado (1) El resultado del programa es una liacutenea de textoescrita en pantalla (2)

La instruccioacuten que hemos utilizado para mostrar una frase por pantalla es Sys-

temoutprintln() colocando la frase entre pareacutentesis Tambieacuten se puede volcar textopor pantalla mediante Systemoutprint() La uacutenica diferencia radica en que esta uacuteltimano antildeade un salto de liacutenea al final prueacutebalo en HolaMundojava y comprueacutebalo por timismo Si lo que quieres mostrar es una palabra o una frase como en este ejemploes importante que el texto esteacute entrecomillado

bull El programa propiamente dicho estaacute dentro de lo que llamamos ldquoclaseprincipalrdquo

bull El fichero debe tener el mismo nombre que la clase principal seguido porla extensioacuten java

bull Los comentarios de varias liacuteneas se colocan entre y

bull Los comentarios de liacutenea se indican mediante

bull Para mostrar informacioacuten por pantalla se utilizan Systemoutprintln() ySystemoutprint()

iexclHola mundo - Salida de datos por pantalla 4

12 Coloreado de texto

Mostrar siempre texto blanco sobre fondo negro puede resultar muy aburrido El textoque se muestra por pantalla se puede colorear para ello es necesario insertar unassecuencias de caracteres - que indican el color con el que se quiere escribir - justoantes del propio textoPrueba el siguiente programa y no te preocupes si todaviacutea no lo entiendes del todoen el proacuteximo capiacutetulo se explican los diferentes tipos de datos que se pueden utilizaren Java entre estos tipos estaacute la cadena de caracteres o String

Coloreado de texto Muestra varias palabras en el color que corresponde author Luis Joseacute Saacutenchez

public class Colores

public static void main(String[] args)

String rojo = 033[31m

String verde = 033[32m

String naranja = 033[33m

String azul = 033[34m

String morado = 033[35m

String blanco = 033[37m

Systemoutprint(naranja + mandarina + verde + hierba)

Systemoutprint(naranja + saltamontes + rojo + tomate)

Systemoutprint(blanco + saacutebanas + azul + cielo)

Systemoutprint(morado + nazareno + azul + mar)

Como puedes ver en los dos ejemplos que hemos mostrado algunas liacuteneas estaacutenligeramente desplazadas hacia la derecha es lo que se llama sangriacutea o indentacioacutenEn programacioacuten es muy importante sangrar (indentar) bien porque da una idea de queacutepartes del coacutedigo son las que contienen a otras En este uacuteltimo ejemplo tenemos unprograma que tiene unos comentarios al principio y luego la clase principal marcadapor la liacutenea public class Colores Dentro de la clase Colores estaacute el main o bloque delprograma principal que tiene sangriacutea por estar dentro de la definicioacuten de la claseColores A su vez dentro del main hay una serie de liacuteneas de coacutedigo que igualmentetienen sangriacutea

iexclHola mundo - Salida de datos por pantalla 5

En este libro tanto el coacutedigo de los ejemplos como el de las soluciones a losejercicios siguen el estaacutendar de Google para el coacutedigo fuente escrito en el lenguaje deprogramacioacuten Java2 por tanto cada vez que se aplique la sangriacutea seraacute exactamentede dos espacios

2httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

iexclHola mundo - Salida de datos por pantalla 6

13 Ejercicios

Ejercicio 1Escribe una programa que muestre tu nombre por pantalla

Ejercicio 2Modifica el programa anterior para que ademaacutes se muestre tu direccioacuten ytu nuacutemero de teleacutefono Aseguacuterate de que los datos se muestran en liacuteneasseparadas

Ejercicio 3Escribe un programa que muestre por pantalla 10 palabras en ingleacutes juntoa su correspondiente traduccioacuten al castellano Las palabras deben estardistribuidas en dos columnas y alineadas a la izquierda Pista Se puedeinsertar un tabulador mediante t

Ejercicio 4Escribe un programa que muestre tu horario de clase Puedes usar espacios otabuladores para alinear el texto

Ejercicio 5Modifica el programa anterior antildeadiendo colores Puedes mostrar cada asig-natura de un color diferente

Ejercicio 6Escribe un programa que pinte por pantalla una piraacutemide rellena a base deasteriscos La base de la piraacutemide debe estar formada por 9 asteriscos

Ejercicio 7Igual que el programa anterior pero esta vez la piraacutemide estaraacute hueca (sedebe ver uacutenicamente el contorno hecho con asteriscos)

iexclHola mundo - Salida de datos por pantalla 7

Ejercicio 8Igual que el programa anterior pero esta vez la piraacutemide debe aparecerinvertida con el veacutertice hacia abajo

Ejercicio 9Escribe un programa que pinte por pantalla alguna escena - el campo lahabitacioacuten de una casa un aula etc - o alguacuten objeto animado o inanimado- un coche un gato una taza de cafeacute etc Ten en cuenta que puedes utilizarcaracteres como + lt etc iexclEacutechale imaginacioacuten

2 Variables

21 Definicioacuten y tipos de variables

Una variable es un contenedor de informacioacuten Imagina una variable como una cajitacon una etiqueta que indica su nombre una cajita en la que se puede introducir un va-lor Las variables pueden almacenar valores enteros nuacutemeros decimales caracterescadenas de caracteres (palabras o frases) etc El contenido de las variables puedecambiar durante la ejecucioacuten del programa de ahiacute viene el nombre de ldquovariablerdquoJava es un lenguaje fuertemente tipado es decir es necesario declarar todas lasvariables que utilizaraacute el programa indicando siempre el nombre y el tipo de cadaunaEl nombre que se le da a una variable es muy importante intenta usar siemprenombres significativos que de alguna forma identifiquen el contenido Por ejemplosi usas una variable para almacenar el volumen de una figura una buena opcioacuten seriacuteallamarla volumen si tienes una variable que almacena la edad de una persona lo mejores llamarla edad y asiacute sucesivamenteUn programa se lee y se depura mucho mejor si los nombres de las variables se hanelegido de forma inteligenteiquestPodriacuteas averiguar queacute hace la siguiente liacutenea de coacutedigo

x = vIp3 Weerty - zxc

Ahora observa el mismo coacutedigo pero con otros nombres de variables

precioTotal = cantidad precio - descuento

Se entiende mucho mejor iquestverdadEscribiremos los nombres de variables en formato lowerCamelCase La primera letrase escribe en minuacutescula y a continuacioacuten si se utiliza maacutes de una palabra cada unade ellas empezariacutea con mayuacutescula Por ejemplo edadMin es un buen nombre para unavariable que almacena la edad miacutenima a la que se puede acceder a un sitio webObserva que hemos usado una mayuacutescula para diferenciar dos partes (edad y Min)Puede que en alguacuten libro tambieacuten encuentres nombres de variables con el caraacutecterde subrayado ( _ ) de tal forma que el nombre de la variable seriacutea edad_min pero comohemos comentado anteriormente en este libro nos centildeimos al estaacutendar de Google1que exige el formato lowerCamelCase

1httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

8

Variables 9

No se permiten siacutembolos como $ + - etc Puedes usar nuacutemeros en los nombresde variables pero nunca justo al principio 5x no es un nombre vaacutelido pero x5 siacute lo esNo se debe poner una letra mayuacutescula al comienzo del nombre de una variable parano confundirla con una clase (los nombres de las clases comienzan por mayuacutescula)

211 Enteros (int y long)

Las variables que van a contener nuacutemeros enteros se declaran con int Veamos unejemplo

Uso de variables enteras author Luis J Saacutenchez

public class VariablesEnteras

public static void main(String[] args)

int x Se declara la variable x como entera

x = 5 Se asigna el valor 5 a la variable xSystemoutprintln(El valor actual de mi variable es + x)

x = 7 Se asigna el valor 7 a la variable xSystemoutprintln(y ahora es + x)

Si pretendemos almacenar valores muy grandes en una variable usaremos el tipo long

en lugar de int

212 Nuacutemeros decimales (double y float)

Usamos los tipos double o float cuando queremos (o esperamos) almacenar nuacutemeroscon decimales en las variablesCintildeeacutendonos al estaacutendar de Google no daremos por vaacutelidas definiciones de variablescomo la siguiente (aunque funcionariacutea sin ninguacuten problema)

double x y

Cada variable se debe definir en una liacutenea diferente Lo siguiente siacute seriacutea correcto

Variables 10

double x

double y

A continuacioacuten tienes un ejemplo completo

Uso de variables que contienen nuacutemeros decimales author Luis J Saacutenchez

public class VariablesConDecimales

public static void main(String[] args)

double x Se declaran las variables x e ydouble y de tal forma que puedan almacenar decimales

x = 7

y = 2501

Systemoutprintln( x vale + x)

Systemoutprintln( y vale + y)

Como puedes ver tambieacuten se pueden almacenar nuacutemeros enteros en variables de tipodouble

213 Cadenas de caracteres (String)

Las cadenas de caracteres se utilizan para almacenar palabras y frases Todas lascadenas de caracteres deben ir entrecomilladas

Uso del tipo String author Luis J Saacutenchez

public class UsoDeStrings

public static void main(String[] args)

String miPalabra = cerveza

String miFrase = iquestdoacutende estaacute mi cerveza

Systemoutprintln(Una palabra que uso con frecuencia + miPalabra)

Variables 11

Systemoutprintln(Una frase que uso a veces + miFrase)

Como puedes ver en una cadena de caracteres se pueden almacenar signos depuntuacioacuten espacios y letras con tildes

Variables 12

22 Operadores artimeacuteticos

En Java se puede operar con las variables de una forma muy parecida a como se haceen matemaacuteticas Los operadores aritmeacuteticos de Java son los siguientes

OPERADOR NOMBRE EJEMPLO DESCRIPCIOacuteN+ suma 20 + x suma dos nuacutemeros- resta a - b resta dos nuacutemeros multiplicacioacuten 10 7 multiplica dos nuacutemeros divisioacuten altura 2 divide dos nuacutemeros resto (moacutedulo) 5 2 resto de la divisioacuten entera

++ incremento a++ incrementa en 1 elvalor de la variable

- - decremento a- - decrementa en 1 elvalor de la variable

A continuacioacuten tienes un programa que ilustra el uso de los operadores aritmeacuteticos

Uso de los operadores aritmeacuteticos author Luis J Saacutenchez

public class UsoDeOperadoresAritmeticos

public static void main(String[] args)

int x

x = 100

Systemoutprintln(x + + (x + 5) + + (x - 5))

Systemoutprintln((x 5) + + (x 5) + + (x 5))

23 Asignacioacuten de valores a variables

La sentencia de asignacioacuten se utiliza para dar un valor a una variable En Java (y enla mayoriacutea de lenguajes de programacioacuten) se utiliza el siacutembolo igual ( = ) para estecometido Es importante recalcar que una asignacioacuten no es una ecuacioacuten Por ejemplox = 7 + 1 es una asignacioacuten en la cual se evaluacutea la parte derecha 7 + 1 y el resultadode esa evaluacioacuten se almacena en la variable que se coloque a la izquierda del iguales decir en la x o lo que es lo mismo el nuacutemero 8 se almacena en x La sentenciax + 1 = 23 2 no es una asignacioacuten vaacutelida ya que en el lado izquierdo debemos teneruacutenicamente un nombre de variableVeamos un ejemplo con algunas operaciones y asignaciones

Variables 13

Operaciones y asignaciones author Luis J Saacutenchez

public class Asignaciones

public static void main(String[] args)

int x = 2

int y = 9

int sum = x + y

Systemoutprintln(La suma de mis variables es + sum)

int mul = x y

Systemoutprintln(La multiplicacioacuten de mis variables es + mul)

24 Conversioacuten de tipos (casting)

En ocasiones es necesario convertir una variable (o una expresioacuten en general) de untipo a otro Simplemente hay que escribir entre pareacutentesis el tipo que se quiere obtenerExperimenta con el siguiente programa y observa los diferentes resultados que seobtienen

Conversioacuten de tipos author Luis J Saacutenchez

public class ConversionDeTipos

public static void main(String[] args)

int x = 2

int y = 9

double division

division = (double)y (double)xdivision = y x Comenta esta liacutenea y

observa la diferencia

Variables 14

Systemoutprintln(El resultado de la divisioacuten es + division)

Variables 15

25 Ejercicios

Ejercicio 1Escribe un programa en el que se declaren las variables enteras x e y Asignaleslos valores 144 y 999 respectivamente A continuacioacuten muestra por pantallael valor de cada variable la suma la resta la divisioacuten y la multiplicacioacuten

Ejercicio 2Crea la variable nombre y asiacutegnale tu nombre completo Muestra su valor porpantalla de tal forma que el resultado del programa sea el mismo que en elejercicio 1 del capiacutetulo 1

Ejercicio 3Crea las variables nombre direccion y telefono y asiacutegnale los valores corres-pondientes Muestra los valores de esas variables por pantalla de tal formaque el resultado del programa sea el mismo que en el ejercicio 2

Ejercicio 4Realiza un conversor de euros a pesetas La cantidad en euros que se quiereconvertir deberaacute estar almacenada en una variable

Ejercicio 5Realiza un conversor de pesetas a euros La cantidad en pesetas que se quiereconvertir deberaacute estar almacenada en una variable

Ejercicio 6Escribe un programa que calcule el total de una factura a partir de la baseimponible (precio sin IVA) La base imponible estaraacute almacenada en unavariable

3 Lectura de datos desde tecladoHemos visto en los capiacutetulos anteriores coacutemo mostrar informacioacuten por pantalla ycoacutemo usar variables Veremos ahora algo muy importante que te permitiraacute realizarprogramas algo maacutes funcionales que tengan una utilidad real aprenderaacutes a leer lainformacioacuten que introduce un usuario mediante el tecladoEl funcionamiento de casi todos los programas se podriacutea resumir en los siguientespuntos

1 Entrada de datos desde teclado (o desde cualquier otro dispositivo de entrada)2 Procesamiento de los datos de entrada para producir un resultado3 Visualizacioacuten de los resultados por pantalla

De momento hemos visto coacutemo realizar los puntos 2 y 3 Vamos a ver a continuacioacutencoacutemo se recoge la informacioacuten desde el teclado

31 Lectura de texto

Para recoger datos por teclado usamos Systemconsole()readLine() Cuando llegamos aesta sentencia el programa se detiene y espera que el usuario introduzca informacioacutenmediante el teclado La introduccioacuten de datos termina con la pulsacioacuten de la teclaINTRO Una vez que el usuario presiona INTRO todo lo que se ha tecleado se almacenaen una variable en el siguiente ejemplo esa variable es nombre

Lectura de datos desde teclado author Luis J Sanchez

public class DimeTuNombre

public static void main(String[] args)

String nombre

Systemoutprint(Por favor dime coacutemo te llamas )

nombre = Systemconsole()readLine()

Systemoutprintln(Hola + nombre + iexclencantado de conocerte)

16

Lectura de datos desde teclado 17

Mediante Systemconsole()readLine() se recoge una liacutenea de texto introducidapor teclado

Cuando se piden datos por teclado es importante que el programa especifiqueclaramente cuaacutel es exactamente la informacioacuten que requiere por parte del usuarioDate cuenta que este programa muestra el mensaje ldquoPor favor dime coacutemo te llamasrdquoImagina que se omite este mensaje en la pantalla apareceriacutea uacutenicamente un cursorparpadeando y el usuario no sabriacutea queacute tiene que hacer o queacute dato introducirTambieacuten es importante resentildear que los datos introducidos por teclado se recogen comouna cadena de caracteres (un String)

32 Lectura de nuacutemeros

Si en lugar de texto necesitamos datos numeacutericos deberemos convertir la cadenaintroducida en un nuacutemero con el meacutetodo adecuado Como se muestra en el ejemploIntegerparseInt() convierte el texto introducido por teclado en un dato numeacutericoconcretamente en un nuacutemero entero

Lectura de datos desde teclado author Luis J Saacutenchez

public class LeeNumeros

public static void main(String[] args)

String linea

Systemoutprint(Por favor introduce un nuacutemero )

linea = Systemconsole()readLine()

int primerNumero

primerNumero = IntegerparseInt( linea )

Systemoutprint(introduce otro por favor )

linea = Systemconsole()readLine()

int segundoNumero

segundoNumero = IntegerparseInt( linea )

int total

total = (2 primerNumero) + segundoNumero

Systemoutprint(El primer nuacutemero introducido es + primerNumero)

Lectura de datos desde teclado 18

Systemoutprintln( y el segundo es + segundoNumero)

Systemoutprint(El doble del primer nuacutemero maacutes el segundo es )

Systemoutprint(total)

Este uacuteltimo programa se podriacutea acortar un poco Por ejemplo estas dos liacuteneas

int total

total = (2 primerNumero) + segundoNumero

se podriacutean quedar en una sola liacutenea

int total = (2 primerNumero) + segundoNumero

De igual modo estas tres liacuteneas

linea = Systemconsole()readLine()

int primerNumero

primerNumero = IntegerparseInt( linea )

tambieacuten se podriacutean reducir a una sola tal que asiacute

int primerNumero = IntegerparseInt( Systemconsole()readLine() )

Es muy importante que el coacutedigo de nuestros programas sea limpio y legible A vecesabreviando demasiado el coacutedigo se hace maacutes difiacutecil de leer es preferible tener unasliacuteneas de maacutes y que el coacutedigo se entienda bien a tener un coacutedigo muy compacto peromenos legible

33 La clase Scanner

El meacutetodo Systemconsole()readLine() funciona bien en modo consola (en una ventana determinal) pero puede provocar problemas cuando se trabaja con IDEs como EclipseNetbeans JavaEdit etc Para evitar estos problemas puedes usar la clase Scanner

cuando necesites recoger datos desde teclado La clase Scanner funciona tanto enentornos integrados como en una ventana de terminal

Lectura de datos desde teclado 19

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScanner01

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tu nombre )

String nombre = snextLine()

Systemoutprint(Introduce tu edad )

int edad = IntegerparseInt(snextLine())

Systemoutprintln(Tu nombre es + nombre + y tu edad es + edad)

Fiacutejate que en el programa anterior la sentencia

snextLine()

seriacutea el equivalente a

Systemconsole()readLine()`

Mediante el uso de la clase Scanner es posible leer varios datos en una misma liacutenea Enel programa anterior se pediacutea un nombre y una edad en total dos datos que habiacutea queintroducir en liacuteneas separadas Observa coacutemo en el siguiente ejemplo se piden esosdos datos en una sola liacutenea y separados por un espacio

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScanner02

Lectura de datos desde teclado 20

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tu nombre y tu edad separados por un espacio )

String nombre = snext()

int edad = snextInt()

Systemoutprintln(Tu nombre es + nombre + y tu edad es + edad)

Fiacutejate coacutemo se ha utilizado snext() para leer una cadena de caracteres y snextInt()

para leer un nuacutemero entero todo ello en la misma liacuteneaEl siguiente programa de ejemplo calcula la media de tres nuacutemeros decimales Paraleer cada uno de los nuacutemeros en la misma liacutenea se utiliza snextDouble

Lectura de datos desde teclado usando la clase Scanner author Luis J Saacutenchez

import javautilScanner

public class LeeDatosScannerMedia

public static void main(String[] args)

Scanner s = new Scanner(Systemin)

Systemoutprint(Introduce tres nuacutemeros (pueden contener decimales) separados por esp

acios )

double x1 = snextDouble()

double x2 = snextDouble()

double x3 = snextDouble()

double media = (x1 + x2 + x3) 3

Systemoutprintln(La media de esos tres nuacutemeros es + media)

Lectura de datos desde teclado 21

Recuerda que iexcla programar se aprende programando Es muy importanteque pruebes los ejemplos - si los modificas y experimentas todaviacutea mejor - yque realices los ejercicios Para aprender a programar no basta con leer el libroy entenderlo es una condicioacuten necesaria pero no suficiente Igual que paraser piloto hacen falta muchas horas de vuelo para ser programador hacenfalta muchas horas picando coacutedigo probando corrigiendo erroreshellip iexclAacutenimoiexclEl esfuerzo merece la pena

Lectura de datos desde teclado 22

34 Ejercicios

Ejercicio 1Realiza un programa que pida dos nuacutemeros y que luego muestre el resultadode su multiplicacioacuten

Ejercicio 2Realiza un conversor de euros a pesetas La cantidad de euros que se quiereconvertir debe ser introducida por teclado

Ejercicio 3Realiza un conversor de pesetas a euros La cantidad de pesetas que se quiereconvertir debe ser introducida por teclado

Ejercicio 4Escribe un programa que sume reste multiplique y divida dos nuacutemerosintroducidos por teclado

Ejercicio 5Escribe un programa que calcule el aacuterea de un rectaacutengulo

Ejercicio 6Escribe un programa que calcule el aacuterea de un triaacutengulo

Ejercicio 7Escribe un programa que calcule el total de una factura a partir de la baseimponible

Ejercicio 8Escribe un programa que calcule el salario semanal de un empleado en basea las horas trabajadas a razoacuten de 12 euros la hora

Lectura de datos desde teclado 23

Ejercicio 9Escribe un programa que calcule el volumen de un cono seguacuten la foacutermula V =13πr

2h

Ejercicio 10Realiza un conversor de Mb a Kb

Ejercicio 11Realiza un conversor de Kb a Mb

Ejercicio 12Escribe un programa que calcule el precio final de un producto seguacuten subase imponible (precio antes de impuestos) el tipo de IVA aplicado (generalreducido o superreducido) y el coacutedigo promocional Los tipos de IVA generalreducido y superreducido son del 21 10 y 4 respectivamente Los coacutedi-gos promocionales pueden ser nopro mitad meno5 o 5porc que significanrespectivamente que no se aplica promocioacuten el precio se reduce a la mitadse descuentan 5 euros o se descuenta el 5 El ejercicio se da por bueno si semuestran los valores correctos aunque los nuacutemeros no esteacuten tabuladosEjemplo

Introduzca la base imponible 25

Introduzca el tipo de IVA (general reducido o superreducido) reducido

Introduzca el coacutedigo promocional (nopro mitad meno5 o 5porc) mitad

Base imponible 2500

IVA (10) 250

Precio con IVA 2750

Coacuted promo (mitad) -1375

TOTAL 1375

Lectura de datos desde teclado 24

Ejercicio 13Realiza un programa que calcule la nota que hace falta sacar en el segundoexamen de la asignatura Programacioacuten para obtener la media deseada Hayque tener en cuenta que la nota del primer examen cuenta el 40 y la delsegundo examen un 60Ejemplo 1

Introduce la nota del primer examen 7

iquestQueacute nota quieres sacar en el trimestre 85

Para tener un 85 en el trimestre necesitas sacar un 95 en el segundo examen

Ejemplo 2

Introduce la nota del primer examen 8

iquestQueacute nota quieres sacar en el trimestre 7

Para tener un 7 en el trimestre necesitas sacar un 633 en el segundo examen

4 Sentencia condicional (if y switch)Una sentencia condicional permite al programa bifurcar el flujo de ejecucioacuten deinstrucciones dependiendo del valor de una expresioacuten

41 Sentencia if

La sentencia if permite la ejecucioacuten de una serie de instrucciones en funcioacuten delresultado de una expresioacuten loacutegica El resultado de evaluar una expresioacuten loacutegica essiempre verdadero (true) o falso (false) Es muy simple en lenguaje natural seriacutea algocomo rdquosi esta condicioacuten es verdadera entonces haz esto sino haz esto otrordquoEl formato de la sentencia if es el siguiente

if (condicioacuten)

instrucciones a ejecutar si la condicioacuten es verdadera

else

instrucciones a ejecutar si la condicioacuten es falsa

A continuacioacuten se muestra un ejempo del uso de la sentencia if

Sentencia if author Luis J Saacutenchez

public class SentenciaIf01

public static void main(String[] args)

Systemoutprint(iquestCuaacutel es la capital de Kiribati )

String respuesta = Systemconsole()readLine()

if (respuestaequals(Tarawa))

Systemoutprintln(iexclLa respuesta es correcta)

else

Systemoutprintln(Lo siento la respuesta es incorrecta)

25

Sentencia condicional (if y switch) 26

En el programa se le pregunta al usuario cuaacutel es la capital de Kiriwati La respuestaintroducida por el usuario se almacena en la variable respuesta A continuacioacuten vienela sentencia condicional if

if (respuestaequals(Tarawa))

Llegado a este punto el programa evaluacutea la expresioacuten respuestaequals(Tarawa)Observa que para comparar dos cadenas de caracteres se utiliza equals() Ima-ginemos que el usuario ha introducido por teclado Madrid entonces la expresioacutenMadridequals(Tarawa) dariacutea como resultado false (falso)Si la expresioacuten hubiera dado como resultado true (verdadero) se ejecutaria la liacutenea

Systemoutprintln(iexclLa respuesta es correcta)

pero no es el caso el resultado de la expresioacuten ha sido false (falso) todo el mundosabe que la capital de Kiriwati no es Madrid por tanto se ejecutariacutea la liacutenea

Systemoutprintln(Lo siento la respuesta es incorrecta)

Vamos a ver otro ejemplo esta vez con nuacutemeros El usuario introduciraacute un nuacutemero porteclado y el programa diraacute si se trata de un nuacutemero positivo o negativo

Sentencia if author Luis J Saacutenchez

public class SentenciaIf02

public static void main(String[] args)

Systemoutprint(Por favor introduce un nuacutemero entero )

String linea = Systemconsole()readLine()

int x = IntegerparseInt( linea )

if (x lt 0)

Systemoutprintln(El nuacutemero introducido es negativo)

else

Systemoutprintln(El nuacutemero introducido es positivo)

El siguiente bloque de coacutedigo

Sentencia condicional (if y switch) 27

if (x lt 0)

Systemoutprintln(El nuacutemero introducido es negativo)

elseSystemoutprintln(El nuacutemero introducido es positivo)

compilariacutea y funcionariacutea sin problemas - fiacutejate que hemos quitado las llaves - ya queantes y despueacutes del else hay una sola sentencia y en estos casos no es obligatorioponer llaves Sin embargo nosotros siempre usaremos llaves es una exigencia delestaacutendar de Google al que nos centildeimos en este manual

Llaves egipcias (egyptian brackets)Fiacutejate en la manera de colocar las llaves dentro del coacutedigo de un programaen Java La llave de apertura de bloque se coloca justo al final de la liacutenea y lallave de cierre va justo al principio de la liacutenea Se llaman llaves egipcias1 porla similitud entre las llaves y las manos de los egipcios que aparecen en lospapiros

1httpblogcodinghorrorcomnew-programming-jargon

Sentencia condicional (if y switch) 28

42 Operadores de comparacioacuten

En el ejemplo anterior usamos el operador lt en la comparacioacuten if (x lt 0) para saber sila variable x es menor que cero Hay maacutes operadores de comparacioacuten en la siguientetabla se muestran todos

OPERADOR NOMBRE EJEMPLO DESCRIPCIOacuteN== igual a == b a es igual a b= distinto a = b a es distinto de blt menor que a lt b a es menor que bgt mayor que a gt b a es mayor que b

lt= mayor o igual que a gt = b a es mayor o igual que b

El siguiente ejemplo muestra el uso de uno de estos operadores concretamente de gt=

(mayor o igual) El usuario introduce una nota si esta nota es mayor o igual a 5 sele mostraraacute un mensaje diciendo que ha aprobado y en caso de que no se cumpla lacondicioacuten se mostraraacute un mensaje diciendo que estaacute suspenso

Sentencia if author Luis J Saacutenchez

public class SentenciaIf03

public static void main(String[] args)

Systemoutprint(iquestQueacute nota has sacado en el uacuteltimo examen )

String line = Systemconsole()readLine()

double nota = DoubleparseDouble( line )

if (nota gt= 5)

Systemoutprintln(iexclEnhorabuena iexclhas aprobado)

else

Systemoutprintln(Lo siento has suspendido)

Sentencia condicional (if y switch) 29

43 Operadores loacutegicos

Los operadores de comparacioacuten se pueden combinar con los operadores loacutegicos Porejemplo si queremos saber si la variable a es mayor que b y ademaacutes es menor que cescribiriacuteamos if ((a gt b) ampamp (a lt c)) En la siguiente tabla se muestran los operadoresloacutegicos de Java

OPERADOR NOMBRE EJEMPLO DEVUELVEVERDADEROCUANDOhellip

ampamp y (7 gt 2) ampamp (2 lt 4) las dos condicionesson verdaderas

|| o (7 gt 2) || (2 lt 4) al menos una de lascondiciones es

verdadera no (7 gt 2) la condicioacuten es falsa

Vamos a ver coacutemo funcionan los operadores loacutegicos con un ejemplo Mediante if ((n lt

1) || (n gt 100)) se pueden detectar los nuacutemeros que no estaacuten en el rango de 1 a 100literalmente seriacutea ldquosi n es menor que 1 o n es mayor que 100rdquo

Operadores loacutegicos author Luis J Saacutenchez

public class OperadoresLogicos01

public static void main(String[] args)

Systemoutprintln(Adivina el nuacutemero que estoy pensando)

Systemoutprint(Introduce un nuacutemero entre el 1 y el 100 )

String linea = Systemconsole()readLine()

int n = IntegerparseInt( linea )

if ((n lt 1) || (n gt 100))

Systemoutprintln(El nuacutemero introducido debe estar en el intervalo 1 - 100)

Systemoutprint(Tienes otra oportunidad introduce un nuacutemero )

linea = Systemconsole()readLine()

n = IntegerparseInt( linea )

if (n == 24)

Systemoutprintln(iexclEnhorabuena iexclhas acertado)

else

Systemoutprintln(Lo siento ese no es el nuacutemero que estoy pensando)

Sentencia condicional (if y switch) 30

En el siguiente programa puedes ver el uso de operadores loacutegicos combinado conoperadores relacionales (operadores de comparacioacuten) Intenta adivinar cuaacutel seraacute elresultado mirando el coacutedigo

Operadores loacutegicos y relacionales author Luis J Saacutenchez

public class OperadoresLogicos02

public static void main(String[] args)

boolean a = trueboolean b = falseSystemoutprintln(a = + a)

Systemoutprintln(b = + b)

Systemoutprintln(a ampamp b = + (a ampamp b))

Systemoutprintln(a || b = + (a || b))

Systemoutprintln(a = + a)

Systemoutprintln(a || (6 gt 10) = + (a || (6 gt 10)))

Systemoutprintln(((4 lt= 4) || false) ampamp (a) = + (((4 lt= 4) || false) ampamp (a)))

Sentencia condicional (if y switch) 31

44 Sentencia switch (seleccioacuten muacuteltiple)

A veces es necesario comparar el valor de una variable con una serie de valoresconcretos La seleccioacuten muacuteltiple es muy parecida (aunque no es exactamente igual) auna secuencia de varias sentencias ifEl formato de switch es el que se muestra a continuacioacuten En legunaje natural seriacutea algoasiacute como ldquoSi variable vale valor1 entonces entra por case valor1 si variable vale valor2

entonces entra por case valor2hellip si variable no vale ninguno de los valores que hay enlos distintos case entonces entra por default

switch(variable)

case valor1

sentencias

break

case valor2

sentencias

break

default

sentencias

A continuacioacuten tienes un ejemplo completo en Java Se pide al usuario un nuacutemero demes y el programa da el nombre del mes que corresponde a ese nuacutemero

Sentencia muacuteltiple (switch) author Luis Joseacute Saacutenchez

public class SentenciaSwitch

public static void main(String[] args)

Systemoutprint(Por favor introduzca un numero de mes )

int mes = IntegerparseInt(Systemconsole()readLine())

String nombreDelMes

switch (mes)

Sentencia condicional (if y switch) 32

case 1

nombreDelMes = enero

breakcase 2

nombreDelMes = febrero

breakcase 3

nombreDelMes = marzo

breakcase 4

nombreDelMes = abril

breakcase 5

nombreDelMes = mayo

breakcase 6

nombreDelMes = junio

breakcase 7

nombreDelMes = julio

breakcase 8

nombreDelMes = agosto

breakcase 9

nombreDelMes = septiembre

breakcase 10

nombreDelMes = octubre

breakcase 11

nombreDelMes = noviembre

breakcase 12

nombreDelMes = diciembre

breakdefault

nombreDelMes = no existe ese mes

Systemoutprintln(Mes + mes + + nombreDelMes)

Observa que es necesario introducir un break despueacutes de la asignacioacuten de la variable

Sentencia condicional (if y switch) 33

nombreDelMes En caso de no encontrarse el break el programa continuacutea la ejecucioacuten enla liacutenea siguienteEl bloque que corresponde al default se ejecuta cuando la variable no coincide conninguno de los valores de los case Escribiremos siempre el default al final de lasentencia switch aunque no sea necesarioLa sentencia switch se utiliza con frecuencia para crear menuacutes

Ejemplo de un menuacute con switch author Luis Joseacute Saacutenchez

public class MenuConSwitch

public static void main(String[] args)

Systemoutprintln( CAacuteLCULO DE AacuteREAS)

Systemoutprintln( ----------------)

Systemoutprintln( 1 Cuadrado)

Systemoutprintln( 2 Rectaacutengulo)

Systemoutprintln( 3 Triaacutengulo)

Systemoutprint(n Elija una opcioacuten (1-3) )

int opcion = IntegerparseInt(Systemconsole()readLine())

double lado

double base

double altura

switch (opcion)

case 1

Systemoutprint(nIntroduzca el lado del cuadrado en cm )

lado = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(nEl aacuterea del cuadrado es + (lado lado) + cm2)

break

case 2

Systemoutprint(nIntroduzca la base del rectaacutengulo en cm )

base = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura del rectaacutengulo en cm )

altura = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El aacuterea del rectaacutengulo es + (base altura) + cm2)

break

Sentencia condicional (if y switch) 34

case 3

Systemoutprint(nIntroduzca la base del triaacutengulo en cm )

base = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura del triaacutengulo en cm )

altura = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El aacuterea del triaacutengulo es + ((base altura) 2) + cm2)

break

default

Systemoutprint(nLo siento la opcioacuten elegida no es correcta)

Sentencia condicional (if y switch) 35

45 Ejercicios

Ejercicio 1Escribe un programa que pida por teclado un diacutea de la semana y que diga queacuteasignatura toca a primera hora ese diacutea

Ejercicio 2Realiza un programa que pida una hora por teclado y que muestre luegobuenos diacuteas buenas tardes o buenas noches seguacuten la hora Se utilizaraacuten lostramos de 6 a 12 de 13 a 20 y de 21 a 5 respectivamente Soacutelo se tienen encuenta las horas los minutos no se deben introducir por teclado

Ejercicio 3Escribe un programa en que dado un nuacutemero del 1 a 7 escriba el correspon-diente nombre del diacutea de la semana

Ejercicio 4Vamos a ampliar uno de los ejercicios de la relacioacuten anterior para considerarlas horas extras Escribe un programa que calcule el salario semanal de untrabajador teniendo en cuenta que las horas ordinarias (40 primeras horas detrabajo) se pagan a 12 euros la hora A partir de la hora 41 se pagan a 16euros la hora

Ejercicio 5Realiza un programa que resuelva una ecuacioacuten de primer grado (del tipo ax+b = 0)

Ejercicio 6Realiza un programa que calcule el tiempo que tardaraacute en caer un objeto desdeuna altura h Aplica la foacutermula t =

radic2hg siendo g = 981ms2

Ejercicio 7Realiza un programa que calcule la media de tres notas

Sentencia condicional (if y switch) 36

Ejercicio 8Ampliacutea el programa anterior para que diga la nota del boletiacuten (insuficientesuficiente bien notable o sobresaliente)

Ejercicio 9Realiza un programa que resuelva una ecuacioacuten de segundo grado (del tipoax2 + bx+ c = 0)

Ejercicio 10Escribe un programa que nos diga el horoacutescopo a partir del diacutea y el mes denacimiento

Ejercicio 11Escribe un programa que dada una hora determinada (horas y minutos)calcule los segundos que faltan para llegar a la medianoche

Ejercicio 12Realiza un minicuestionario con 10 preguntas tipo test sobre las asignaturasque se imparten en el curso Cada pregunta acertada sumaraacute un punto Elprograma mostraraacute al final la calificacioacuten obtenida Paacutesale el minicuestionarioa tus compantildeeros y piacutedeles que lo hagan para ver queacute tal andan de conoci-mientos en las diferentes asignaturas del curso

Ejercicio 13Escribe un programa que ordene tres nuacutemeros enteros introducidos porteclado

Ejercicio 14Realiza un programa que diga si un nuacutemero introducido por teclado es par yodivisible entre 5

Ejercicio 15Escribe un programa que pinte una piraacutemide rellena con un caraacutecter introdu-cido por teclado que podraacute ser una letra un nuacutemero o un siacutembolo como +- $ amp etc El programa debe permitir al usuario mediante un menuacute elegir siel veacutertice de la piraacutemide estaacute apuntando hacia arriba hacia abajo hacia laizquierda o hacia la derecha

Sentencia condicional (if y switch) 37

Ejercicio 16Realiza un programa que nos diga si hay probabilidad de que nuestra parejanos estaacute siendo infiel El programa iraacute haciendo preguntas que el usuariocontestaraacute con verdadero o falso Cada pregunta contestada como verdaderosumaraacute 3 puntos Las preguntas contestadas con falso no suman puntos Utili-za el fichero test_infidelidadtxt para obtener las preguntas y las conclusionesdel programa

Ejercicio 17Escribe un programa que diga cuaacutel es la uacuteltima cifra de un nuacutemero enterointroducido por teclado

Ejercicio 18Escribe un programa que diga cuaacutel es la primera cifra de un nuacutemero enterointroducido por teclado Se permiten nuacutemeros de hasta 5 cifras

Ejercicio 19Realiza un programa que nos diga cuaacutentos diacutegitos tiene un nuacutemero entero quepuede ser positivo o negativo Se permiten nuacutemeros de hasta 5 diacutegitos

Ejercicio 20Realiza un programa que diga si un nuacutemero entero positivo introducido porteclado es capicuacutea Se permiten nuacutemeros de hasta 5 cifras

Sentencia condicional (if y switch) 38

Ejercicio 21Calcula la nota de un trimestre de la asignatura Programacioacuten El programapediraacute las dos notas que ha sacado el alumno en los dos primeros controlesSi la media de los dos controles da un nuacutemero mayor o igual a 5 el alumnoestaacute aprobado y se mostraraacute la media En caso de que la media sea un nuacutemeromenor que 5 el alumno habraacute tenido que hacer el examen de recuperacioacutenque se califica como apto o no apto por tanto se debe preguntar al usuarioiquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) Si elresultado de la recuperacioacuten es apto la nota seraacute un 5 en caso contrario semantiene la nota media anteriorEjemplo 1

Nota del primer control 7

Nota del segundo control 10

Tu nota de Programacioacuten es 85

Ejemplo 2

Nota del primer control 6

Nota del segundo control 3

iquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) apto

Tu nota de Programacioacuten es 5

Ejemplo 3

Nota del primer control 6

Nota del segundo control 3

iquestCuaacutel ha sido el resultado de la recuperacioacuten (aptono apto) no apto

Tu nota de Programacioacuten es 45

Ejercicio 22Realiza un programa que dado un diacutea de la semana (de lunes a viernes) y unahora (horas y minutos) calcule cuaacutentos minutos faltan para el fin de semanaSe consideraraacute que el fin de semana comienza el viernes a las 1500h Se dapor hecho que el usuario introduciraacute un diacutea y hora correctos anterior al viernesa las 1500h

5 BuclesLos bucles se utilizan para repetir un conjunto de sentencias Por ejemplo imagina quees necesario introducir la notas de 40 alumnos con el fin de calcular la media la notamaacutexima y la nota miacutenima Podriacuteamos escribir 40 veces la intruccioacuten que pide un datopor teclado Systemconsole()readLine() y convertir cada uno de esos datos a un nuacutemerocon decimales con 40 instrucciones DoubleparseDouble() no parece algo muy eficienteEs mucho maacutes praacutectico meter dentro de un bucle aquellas sentencias que queremosque se repitanNormalmente existe una condicioacuten de salida que hace que el flujo del programaabandone el bucle y continuacutee justo en la siguiente sentencia Si no existe condicioacuten desalida o si esta condicioacuten no se cumple nunca se produciriacutea lo que se llama un bucleinfinito y el programa no terminariacutea nunca

51 Bucle for

Se suele utilizar cuando se conoce previamente el nuacutemero exacto de iteraciones(repeticiones) que se van a realizar La sintaxis es la siguiente

for (expresion1 expresion2 expresion3)

sentencias

Justo al principio se ejecuta expresion1 normalmente se usa para inicializar una variableEl bucle se repite mientras se cumple expresion2 y en cada iteraccioacuten del bucle seejecuta expresion3 que suele ser el incremento o decremento de una variable Conun ejemplo se veraacute mucho maacutes claro

Bucle for author Luis Joseacute Saacutenchez

public class EjemploFor

public static void main(String[] args)

for (int i = 1 i lt 11 i++)

Systemoutprintln(i)

39

Bucles 40

En este ejemplo int i = 1 se ejecuta solo una vez antes que cualquier otra cosa comoves esta expresioacuten se utiliza para inicializar la variable i a 1 Mientra se cumpla lacondicioacuten i lt 11 el contenido del bucle o sea Systemoutprintln(i) se va a ejecutarEn cada iteracioacuten del bucle i++ hace que la variable i se incremente en 1 El resultadodel ejemplo es la impresioacuten en pantalla de los nuacutemeros del 1 al 10Intenta seguir mentalmente el flujo del programa Experimenta inicializando la variablei con otros valores cambia la condicioacuten con gt o lt= y observa lo que sucede Pruebatambieacuten a cambiar el incremento de la variable i por ejemplo con i = i + 2

52 Bucle while

El bucle while se utiliza para repetir un conjunto de sentencias siempre que se cumplauna determinada condicioacuten Es importante resentildear que la condicioacuten se comprueba alcomienzo del bucle por lo que se podriacutea dar el caso de que dicho bucle no se ejecutasenunca La sintaxis es la siguiente

while (expresion)

sentencias

Las sentencias se ejecutan una y otra vez mientras expresion sea verdadera El siguienteejemplo produce la misma salida que el ejemplo anterior muestra coacutemo cambian losvalores de i del 1 al 10

Bucle while author Luis Joseacute Saacutenchez

public class EjemploWhile

public static void main(String[] args)

int i = 1

while (i lt 11)

Systemoutprintln(i)

Bucles 41

i++

En el siguiente ejemplo se cuentan y se suman los nuacutemeros que se van introduciendopor teclado Para indicarle al programa que debe dejar de pedir nuacutemeros el usuariodebe introducir un nuacutemero negativo esa seraacute la condicioacuten de salida del bucle Observaque el bucle se repite mientras el nuacutemero introducido sea mayor o igual que cero

Bucle while que termina cuando se introduce por teclado un nuacutemero negativo author Luis Joseacute Saacutenchez

public class CuentaPositivos

public static void main(String[] args)

Systemoutprintln(Por favor vaya introduciendo nuacutemeros y pulsando INTRO)

Systemoutprintln(Para terminar introduzca un nuacutemero negativo)

int numeroIntroducido = 0

int cuentaNumeros = 0

int suma = 0

while (numeroIntroducido gt= 0)

numeroIntroducido = IntegerparseInt(Systemconsole()readLine())

cuentaNumeros++ Incrementa en uno la variablesuma += numeroIntroducido Equivale a suma = suma + NumeroIntroducido

Systemoutprintln(Has introducido + (cuentaNumeros - 1) + nuacutemeros positivos)

Systemoutprintln(La suma total de ellos es + (suma - numeroIntroducido))

53 Bucle do-while

El bucle do-while funciona de la misma manera que el bucle while con la salvedad deque expresion se evaluacutea al final de la iteraccioacuten Las sentencias que encierran el bucledo-while por tanto se ejecutan como miacutenimo una vez La sintaxis es la siguiente

Bucles 42

do

sentencias

while (expresion)

El siguiente ejemplo es el equivalente do-while a los dos ejemplos anteriores quecuentan del 1 al 10

Bucle do-while author Luis Joseacute Saacutenchez

public class EjemploDoWhile

public static void main(String[] args)

int i = 1

do

Systemoutprintln(i)

i++

while (i lt 11)

Veamos otro ejemplo En este caso se van a ir leyendo nuacutemeros de teclado mientrasel nuacutemero introducido sea par el programa pararaacute por tanto cuando se introduzcaun nuacutemero impar

Bucle do-while que termina cuando se introduce por teclado un nuacutemero impar author Luis Joseacute Saacutenchez

public class TerminaCuandoEsImpar

public static void main(String[] args)

int numero

Bucles 43

do

Systemoutprint(Dime un nuacutemero )

numero = IntegerparseInt(Systemconsole()readLine())

if (numero 2 == 0) comprueba si el nuacutemero introducido es parSystemoutprintln(Queacute bonito es el + numero)

else

Systemoutprintln(No me gustan los nuacutemeros impares adioacutes)

while (numero 2 == 0)

Te invito a que realices una modificacioacuten sobre este uacuteltimo ejemplo Despueacutes de pedirun nuacutemero haz que el programa diga iquestQuiere continuar (sn) Si el usuario introduceuna s o una S el programa deberaacute continuar pidiendo nuacutemerosCualquier bucle que un programador quiera realizar en Java lo puede implementar confor while o do-while por tanto con una sola de estas tres opciones tendriacutea suficienteNo obstante seguacuten el programa en cuestioacuten una u otra posibilidad se adapta mejorque las otras y resulta maacutes elegante Con la experiencia te iraacutes dando cuenta cuaacutendoes mejor utilizar cada una

Bucles 44

54 Ejercicios

Ejercicio 1Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle for

Ejercicio 2Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle while

Ejercicio 3Muestra los nuacutemeros muacuteltiplos de 5 de 0 a 100 utilizando un bucle do-while

Ejercicio 4Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 hacia atraacutesutilizando un bucle for

Ejercicio 5Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 hacia atraacutesutilizando un bucle while

Ejercicio 6Muestra los nuacutemeros del 320 al 160 contando de 20 en 20 utilizando un bucledo-while

Ejercicio 7Realiza el control de acceso a una caja fuerte La combinacioacuten seraacute unnuacutemero de 4 cifras El programa nos pediraacute la combinacioacuten para abrirla Si noacertamos se nos mostraraacute el mensaje ldquoLo siento esa no es la combinacioacutenrdquoy si acertamos se nos diraacute ldquoLa caja fuerte se ha abierto satisfactoriamenterdquoTendremos cuatro oportunidades para abrir la caja fuerte

Ejercicio 8Muestra la tabla de multiplicar de un nuacutemero introducido por teclado

Bucles 45

Ejercicio 9Realiza un programa que nos diga cuaacutentos diacutegitos tiene un nuacutemero introducidopor teclado

Ejercicio 10Escribe un programa que calcule la media de un conjunto de nuacutemeros positivosintroducidos por teclado A priori el programa no sabe cuaacutentos nuacutemeros seintroduciraacuten El usuario indicaraacute que ha terminado de introducir los datoscuando meta un nuacutemero negativo

Ejercicio 11Escribe un programa que muestre en tres columnas el cuadrado y el cubo delos 5 primeros nuacutemeros enteros a partir de uno que se introduce por teclado

Ejercicio 12Escribe un programa que muestre los n primeros teacuterminos de la serie deFibonacci El primer teacutermino de la serie de Fibonacci es 0 el segundo es 1y el resto se calcula sumando los dos anteriores por lo que tendriacuteamos quelos teacuterminos son 0 1 1 2 3 5 8 13 21 34 55 89 144hellip El nuacutemero n sedebe introducir por teclado

Ejercicio 13Escribe un programa que lea una lista de diez nuacutemeros y determine cuaacutentosson positivos y cuaacutentos son negativos

Ejercicio 14Escribe un programa que pida una base y un exponente (entero positivo) yque calcule la potencia

Ejercicio 15Escribe un programa que dados dos nuacutemeros uno real (base) y un enteropositivo (exponente) saque por pantalla todas las potencias con base elnumero dado y exponentes entre uno y el exponente introducido No se debenutilizar funciones de exponenciacioacuten Por ejemplo si introducimos el 2 y el 5se deberaacuten mostrar 21 22 23 24 y 25

Bucles 46

Ejercicio 16Escribe un programa que diga si un nuacutemero introducido por teclado es o noprimo Un nuacutemero primo es aquel que soacutelo es divisible entre eacutel mismo y launidad

Ejercicio 17Realiza un programa que sume los 100 nuacutemeros siguientes a un nuacutemero enteroy positivo introducido por teclado Se debe comprobar que el dato introducidoes correcto (que es un nuacutemero positivo)

Ejercicio 18Escribe un programa que obtenga los nuacutemeros enteros comprendidos entredos nuacutemeros introducidos por teclado y validados como distintos el programadebe empezar por el menor de los enteros introducidos e ir incrementando de7 en 7

Ejercicio 19Realiza un programa que pinte una piraacutemide por pantalla La altura se debepedir por teclado El caraacutecter con el que se pinta la piraacutemide tambieacuten se debepedir por teclado

Ejercicio 20Igual que el ejercicio anterior pero esta vez se debe pintar una piraacutemide hueca

Ejercicio 21Realiza un programa que vaya pidiendo nuacutemeros hasta que se introduzca unnumero negativo y nos diga cuantos nuacutemeros se han introducido la media delos impares y el mayor de los pares El nuacutemero negativo soacutelo se utiliza paraindicar el final de la introduccioacuten de datos pero no se incluye en el coacutemputo

Ejercicio 22Muestra por pantalla todos los nuacutemeros primos entre 2 y 100 ambos incluidos

Bucles 47

Ejercicio 23Escribe un programa que permita ir introduciendo una serie indeterminadade nuacutemeros mientras su suma no supere el valor 10000 Cuando esto uacuteltimoocurra se debe mostrar el total acumulado el contador de los nuacutemerosintroducidos y la media

Ejercicio 24Escribe un programa que lea un nuacutemero n e imprima una piraacutemide de nuacutemeroscon n filas como en la siguiente figura

1

121

12321

1234321

Ejercicio 25Realiza un programa que pida un nuacutemero por teclado y que luego muestre esenuacutemero al reveacutes

Ejercicio 26Realiza un programa que pida primero un nuacutemero y a continuacioacuten un diacutegitoEl programa nos debe dar la posicioacuten (o posiciones) contando de izquierda aderecha que ocupa ese diacutegito en el nuacutemero introducido

Ejercicio 27Escribe un programa que muestre cuente y sume los muacuteltiplos de 3 que hayentre 1 y un nuacutemero leiacutedo por teclado

Ejercicio 28Escribe un programa que calcule el factorial de un nuacutemero entero leiacutedo porteclado

Ejercicio 29Escribe un programa que muestre por pantalla todos los nuacutemeros enterospositivos menores a uno leiacutedo por teclado que no sean divisibles entre otrotambieacuten leiacutedo de igual forma

Bucles 48

Ejercicio 30Realiza una programa que calcule las horas transcurridas entre dos horas dedos diacuteas de la semana No se tendraacuten en cuenta los minutos ni los segundosEl diacutea de la semana se puede pedir como un nuacutemero (del 1 al 7) o comouna cadena (de ldquolunesrdquo a ldquodomingordquo) Se debe comprobar que el usuariointroduce los datos correctamente y que el segundo diacutea es posterior al primeroA continuacioacuten se muestra un ejemplo

Por favor introduzca la primera hora

Diacutea lunes

Hora 18

Por favor introduzca la segunda hora

Diacutea martes

Hora 20

Entre las 1800h del lunes y las 2000h del martes hay 26 horas

Ejercicio 31Realiza un programa que pinte la letra L por pantalla hecha con asteriscos Elprograma pediraacute la altura El palo horizontal de la L tendraacute una longitud de lamitad (divisioacuten entera entre 2) de la altura maacutes unoEjemplo

Introduzca la altura de la L 5

Bucles 49

Ejercicio 32Escribe un programa que dado un nuacutemero entero diga cuaacuteles son y cuaacutentosuman los diacutegitos pares Los diacutegitos pares se deben mostrar en orden deizquierda a derecha Usa long en lugar de int donde sea necesario para admitirnuacutemeros largosEjemplo 1

Por favor introduzca un nuacutemero entero positivo 94026782

Diacutegitos pares 4 0 2 6 8 2

Suma de los diacutegitos pares 22

Ejemplo 2

Por favor introduzca un nuacutemero entero positivo 31779

Diacutegitos pares

Suma de los diacutegitos pares 0

Ejemplo 3

Por favor introduzca un nuacutemero entero positivo 2404

Diacutegitos pares 2 4 0 4

Suma de los diacutegitos pares 10

Ejercicio 33Realiza un programa que pinte la letra U por pantalla hecha con asteriscos Elprograma pediraacute la altura Fiacutejate que el programa inserta un espacio y pintados asteriscos menos en la base para simular la curvatura de las esquinasinferioresEjemplo

Introduzca la altura de la U 5

Bucles 50

Ejercicio 34Escribe un programa que pida dos nuacutemeros por teclado y que luego mezcle endos nuacutemeros diferentes los diacutegitos pares y los impares Se van comprobandolos diacutegitos de la siguiente manera primer diacutegito del primer nuacutemero primerdiacutegito del segundo nuacutemero segundo diacutegito del primer nuacutemero segundodiacutegito del segundo nuacutemero tercer diacutegito del primer nuacutemerohellip Para facilitarel ejercicio podemos suponer que el usuario introduciraacute dos nuacutemeros de lamisma longitud y que siempre habraacute al menos un diacutegito par y uno impar Usalong en lugar de int donde sea necesario para admitir nuacutemeros largosEjemplo 1

Por favor introduzca un nuacutemero 9402

Introduzca otro nuacutemero 6782

El nuacutemero formado por los diacutegitos pares es 640822

El nuacutemero formado por los diacutegitos impares es 97

Ejemplo 2

Por favor introduzca un nuacutemero 137

Introduzca otro nuacutemero 909

El nuacutemero formado por los diacutegitos pares es 0

El nuacutemero formado por los diacutegitos impares es 19379

6 Nuacutemeros aleatoriosLos nuacutemeros aleatorios se utilizan con frecuencia en programacioacuten para emular elcomportamiento de alguacuten fenoacutemeno natural el resultado de un juego de azar o engeneral para generar cualquier valor impredecible a prioriPor ejemplo se pueden utilizar nuacutemeros aleatorios para generar tiradas de dados detal forma que de antemano no se puede saber el resultado Antes de tirar un dado nosabemos si saldraacute un 3 o un 5 se trataraacute pues de un nuacutemero impredecible lo que siacutesabemos es que saldraacute un nuacutemero entre el 1 y el 6 es decir podemos acotar el rangode los valores que vamos a obtener de forma aleatoria

61 Generacioacuten de nuacutemeros aleatorios con y sin decimales

Para generar valores aleatorios utilizaremos Mathrandom() Esta funcioacuten genera unnuacutemero con decimales (de tipo double) en el intervalo [0 - 1) es decir genera un nuacutemeromayor o igual que 0 y menor que 1El siguiente programa genera diez nuacutemeros aleatorios

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio01

public static void main(String[] args)

Systemoutprintln(Diez nuacutemeros aleatoriosn)

for (int i = 1 i lt 11 i++)

Systemoutprintln(Mathrandom())

La salida del programa puede ser algo como esto

51

Nuacutemeros aleatorios 52

030830376099567813

08330493363981046

02322483682676435

03130746053770094

034192944433558736

09636470440975567

03398896383918959

079825461825305

09868509622870223

09967893773101499

Te invito a que ejecutes varias veces el programa Podraacutes observar que cada vez salennuacutemeros diferentes aunque siempre estaacuten comprendidos entre 0 y 1 (incluyendo el0)Pensaraacutes que no es muy uacutetil generar nuacutemeros aleatorios entre 0 y 1 si lo que queremoses por ejemplo sacar una carta al azar de la baraja espantildeola pero en realidad unnuacutemero decimal entre 0 y 1 es lo uacutenico que nos hace falta para generar cualquier tipode valor aleatorio siempre y cuando se manipule ese nuacutemero de la forma adecuadaPor ejemplo si queremos generar valores aleatorios entre 0 y 10 (incluyendo el 0 y sinllegar a 10) simplemente tendremos que correr la coma un lugar o lo que es lo mismomultiplicar por 10

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio02

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 0 y 10)

Systemoutprintln( sin llegar a 10 (con decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprintln( Mathrandom()10 + )

El programa anterior genera una salida como eacutesta

Nuacutemeros aleatorios 53

007637674702636321

1025787417143682

1854993461897163

5690351111720931

382310645589797

5518007662236258

923529380254256

39201032643833376

5836554253122096

6224559064261578

7652976185871555

49922807025365135

7498156441347868

8743251697509109

9727764845406675

2929766691797686

005801413446517634

21575652936687284

Si queremos generar nuacutemeros enteros en lugar de nuacutemeros con decimales basta conhacer un casting para convertir los nuacutemeros de tipo double en nuacutemeros de tipo intRecuerda que (int)x transforma x en una variable de tipo entero si x era de tipo float

o double perderiacutea todos los decimales

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio03

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 0 y 9 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint((int)(Mathrandom()10) + )

Systemoutprintln()

La salida del programa debe ser algo muy parecido a esto

Nuacutemeros aleatorios 54

20 nuacutemeros aleatorios entre 0 y 9 (sin decimales)

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

iquestY si en lugar de generar nuacutemeros enteros entre 0 y 9 queremos generar nuacutemeros entre1 y 10 Como habraacutes podido adivinar simplemente habriacutea que sumar 1 al nuacutemerogenerado de esta forma se ldquodesplazan un pasordquo los valores generados al azar de talforma que el miacutenimo valor que se produce seriacutea el 0 + 1 = 1 y el maacuteximo seriacutea 9 + 1= 10

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio04

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 1 y 10 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint( (int)(Mathrandom()10 + 1) + )

Systemoutprintln()

Vamos a ponerlo un poco maacutes difiacutecil Ahora vamos a generar nuacutemeros enteros entre50 y 60 ambos incluidos Primero multiplicamos Mathrandom() por 11 con lo queobtenemos nuacutemeros decimales entre 0 y 109999hellip (sin llegar nunca hasta 11) Luegodesplazamos ese intervalo sumando 50 por lo que obtenemos nuacutemeros decimalesentre 50 y 609999hellip Por uacuteltimo quitamos los decimales haciendo casting y voilagraveya tenemos nuacutemeros enteros aleatorios entre 50 y 60 ambos incluidos

Nuacutemeros aleatorios 55

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio05

public static void main(String[] args)

Systemoutprintln(20 nuacutemeros aleatorios entre 50 y 60 (sin decimales))

for (int i = 1 i lt= 20 i++)

Systemoutprint(((int)(Mathrandom()11) + 50 ) + )

Systemoutprintln()

62 Generacioacuten de palabras de forma aleatoria de un conjuntodado

Hemos visto coacutemo generar nuacutemeros aleatorios con y sin decimales y en diferentesintervalos Vamos a producir ahora de forma aleatoria una palabra - piedra papel otijera - generando primero un nuacutemero entero entre 0 y 2 y posteriormente haciendocorresponder una palabra a cada nuacutemero

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio06

public static void main(String[] args)

Systemoutprintln(Genera al azar piedra papel o tijera)

int mano = (int)(Mathrandom()3) genera un nuacutemero al azar entre 0 y 2 ambos incluidos

switch(mano)

case 0

Systemoutprintln(piedra)

Nuacutemeros aleatorios 56

breakcase 1

Systemoutprintln(papel)

breakcase 2

Systemoutprintln(tijera)

breakdefault

iquestCoacutemo podriacuteamos generar un diacutea de la semana de forma aleatoria En efecto primerogeneramos un nuacutemero entre 1 y 7 ambos inclusive y luego hacemos corresponder undiacutea de la semana a cada uno de los nuacutemeros

Generacioacuten de nuacutemeros aleatorios author Luis Joseacute Saacutenchez

public class Aleatorio07

public static void main(String[] args)

Systemoutprintln(Muestra un diacutea de la semana al azar)

int dia = (int)(Mathrandom()7) + 1 genera un nuacutemero aleatorio entre el 1 y el 7

switch(dia)

case 1

Systemoutprintln(lunes)

breakcase 2

Systemoutprintln(martes)

breakcase 3

Systemoutprintln(mieacutercoles) breakcase 4

Systemoutprintln(jueves)

breakcase 5

Systemoutprintln(viernes)

breakcase 6

Nuacutemeros aleatorios 57

Systemoutprintln(saacutebado)

breakcase 7

Systemoutprintln(domingo)

breakdefault

Nuacutemeros aleatorios 58

63 Ejercicios

Ejercicio 1Escribe un programa que muestre la tirada de tres dados Se debe mostrartambieacuten la suma total (los puntos que suman entre los tres dados)

Ejercicio 2Realiza un programa que muestre al azar el nombre de una carta de labaraja francesa Esta baraja estaacute dividida en cuatro palos picas corazonesdiamantes y treacuteboles Cada palo estaacute formado por 13 cartas de las cuales 9cartas son numerales y 4 literales 2 3 4 5 6 7 8 9 10 J Q K y A (queseriacutea el 1) Para convertir un nuacutemero en una cadena de caracteres podemosusar StringvalueOf(n)

Ejercicio 3Igual que el ejercicio anterior pero con la baraja espantildeola Se utilizaraacute la barajade 40 cartas 2 3 4 5 6 7 sota caballo rey y as

Ejercicio 4Muestra 20 nuacutemeros enteros aleatorios entre 0 y 10 (ambos incluidos) sepa-rados por espacios

Ejercicio 5Muestra 50 nuacutemeros enteros aleatorios entre 100 y 199 (ambos incluidos)separados por espacios Muestra tambieacuten el maacuteximo el miacutenimo y la mediade esos nuacutemeros

Ejercicio 6Escribe un programa que piense un nuacutemero al azar entre 0 y 100 El usuariodebe adivinarlo y tiene para ello 5 oportunidades Despueacutes de cada intentofallido el programa diraacute cuaacutentas oportunidades quedan y si el nuacutemero intro-ducido es menor o mayor que el nuacutemero secreto

Ejercicio 7Escribe un programa que muestre tres apuestas de la quiniela en tres colum-nas para los 14 partidos y el pleno al quince (15 filas)

Nuacutemeros aleatorios 59

Ejercicio 8Modifica el programa anterior para que la probabilidad de que salga un 1 seade 12 la probabilidad de que salga x sea de 13 y la probabilidad de que salga2 sea de 16 Pista 12 = 36 y 13 = 26

Ejercicio 9Realiza un programa que vaya generando nuacutemeros aleatorios pares entre 0y 100 y que no termine de generar nuacutemeros hasta que no saque el 24 Elprograma deberaacute decir al final cuaacutentos nuacutemeros se han generado

Ejercicio 10Realiza un programa que pinte por pantalla diez liacuteneas formadas por carac-teres El caraacutecter con el que se pinta cada liacutenea se elige de forma aleatoriaentre uno de los siguientes - = | Las liacuteneas deben tener una longitudaleatoria entre 1 y 40 caracteres

Ejercicio 11Escribe un programa que muestre 20 notas generadas al azar Las notas debenaparecer de la forma suspenso suficiente bien notable o sobresaliente Alfinal apareceraacute el nuacutemero de suspensos el nuacutemero de suficientes el nuacutemerode bienes etc

Ejercicio 12Realiza un programa que llene la pantalla de caracteres aleatorios (a lo Matrix)con el coacutedigo ascii entre el 32 y el 126 Puedes hacer casting con (char) paraconvertir un entero en un caraacutecter

Ejercicio 13Escribe un programa que simule la tirada de dos dados El programa deberaacutecontinuar tirando los dados una y otra vez hasta que en alguna tirada los dosdados tengan el mismo valor

Ejercicio 14Realiza un programa que haga justo lo contrario a lo que hace el ejercicio 6El programa intentaraacute adivinar el nuacutemero que estaacutes pensando - un nuacutemeroentre 0 y 100 - teniendo para ello 5 oportunidades En cada intento fallido elprograma debe preguntar si el nuacutemero que estaacutes pensando es mayor o menorque el que te acaba de decir

Nuacutemeros aleatorios 60

Ejercicio 15Realiza un generador de melodiacutea con las siguientes condicionesa) Las notas deben estar generadas al azar Las 7 notas son do re mi fasol la y sib) Una melodiacutea estaacute formada por un nuacutemero aleatorio de notas mayor o iguala 4 menor o igual a 28 y siempre muacuteltiplo de 4 (4 8 12hellip)c) Cada grupo de 4 notas seraacute un compaacutes y estaraacute separado del siguientecompaacutes mediante la barra vertical ldquo|rdquo (Alt + 1) El final de la melodiacutea se marcacon dos barrasd) La uacuteltima nota de la melodiacutea debe coincidir con la primeraEjemplo 1

do mi fa mi | si do sol fa | fa re si do | sol mi re do ||

Ejemplo 2

la re mi sol | fa mi mi si | do la sol fa | fa re si sol | do sol mi re | fa la do la ||

Nuacutemeros aleatorios 61

Ejercicio 16Realiza un simulador de maacutequina tragaperras simplificada que cumpla lossiguientes requisitosa) El ordenador mostraraacute una tirada que consiste en mostrar 3 figuras Hay 5figuras posibles corazoacuten diamante herradura campana y limoacutenb) Si las tres figuras son diferentes se debe mostrar el mensaje ldquoLo sientoha perdidordquoc) Si hay dos figuras iguales y una diferente se debe mostrar el mensaje ldquoBienha recuperado su monedardquod) Si las tres figuras son iguales se debe mostrar ldquoEnhorabuena ha ganado10 monedasrdquoEjemplo 1

diamante diamante limoacuten

Bien ha recuperado su moneda

Ejemplo 2

herradura campana diamante

Lo siento ha perdido

Ejemplo 3

corazoacuten corazoacuten corazoacuten

Enhorabuena ha ganado 10 monedas

7 Arrays

71 Arrays de una dimensioacuten

Un array es un tipo de dato capaz de almacenar muacuteltiples valores Se utiliza paraagrupar datos muy parecidos por ejemplo si se necesita almacenar la temperaturamedia diaria en Maacutelaga durante el uacuteltimo antildeo se pueden utilizar las variables temp0temp1 temp2 temp3 temp4 hellip y asiacute hasta 365 variables distintas pero seriacutea poco praacutectico esmejor utilizar un array de nombre temp y usar un iacutendice para referanciar la temperaturade un diacutea concreto del antildeoEn matemaacuteticas un array de una dimensioacuten se llama vector En este libro noutilizaremos este teacutermino para no confundirlo con la clase Vector de JavaVeamos con un ejemplo coacutemo se crea y se utiliza un array

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array01

public static void main(String[] args)

int[] n se define n como un array de enterosn = new int[4] se reserva espacio para 4 enteros

n[0] = 26

n[1] = -30

n[2] = 0

n[3] = 100

Systemoutprint(Los valores del array n son los siguientes )

Systemoutprint(n[0] + + n[1] + + n[2] + + n[3])

int suma = n[0] + n[3]

Systemoutprintln(nEl primer elemento del array maacutes el uacuteltimo suman + suma)

Observa que el iacutendice de cada elemento de un array se indica entre corchetes de talforma que n[3] es el cuarto elemento ya que el primer iacutendice es el 0

62

Arrays 63

Array n

Iacutendice Valor0 261 -302 03 11

Fiacutejate que la definicioacuten del array y la reserva de memoria para los cuatro elementosque la componen se ha realizado en dos liacuteneas diferentes Se pueden hacer ambascosas en una sola liacutenea como veremos en el siguiente ejemplo

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array02

public static void main(String[] args)

definicioacuten del array y reserva de memoria en la misma liacuteneaint[] x = new int[5]

x[0] = 8

x[1] = 33

x[2] = 200

x[3] = 150

x[4] = 11

Systemoutprintln(El array x tiene 5 elementos iquestcuaacutel de ellos quiere ver)

Systemoutprint(Introduzca un nuacutemero del 0 al 4 )

int indice = IntegerparseInt(Systemconsole()readLine())

Systemoutprint(El elemento que se encuentra en la posicioacuten + indice)

Systemoutprintln( es el + x[indice])

El array x del ejemplo anterior se ha ido rellenando elemento a elemento Si se conocenpreviamente todos los valores iniciales del array se puede crear e inicializar en unasola liacutenea de la siguiente forma

int[] x = 8 33 200 150 11

Cada elemento del array se puede utilizar exactamente igual que cualquier otravariable es decir se le puede asignar un valor o se puede usar dentro de una

Arrays 64

expresioacuten En el siguiente ejemplo se muestran varias operaciones en las que losoperandos son elementos del array numPara recorrer todos los elementos de un array se suele utilizar un bucle for junto conun iacutendice que va desde 0 hasta el tamantildeo del array menos 1

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array03

public static void main(String[] args)

int[] num = new int[10]

num[0] = 8

num[1] = 33

num[2] = 200

num[3] = 150

num[4] = 11

num[5] = 88

num[6] = num[2] 10

num[7] = num[2] 10

num[8] = num[0] + num[1] + num[2]

num[9] = num[8]

Systemoutprintln(El array num contiene los siguientes elementos)

for (int i = 0 i lt 10 i++)

Systemoutprintln(num[i])

En Java a diferencia de otros lenguajes como Ruby o PHP todos los elementos de unarray deben ser del mismo tipo por ejemplo no puede haber un entero en la posicioacuten2 y una cadena de caracteres en la posicioacuten 7 del mismo array En el siguiente ejemplose muestra un array de caracteres

Arrays 65

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array04

public static void main(String[] args)

char[] caracter = new char[6]

caracter[0] = R

caracter[1] =

caracter[2] = amp

caracter[3] = +

caracter[4] = A

caracter[5] = 2

Systemoutprintln(El array caracter contiene los siguientes elementos)

for (int i = 0 i lt 6 i++)

Systemoutprintln(caracter[i])

En el siguiente ejemplo se muestra un array de nuacutemeros de tipo double que almacenanotas de alumnos

Ejemplo de uso de arrays author Luis Joseacute Saacutenchez

public class Array05

public static void main(String[] args)

double[] nota = new double[4]

Systemoutprintln(Para calcular la nota media necesito saber la )

Systemoutprintln(nota de cada uno de tus exaacutemenes)

for (int i = 0 i lt 4 i++)

Arrays 66

Systemoutprint(Nota del examen nordm + (i + 1) + )

nota[i] = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(Tus notas son )

double suma = 0

for (int i = 0 i lt 4 i++)

Systemoutprint(nota[i] + )

suma += nota[i]

Systemoutprintln(nLa media es + suma 4)

72 Arrays bidimensionales

Un array bidimensional utiliza dos iacutendices para localizar cada elemento Podemos vereste tipo de dato como un array que a su vez contiene otros arrays Tambieacuten se puedever como una cuadriacutecula en la que los datos quedan distribuidos en filas y columnasEn el siguiente ejemplo se muestra la definicioacuten y el uso de un array de dosdimensiones

author Luis Joseacute Saacutenchez Ejemplo de uso de arrays bidimensionales

public class ArrayBi01

public static void main(String[] args)

throws InterruptedException Se antildeade esta liacutenea para poder usar sleep

int[][] n = new int[3][2] array de 3 filas por 2 columnas

n[0][0]=20

n[1][0]=67

n[1][1]=33

n[2][1]=7

int fila columna

Arrays 67

for(fila = 0 fila lt 3 fila++)

Systemoutprint(Fila + fila)

for(columna = 0 columna lt 2 columna++)

Systemoutprintf(10d n[fila][columna])

Threadsleep(1000) retardo de un segundo

Systemoutprintln()

Mediante la liacutenea int[][] n = new int[3][2] se define un array bidimensional de 3 filaspor 2 columnas pero bien podriacutean ser 2 filas por 3 columnas seguacuten el objetivo y eluso que del array haga el programadorLos valores del array bidimensional se pueden proporcionar en la misma liacutenea de ladefinicioacuten como se muestra en el siguiente ejemplo

author Luis Joseacute Saacutenchez Ejemplo de uso de arrays bidimensionales

public class ArrayBi02

public static void main(String[] args)

throws InterruptedException Se antildeade esta liacutenea para poder usar sleep

int fila columna

int[][] n = 20 4 67 33 07

for(fila = 0 fila lt 3 fila++)

Systemoutprint(Fila + fila)

for(columna = 0 columna lt 2 columna++)

Systemoutprintf(10d n[fila][columna])

Threadsleep(1000) retardo de un segundo

Systemoutprintln()

Arrays 68

Los arrays bidimensionales se utilizan con frecuencia para situar objetos en un planocomo por ejemplo las piezas de ajedrez en un tablero o un personaje de video-juegoen un laberintoEn el siguiente programa se colocan una mina y un tesoro de forma aleatoria en uncuadrante de cuatro filas por cinco columnas El usuario intentaraacute averiguar doacutendeestaacute el tesoro indicando las coordenadas (x y)

Minijuego Busca el tesoro Se colocan una mina y un tesoro de forma aleatoria en un cuadrante de cuatro filas por cinco columnas El usuario intentaraacute averiguar doacutende estaacute el tesoro author Luis Joseacute Saacutenchez

public class BuscaTesoro

se definen constantes para representar el contenido de las celdasstatic final int VACIO = 0

static final int MINA = 1

static final int TESORO = 2

static final int INTENTO = 3

public static void main(String[] args)

int x

int y

int[][] cuadrante = new int[5][4]

inicializa el arrayfor(x = 0 x lt 4 x++)

for(y = 0 y lt 3 y++)

cuadrante[x][y] = VACIO

coloca la minaint minaX = (int)(Mathrandom()4)int minaY = (int)(Mathrandom()3)cuadrante[minaX][minaY] = MINA

coloca el tesoroint tesoroX

Arrays 69

int tesoroY

do

tesoroX = (int)(Mathrandom()4)tesoroY = (int)(Mathrandom()3)

while ((minaX == tesoroX) ampamp (minaY == tesoroY))

cuadrante[tesoroX][tesoroY] = TESORO

juegoSystemoutprintln(iexclBUSCA EL TESORO)

boolean salir = falseString c =

do

pinta el cuadrantefor(y = 3 y gt= 0 y--)

Systemoutprint(y + |)

for(x = 0 x lt 5 x++)

if (cuadrante[x][y] == INTENTO)

Systemoutprint(X )

elseSystemoutprint( )

Systemoutprintln()

Systemoutprintln( ----------n 0 1 2 3 4n)

pide las coordenadasSystemoutprint(Coordenada x )

x = IntegerparseInt(Systemconsole()readLine())

Systemoutprint(Coordenada y )

y = IntegerparseInt(Systemconsole()readLine())

mira lo que hay en las coordenadas indicadas por el usuarioswitch(cuadrante[x][y])

case VACIO

cuadrante[x][y] = INTENTO

breakcase MINA

Systemoutprintln(Lo siento has perdido)

salir = truebreak

case TESOROSystemoutprintln(Enhorabuena has encontrado el tesoro)

salir = truebreak

default

Arrays 70

while (salir)

pinta el cuadrantefor(y = 3 y gt= 0 y--)

Systemoutprint(y + )

for(x = 0 x lt 5 x++)

switch(cuadrante[x][y])

case VACIO

c =

breakcase MINA

c =

breakcase TESORO

c = euro

breakcase INTENTO

c = x

breakdefault

Systemoutprint(c)

Systemoutprintln()

Systemoutprintln( ----------n 0 1 2 3 4n)

73 Recorrer arrays con for al estilo foreach

Al trabajar con arrays es muy frecuente cometer errores utilizando los iacutendices El errormaacutes tiacutepico consiste en intentar acceder a un elemento mediante un iacutendice que se salede los liacutemites Por ejemplo si tenemos el array n definido de la siguiente forma int[] n =

new int[10] cuando intentamos acceder a n[-1] o a n[10] obtenemos un error en tiempode ejecucioacutenPara recorrer un array de un modo maacutes praacutectico y sencillo sin que tengamos quepreocuparnos de los liacutemites podemos utilizar el bucle for con el formato foreach Deesta forma indicamos simplemente el nombre del array que queremos recorrer y enqueacute variable se va a ir colocando cada elemento con cada iteraccioacuten del bucle No hayque especificar con queacute iacutendice comienza y termina el bucle de eso se encarga JavaA continuacioacuten se muestra el ejemplo Array05java visto anteriormente pero esta vezutilizando el for a la manera foreach

Arrays 71

Recorre un array con un for al estilo foreach author Luis Joseacute Saacutenchez

public class ArrayForEach

public static void main(String[] args)

double[] nota = new double[4]

Systemoutprintln(Para calcular la nota media necesito saber la )

Systemoutprintln(nota de cada uno de tus exaacutemenes)

for (int i = 0 i lt 4 i++)

Systemoutprint(Nota del examen nordm + (i + 1) + )

nota[i] = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(Tus notas son )

double suma = 0

for (double n nota) for al estilo foreachSystemoutprint(n + )

suma += n

Systemoutprintln(nLa media es + suma 4)

Fiacutejate en el segundo for en este caso no se utiliza ninguacuten iacutendice simplemente decimosldquove sacando uno a uno los elementos del array nota y deposita cada uno de esoselementos en la variable n que es de tipo doublerdquo

Arrays 72

74 Ejercicios

741 Arrays de una dimensioacuten

Ejercicio 1Define un array de 12 nuacutemeros enteros con nombre num y asigna los valoresseguacuten la tabla que se muestra a continuacioacuten Muestra el contenido de todoslos elementos del array iquestQueacute sucede con los valores de los elementos que nohan sido inicializados

Ejercicio 2Define un array de 10 caracteres con nombre simbolo y asigna valores a loselementos seguacuten la tabla que se muestra a continuacioacuten Muestra el contenidode todos los elementos del array iquestQueacute sucede con los valores de los elementosque no han sido inicializados

Ejercicio 3Escribe un programa que lea 10 nuacutemeros por teclado y que luego los muestreen orden inverso es decir el primero que se introduce es el uacuteltimo enmostrarse y viceversa

Ejercicio 4Define tres arrays de 20 nuacutemeros enteros cada una con nombres numerocuadrado y cubo Carga el array numero con valores aleatorios entre 0 y 100 En elarray cuadrado se deben almacenar los cuadrados de los valores que hay en elarray numero En el array cubo se deben almacenar los cubos de los valores quehay en numero A continuacioacuten muestra el contenido de los tres arrays dispuestoen tres columnas

Arrays 73

Ejercicio 5Escribe un programa que pida 10 nuacutemeros por teclado y que luego muestrelos nuacutemeros introducidos junto con las palabras ldquomaacuteximordquo y ldquomiacutenimordquo al ladodel maacuteximo y del miacutenimo respectivamente

Ejercicio 6Escribe un programa que lea 15 nuacutemeros por teclado y que los almacene en unarray Rota los elementos de ese array es decir el elemento de la posicioacuten 0debe pasar a la posicioacuten 1 el de la 1 a la 2 etc El nuacutemero que se encuentra enla uacuteltima posicioacuten debe pasar a la posicioacuten 0 Finalmente muestra el contenidodel array

Ejercicio 7Escribe un programa que genere 100 nuacutemeros aleatorios del 0 al 20 y que losmuestre por pantalla separados por espacios El programa pediraacute entoncespor teclado dos valores y a continuacioacuten cambiaraacute todas las ocurrencias delprimer valor por el segundo en la lista generada anteriormente Los nuacutemerosque se han cambiado deben aparecer entrecomillados

Ejercicio 8Realiza un programa que pida la temperatura media que ha hecho en cada mesde un determinado antildeo y que muestre a continuacioacuten un diagrama de barrashorizontales con esos datos Las barras del diagrama se pueden dibujar a basede asteriscos o cualquier otro caraacutecter

Ejercicio 9Realiza un programa que pida 8 nuacutemeros enteros y que luego muestre esosnuacutemeros junto con la palabra ldquoparrdquo o ldquoimparrdquo seguacuten proceda

Ejercicio 10Escribe un programa que genere 20 nuacutemeros enteros aleatorios entre 0 y 100y que los almacene en un array El programa debe ser capaz de pasar todoslos nuacutemeros pares a las primeras posiciones del array (del 0 en adelante) ytodos los nuacutemeros impares a las celdas restantes Utiliza arrays auxiliares sies necesario

Arrays 74

Ejercicio 11Realiza un programa que pida 10 nuacutemeros por teclado y que los almacene enun array A continuacioacuten se mostraraacute el contenido de ese array junto al iacutendice(0 ndash 9) utilizando para ello una tabla Seguidamente el programa pasaraacute losprimos a las primeras posiciones desplazando el resto de nuacutemeros (los queno son primos) de tal forma que no se pierda ninguno Al final se debe mostrarel array resultantePor ejemplo

Array inicial

Array final

Ejercicio 12Realiza un programa que pida 10 nuacutemeros por teclado y que los almacene enun array A continuacioacuten se mostraraacute el contenido de ese array junto al iacutendice(0 ndash 9) Seguidamente el programa pediraacute dos posiciones a las que llamaremosldquoinicialrdquo y ldquofinalrdquo Se debe comprobar que inicial es menor que final y queambos nuacutemeros estaacuten entre 0 y 9 El programa deberaacute colocar el nuacutemero dela posicioacuten inicial en la posicioacuten final rotando el resto de nuacutemeros para que nose pierda ninguno Al final se debe mostrar el array resultantePor ejemplo para inicial = 3 y final = 7

Array inicial

Array final

Arrays 75

Ejercicio 13Escribe un programa que rellene un array de 100 elementos con nuacutemeros ente-ros aleatorios comprendidos entre 0 y 500 (ambos incluidos) A continuacioacutenel programa mostraraacute el array y preguntaraacute si el usuario quiere destacar elmaacuteximo o el miacutenimo Seguidamente se volveraacute a mostrar el array escribiendoel nuacutemero destacado entre dobles asteriscosEjemplo

459 204 20 250 178 90 353 32 229 357 224 454 260 310 140 249 332 426 423 413 96 447 465 29

8 459 411 118 480 302 417 42 82 126 82 474 362 76 190 104 21 257 88 21 251 6 383 47 78 392

394 244 494 87 253 376 379 98 364 237 13 299 228 409 402 225 426 267 330 243 209 426 435

309 356 173 130 416 15 477 34 28 377 193 481 368 466 262 422 275 384 399 397 87 218 84 312

480 207 68 108

iquestQueacute quiere destacar (1 ndash miacutenimo 2 ndash maacuteximo) 1

459 204 20 250 178 90 353 32 229 357 224 454 260 310 140 249 332 426 423 413 96 447 465 29

8 459 411 118 480 302 417 42 82 126 82 474 362 76 190 104 21 257 88 21 251 6 383 47 78

392 394 244 494 87 253 376 379 98 364 237 13 299 228 409 402 225 426 267 330 243 209 426

435 309 356 173 130 416 15 477 34 28 377 193 481 368 466 262 422 275 384 399 397 87 218 84

312 480 207 68 108

Ejercicio 14Escribe un programa que pida 8 palabras y las almacene en un array Acontinuacioacuten las palabras correspondientes a colores se deben almacenar alcomienzo y las que no son colores a continuacioacuten Puedes utilizar tantos arraysauxiliares como quieras Los colores que conoce el programa deben estar enotro array y son los siguientes verde rojo azul amarillo naranja rosa negroblanco y moradoEjemplo

Array original

0 1 2 3 4 5 6 7

casa azul verde orden morado bombillabici rosa

Array resultado

0 1 2 3 4 5 6 7

azul verde morado rosa casa orden bombillabici

Arrays 76

Ejercicio 15Un restaurante nos ha encargado una aplicacioacuten para colocar a los clientes ensus mesas En una mesa se pueden sentar de 0 (mesa vaciacutea) a 4 comensales(mesa llena) Cuando llega un cliente se le pregunta cuaacutentos son De momentoel programa no estaacute preparado para colocar a grupos mayores a 4 por tantosi un cliente dice por ejemplo que son un grupo de 6 el programa daraacute elmensaje ldquoLo siento no admitimos grupos de 6 haga grupos de 4personas como maacuteximo e intente de nuevordquo Para el grupo que llegase busca siempre la primera mesa libre (con 0 personas) Si no quedan mesaslibres se busca donde haya un hueco para todo el grupo por ejemplo si elgrupo es de dos personas se podraacute colocar donde haya una o dos personasInicialmente las mesas se cargan con valores aleatorios entre 0 y 4 Cadavez que se sientan nuevos clientes se debe mostrar el estado de las mesasLos grupos no se pueden romper aunque haya huecos sueltos suficientes Elfuncionamiento del programa se ilustra a continuacioacutenEjemplo

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 0 2 4 1 0 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 2

Por favor sieacutentense en la mesa nuacutemero 3

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 1 0 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 4

Por favor sieacutentense en la mesa nuacutemero 7

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 1 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 3

Tendraacuten que compartir mesa Por favor sieacutentense en la mesa nuacutemero 6

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 4 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) 4

Lo siento en estos momentos no queda sitio

Mesa nordm 1 2 3 4 5 6 7 8 9 10

Ocupacioacuten 3 2 2 2 4 4 4 2 1 1

iquestCuaacutentos son (Introduzca -1 para salir del programa) -1

Gracias Hasta pronto

Arrays 77

Ejercicio 16Escribe un programa que rellene un array de 20 elementos con nuacutemeros ente-ros aleatorios comprendidos entre 0 y 400 (ambos incluidos) A continuacioacutenel programa mostraraacute el array y preguntaraacute si el usuario quiere resaltar losmuacuteltiplos de 5 o los muacuteltiplos de 7 Seguidamente se volveraacute a mostrar elarray escribiendo los nuacutemeros que se quieren resaltar entre corchetesEjemplo ldquolsquoconsole159 204 20 250 178 90 353 32 229 357 224 54 260 310 140 249 335 326 22313 iquestQueacute nuacutemeros quiere resaltar (1 ndash los muacuteltiplos de 5 2 ndash los muacuteltiplos de7) 1 159 204 [20] [250] 178 [90] 353 32 229 357 224 54 [260] [310] [140]249 [335] 326 223 13 ldquolsquo

742 Arrays bidimensionales

Ejercicio 1Define un array de nuacutemeros enteros de 3 filas por 6 columnas con nombre num

y asigna los valores seguacuten la siguiente tabla Muestra el contenido de todoslos elementos del array dispuestos en forma de tabla como se muestra en lafigura

Ejercicio 2Escribe un programa que pida 20 nuacutemeros enteros Estos nuacutemeros se debenintroducir en un array de 4 filas por 5 columnas El programa mostraraacute lassumas parciales de filas y columnas igual que si de una hoja de caacutelculo setratara La suma total debe aparecer en la esquina inferior derecha

Arrays 78

Ejercicio 3Modifica el programa anterior de tal forma que los nuacutemeros que se introducenen el array se generen de forma aleatoria (valores entre 100 y 999)

Ejercicio 4Modifica el programa anterior de tal forma que las sumas parciales y la sumatotal aparezcan en la pantalla con un pequentildeo retardo dando la impresioacuten deque el ordenador se queda ldquopensandordquo antes de mostrar los nuacutemeros

Ejercicio 5Realiza un programa que rellene un array de 6 filas por 10 columnas connuacutemeros enteros positivos comprendidos entre 0 y 1000 (ambos incluidos)A continuacioacuten el programa deberaacute dar la posicioacuten tanto del maacuteximo comodel miacutenimo

Ejercicio 6Modifica el programa anterior de tal forma que no se repita ninguacuten nuacutemero enel array

Ejercicio 7Mejora el juego ldquoBusca el tesorordquo de tal forma que si hay una mina a una casillade distancia el programa avise diciendo iexclCuidado iexclHay una mina cerca

Ejercicio 8Escribe un programa que dada una posicioacuten en un tablero de ajedrez nos digaa queacute casillas podriacutea saltar un alfil que se encuentra en esa posicioacuten Como seindica en la figura el alfil se mueve siempre en diagonal El tablero cuenta con64 casillas Las columnas se indican con las letras de la ldquoardquo a la ldquohrdquo y las filasse indican del 1 al 8

Arrays 79

Ejemplo

Introduzca la posicioacuten del alfil d5

El aacutelfil puede moverse a las siguientes posiciones

h1 a2 g2 b3 e3 c4 e4 c6 e6 b7 f7 a8 g8

Ejercicio 9Realiza un programa que sea capaz de rotar todos los elementos de unamatriz cuadrada una posicioacuten en el sentido de las agujas del reloj La matrizdebe tener 12 filas por 12 columnas y debe contener nuacutemeros generados alazar entre 0 y 100 Se debe mostrar tanto la matriz original como la matrizresultado ambas con los nuacutemeros convenientemente alineados

Ejercicio 10Realiza el juego de las tres en raya

8 Funciones

81 Implementando funciones para reutilizar coacutedigo

En programacioacuten es muy frecuente reutilizar coacutedigo es decir usar coacutedigo ya exis-tente Cuando una parte de un programa requiere una funcionalidad que ya estaacuteimplementada en otro programa no tiene mucho sentido emplear tiempo y energiacuteaen implementarla otra vezUna funcioacuten es un trozo de coacutedigo que realiza una tarea muy concreta y que se puedeincluir en cualquier programa cuando hace falta resolver esa tarea Opcionalmentelas funciones aceptan una entrada (paraacutemetros de entrada) y devuelven una salidaObserva el siguiente ejemplo Se trata de un programa que pide un nuacutemero por tecladoy luego dice si el nuacutemero introducido es o no es primo

Dice si un nuacutemero es o no es primo (sin funciones) author Luis Joseacute Saacutenchez

public class NumeroPrimo

public static void main(String[] args)

Systemoutprint(Introduce un nuacutemero entero positivo )

int n = IntegerparseInt(Systemconsole()readLine())

boolean esPrimo = truefor (int i = 2 i lt n i++)

if ((n i) == 0)

esPrimo = false

if (esPrimo)

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

80

Funciones 81

Podemos intuir que la tarea de averiguar si un nuacutemero es o no primo seraacute algo queutilizaremos con frecuencia maacutes adelante asiacute que podemos aislar el trozo de coacutedigoque realiza ese cometido para usarlo con comodidad en otros programas

Dice si un nuacutemero es o no es primo usando una funcioacuten author Luis Joseacute Saacutenchez

public class NumeroPrimoConFuncion

Programa principal

public static void main(String[] args)

Systemoutprint(Introduzca un nuacutemero entero positivo )

int n = IntegerparseInt(Systemconsole()readLine())

if (esPrimo(n))

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

Funciones

Comprueba si un nuacutemero entero positivo es primo o no Un nuacutemero es primo cuando uacutenicamente es divisible entre eacutel mismo y la unidad param x un nuacutemero entero positivo return ltcodegttrueltcodegt si el nuacutemero es primo return ltcodegtfalseltcodegt en caso contrario

public static boolean esPrimo(int x)

for (int i = 2 i lt x i++)

if ((x i) == 0)

return false

Funciones 82

return true

Cada funcioacuten tiene una cabecera y un cuerpo En el ejemplo anterior la cabecera es

public static boolean esPrimo(int x)

De momento no vamos a explicar queacute significa public static lo dejaremos para cuandoveamos el capiacutetulo 9 ldquoProgramacioacuten orientada a objetosrdquo por ahora lo escribiremos talcual cada vez que definamos una funcioacuten A continuacioacuten se escribe el tipo de dato quedevuelve la funcioacuten en este caso es boolean porque la funcioacuten devolveraacute siempre true

(verdadero) o false falso Lo uacuteltimo que lleva la cabecera son los paraacutemetros encerradosentre pareacutentesis Esos paraacutemetros son los valores que se le pasan a la funcioacuten paraque realice los caacutelculos En este caso concreto el paraacutemetro que se pasa es x o seael nuacutemero que queremos saber si es primo o no Es necesario indicar siempre el tipode cada paraacutemetro en esta ocasioacuten el paraacutemetro que se pasa es de tipo entero (int)

82 Comentarios de funciones

Los comentarios tienen un papel muy importante en los programas ya que aunque nose compilan ni se ejecutan permiten describir aclarar o dar informacioacuten relevantesobre queacute hace exactamente el coacutedigo Un programa bien comentado es muchomaacutes faacutecil de corregir mantener y mejorar que un programa mal comentado o quesimplemente no tiene comentariosExiste una herramienta llamada javadoc que crea unos documentos en HTML coninformacioacuten sobre programas escritos en Java Para ello javadoc utiliza los comentariosque se han hecho y ademaacutes la meta-informacioacuten que se incluye en esos comentariosEsta meta-informacioacuten es muy faacutecil de distinguir pues va precedida siempre de uncaraacutecter Te habraacutes dado cuenta que en los comentarios de los programas que hemos visto eneste manual se indica el nombre del autor mediante authorSi los comentarios de los programas en general son importantes debemos prestarespecial atencioacuten a los comentarios de las funciones ya que posiblemente seraacutenusadas por otros programadores que querraacuten saber exactamente coacutemo se utilizanCon la etiqueta param seguida de un nombre de paraacutemetro se indica queacute paraacutemetroespera como entrada la funcioacuten Si una funcioacuten acepta varios paraacutemetros se especifi-caraacuten varias etiquetas param en los comentariosMediante la etiqueta return especificamos queacute devuelve exactamente la funcioacutenAunque el tipo de dato que se devuelve ya viene indicado en la cabecera de la funcioacutenmediante la etiqueta return podemos explicarlo con maacutes detalle

Funciones 83

En los comentarios se pueden incluir elementos de HTML como ltcodegt ampnbsp etc yaque los entiende perfectamente javadocPuedes hacer una prueba generando la documentacioacuten del ejemplo ejecutando lasiguiente liacutenea en una ventana de terminal Como tenemos tildes en los comentariossi queremos que salgan bien en las paacuteginas de documentacioacuten debemos indicar lacodificacioacuten de caracteres

javadoc -encoding UTF-8 -charset UTF-8 -docencoding UTF-8 NumeroPrimoConFuncionjava

Para aprender maacutes sobre javadoc puedes consultar la documentacioacuten oficial de Oracle1

83 Creacioacuten de bibliotecas de rutinas mediante paquetes

Si la funcioacuten esPrimo() va a ser usada en tres programas diferentes se puede copiary pegar su coacutedigo en cada uno de los programas pero hay una solucioacuten mucho maacuteselegante y praacutecticaLas funciones de un determinado tipo (por ejemplo funciones matemaacuteticas) se puedenagrupar para crear un paquete (package) que luego se importaraacute desde el programa quenecesite esas funcionesCada paquete se corresponde con un directorio Por tanto si hay un paquete connombre matematicas debe haber un directorio llamado tambieacuten matematicas en la mismaubicacioacuten del programa que importa ese paquete (normalmente el programa princi-pal)Las funciones se pueden agrupar dentro de un paquete de dos maneras diferentesPuede haber subpaquetes dentro de un paquete por ejemplo si quisieacuteramos dividirlas funciones matemaacuteticas en funciones relativas al caacutelculo de aacutereas y voluacutemenesde figuras geomeacutetricas y funciones relacionadas con caacutelculos estadiacutesticos podriacuteamoscrear dos directorios dentro de matematicas con nombres geometria y estadistica respecti-vamente Estos subpaquetes se llamariacutean matematicasgeometria y matematicasestadisticaOtra manera de agrupar las funciones dentro de un mismo paquete consiste en crearvarios ficheros dentro de un mismo directorio En este caso se podriacutean crear los ficherosGeometriajava y EstadisticajavaEntenderemos mejor todos estos conceptos con un ejemplo completo Vamos a crearun paquete con nombre matematicas que contenga dos clases Varias (para funcionesmatemaacuteticas de propoacutesito general) y Geometria Por tanto en el disco duro tendremosuna carpeta con nombre matematicas que contiene los ficheros Variasjava y GeometriajavaEl contenido de estos ficheros se muestra a continuacioacuten

1httpwwworaclecomtechnetworkjavajavasedocumentationindex-137868html

Funciones 84

Funciones matemaacuteticas de propoacutesito general author Luis Joseacute Saacutenchez

package matematicas

public class Varias

Comprueba si un nuacutemero entero positivo es primo o no Un nuacutemero es primo cuando uacutenicamente es divisible entre eacutel mismo y la unidad param x un nuacutemero entero positivo return ltcodegttrueltcodegt si el nuacutemero es primo return ltcodegtfalseltcodegt en caso contrario

public static boolean esPrimo(int x)

for (int i = 2 i lt x i++)

if ((x i) == 0)

return false

return true

Devuelve el nuacutemero de diacutegitos que contiene un nuacutemero entero param x un nuacutemero entero return la cantidad de diacutegitos que contiene el nuacutemero

public static int digitos(int x)

if (x == 0)

return 1

else

int n = 0

while (x gt 0)

x = x 10

n++

Funciones 85

return n

Se incluye a continuacioacuten Geometriacuteajava Recuerda que tanto Variasjava como Geome-

triacuteajava se encuentran dentro del directorio matematicas

Funciones geomeacutetricas author Luis Joseacute Saacutenchez

package matematicas

public class Geometria

Calcula el volumen de un cilindro Tanto el radio como la altura se deben proporcionar en las mismas unidades para que el resultado sea congruente param r radio del cilindro param h altura del cilindro return volumen del cilindro

public static double volumenCilindro(double r double h)

return MathPI r r h

Calcula la longitud de una circunferencia a partir del radio param r radio de la circunferencia return longitud de la circunferencia

public static double longitudCircunferencia(double r)

return 2 MathPI r

Observa que en ambos ficheros se especifica que las clases declaradas (y por tantolas funciones que se definen dentro) pertenecen al paquete matematicas mediante la

Funciones 86

liacutenea package matematicas Ahora ya podemos probar las funciones desde un programaexterno El programa PruebaFuncionesjava estaacute fuera de la carpeta matematicas justo enun nivel superior en la estructura de directorios

Dice si un nuacutemero es o no es primo usando una funcioacuten author Luis Joseacute Saacutenchez

import matematicasVariasimport matematicasGeometria

public class PruebaFunciones

public static void main(String[] args)

int n

Prueba esPrimo()

Systemoutprint(Introduzca un nuacutemero entero positivo )

n = IntegerparseInt(Systemconsole()readLine())

if (matematicasVariasesPrimo(n))

Systemoutprintln(El + n + es primo)

else

Systemoutprintln(El + n + no es primo)

Prueba digitos()

Systemoutprint(Introduzca un nuacutemero entero positivo )

n = IntegerparseInt(Systemconsole()readLine())

Systemoutprintln(n + tiene + matematicasVariasdigitos(n) + diacutegitos)

Prueba volumenCilindro()

double r h

Systemoutprintln(Caacutelculo del volumen de un cilindro)

Systemoutprint(Introduzca el radio en metros )

r = DoubleparseDouble(Systemconsole()readLine())

Systemoutprint(Introduzca la altura en metros )

Funciones 87

h = DoubleparseDouble(Systemconsole()readLine())

Systemoutprintln(El volumen del cilindro es + matematicasGeometriavolumenCilind

ro(r h) + m3)

Las liacuteneas

import matematicasVariasimport matematicasGeometria

cargan las clases contenidas en el paquete matematicas y por tanto todas las funcionescontenidas en ellas No vamos a utilizar el comodiacuten de la forma import matematicas yaque estaacute desaconsejado su uso en el estaacutendar de codificacioacuten en Java de GoogleEl uso de una funcioacuten es muy sencillo hay que indicar el nombre del paquete el nom-bre de la clase y finalmente el nombre de la funcioacuten con los paraacutemetros adecuados Porejemplo como vemos en el programa anterior matematicasVariasdigitos(n) devuelve elnuacutemero de diacutegitos de n siendo matematicas el paquete Varias la clase digitos la funcioacuteny n el paraacutemetro que se le pasa a la funcioacuten

84 Aacutembito de las variables

El aacutembito de una variable es el espacio donde ldquoexisterdquo esa variable o dicho de otromodo el contexto dentro del cual la variable es vaacutelidaSeguramente has utilizado muchas veces variables con nombres como x i max o aux Elaacutembito de cada una de esas variables era el programa en el que estaban declaradasFiacutejate que la x del primer programa que aparece en este libro no interfiere para nadacon la x del siguiente programa que usa una variable con ese mismo nombre Aunquese llamen igual son variables diferentesCuando se implementan funciones hay que tener muy claro que las variables utilizadascomo paraacutemetros (por valor) o las variables que se definen dentro de la funcioacuten sonlocales a esa funcioacuten es decir su aacutembito es la funcioacuten y fuera de ella esas variablesno existen Presta atencioacuten al programa Variosjava y observa que las dos funcionesque hay definidas dentro de la clase utilizan sendas variables con nombre x Puesbien cada una de esas variables son completamente independientes se trata de dosvariables distintas que tienen el mismo nombre pero que son vaacutelidas cada una en supropio aacutembito

85 Paso de paraacutemetros por valor y por referencia

En Java como en la mayoriacutea de lenguajes de programacioacuten existen dos maneras depasar paraacutemetros por valor y por referencia

Funciones 88

Cuando se pasa un paraacutemetro por valor en realidad se pasa una copia de la variableuacutenicamente importa el valor Cualquier modificacioacuten que se le haga a la variable que sepasa como paraacutemetro dentro de la funcioacuten no tendraacute ninguacuten efecto fuera de la mismaVeamos un ejemplo

Paso de paraacutemetros por valor author Luis Joseacute Saacutenchez

public class PruebaParametros1

public static void main(String[] args)

int n = 10

Systemoutprintln(n)

calcula(n)

Systemoutprintln(n)

public static void calcula(int x)

x += 24

Systemoutprintln(x)

La salida del programa anterior es la siguiente

10

34

10

A pesar de que la variable que se pasa como paraacutemetro se modifica dentro de lafuncioacuten los cambios no tienen ninguacuten efecto en el programa principalCuando se pasa un paraacutemetro por referencia por el contrario si se modifica su valordentro de la funcioacuten los cambios se mantienen una vez que la funcioacuten ha terminadode ejecutarseEn la mayoriacutea de los lenguajes de programacioacuten es el programador quien decidecuaacutendo un paraacutemetro se pasa por valor y cuaacutendo se pasa por referencia En Java nopodemos elegir Todos los paraacutemetros que son de tipo int double float char o String

se pasan siempre por valor mientras que los arrays se pasan siempre por referenciaEsto quiere decir que cualquier cambio que efectuemos en un array que se pasa comoparaacutemetro permanece cuando termina la ejecucioacuten de la funcioacuten por lo que hay quetener especial cuidado en estos casos

Funciones 89

Paso de un array como paraacutemetro author Luis Joseacute Saacutenchez

public class PruebaParametrosArray

public static void main(String[] args)

int n[] = 8 33 200 150 11

int m[] = new int[5]

muestraArray(n)

incrementa(n)

muestraArray(n)

public static void muestraArray(int x[])

for (int i = 0 i lt xlength i++)

Systemoutprint(x[i] + )

Systemoutprintln()

public static void incrementa(int x[])

for (int i = 0 i lt xlength i++)

x[i]++

La salida del programa anterior es la siguiente

8 33 200 150 11

9 34 201 151 12

Comprobamos por tanto que el array que se ha pasado como paraacutemetro se hamodificado en la funcioacuten y se han conservado los cambios en el programa principalPor uacuteltimo se muestra un programa que contiene funciones que operan con arrays dedos dimensiones

Funciones 90

Paso de un array bidimensional como paraacutemetro author Luis Joseacute Saacutenchez

import matematicasVarias

public class ArrayBiFunciones

public static void main(String[] args)

int[][] n = new int[6][9]

for(int i = 0 i lt 6 i++)

for(int j = 0 j lt 9 j++)

n[i][j] = (int)(Mathrandom()100000)

muestraArrayIntBi(n)

Funciones

Devuelve el nuacutemero de filas de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return nuacutemero de filas del array

public static int filasArrayIntBi(int x[][])

return xlength

Devuelve el nuacutemero de columnas de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return nuacutemero de columnas del array

public static int columnasArrayIntBi(int x[][])

Funciones 91

return x[0]length

Devuelve el maacuteximo de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros return el valor maacuteximo encontrado en el array

public static int maximoArrayIntBi(int x[][])

int maximo = IntegerMIN_VALUE

for (int f = 0 f lt filasArrayIntBi(x) f++)

for (int c = 0 c lt columnasArrayIntBi(x) c++)

if (x[f][c] gt maximo)

maximo = x[f][c]

return maximo

Muestra por pantalla el contenido de un array bidimensional de nuacutemeros enteros param x un array bidimensional de nuacutemeros enteros

public static void muestraArrayIntBi(int x[][])

String formatoNumero = + matematicasVariasdigitos(maximoArrayIntBi(x)) + d

for (int f = 0 f lt filasArrayIntBi(x) f++)

for (int c = 0 c lt columnasArrayIntBi(x) c++)

Systemoutprintf(formatoNumero + x[f][c])

Systemoutprintln()

Funciones 92

86 Ejercicios

Ejercicios 1-14Crea una biblioteca de funciones matemaacuteticas que contenga las siguientesfunciones Recuerda que puedes usar unas dentro de otras si es necesario

1 esCapicua Devuelve verdadero si el nuacutemero que se pasa como paraacute-metro es capicuacutea y falso en caso contrario

2 esPrimo Devuelve verdadero si el nuacutemero que se pasa como paraacutemetroes primo y falso en caso contrario

3 siguientePrimo Devuelve el menor primo que es mayor al nuacutemero quese pasa como paraacutemetro

4 potencia Dada una base y un exponente devuelve la potencia5 digitos Cuenta el nuacutemero de diacutegitos de un nuacutemero entero6 voltea Le da la vuelta a un nuacutemero7 digitoN Devuelve el diacutegito que estaacute en la posicioacuten n de un nuacutemero

entero Se empieza contando por el 0 y de izquierda a derecha8 posicionDeDigito Da la posicioacuten de la primera ocurrencia de un diacutegito

dentro de un nuacutemero entero Si no se encuentra devuelve -19 quitaPorDetras Le quita a un nuacutemero n diacutegitos por detraacutes (por la

derecha)10 quitaPorDelante Le quita a un nuacutemero n diacutegitos por delante (por la

izquierda)11 pegaPorDetras Antildeade un diacutegito a un nuacutemero por detraacutes12 pegaPorDelante Antildeade un diacutegito a un nuacutemero por delante13 trozoDeNumero Toma como paraacutemetros las posiciones inicial y final

dentro de un nuacutemero y devuelve el trozo correspondiente14 juntaNumeros Pega dos nuacutemeros para formar uno

Ejercicio 15Muestra los nuacutemeros primos que hay entre 1 y 1000

Ejercicio 16Muestra los nuacutemeros capicuacutea que hay entre 1 y 99999

Ejercicio 17Escribe un programa que pase de binario a decimal

Ejercicio 18Escribe un programa que pase de decimal a binario

Funciones 93

Ejercicio 19Une y ampliacutea los dos programas anteriores de tal forma que se permitaconvertir un nuacutemero entre cualquiera de las siguientes bases decimal binariohexadecimal y octal

Ejercicios 20-28Crea una biblioteca de funciones para arrays (de una dimensioacuten) de nuacutemerosenteros que contenga las siguientes funciones

1 generaArrayInt Genera un array de tamantildeo n con nuacutemeros aleatorioscuyo intervalo (miacutenimo y maacuteximo) se indica como paraacutemetro

2 minimoArrayInt Devuelve el miacutenimo del array que se pasa comoparaacutemetro

3 maximoArrayInt Devuelve el maacuteximo del array que se pasa comoparaacutemetro

4 mediaArrayInt Devuelve la media del array que se pasa como paraacute-metro

5 estaEnArrayInt Dice si un nuacutemero estaacute o no dentro de un array6 posicionEnArray Busca un nuacutemero en un array y devuelve la posicioacuten

(el iacutendice) en la que se encuentra7 volteaArrayInt Le da la vuelta a un array8 rotaDerechaArrayInt Rota n posiciones a la derecha los nuacutemeros de

un array9 rotaIzquierdaArrayInt Rota n posiciones a la izquierda los nuacutemeros de

un array

Funciones 94

Ejercicio 29-34Crea una biblioteca de funciones para arrays bidimensionales (de dos dimen-siones) de nuacutemeros enteros que contenga las siguientes funciones

1 generaArrayBiInt Genera un array de tamantildeo n x m con nuacutemerosaleatorios cuyo intervalo (miacutenimo y maacuteximo) se indica como paraacutemetro

2 filaDeArrayBiInt Devuelve la fila i-eacutesima del array que se pasa comoparaacutemetro

3 columnaDeArrayBiInt Devuelve la columna j-eacutesima del array que sepasa como paraacutemetro

4 coordenadasEnArrayBiInt Devuelve la fila y la columna (en un arraycon dos elementos) de la primera ocurrencia de un nuacutemero dentro de unarray bidimensional Si el nuacutemero no se encuentra en el array la funcioacutendevuelve el array -1 -1

5 esPuntoDeSilla Dice si un nuacutemero es o no punto de silla es decirmiacutenimo en su fila y maacuteximo en su columna

6 diagonal Devuelve un array que contiene una de las diagonales delarray bidimensional que se pasa como paraacutemetro Se pasan comoparaacutemetros fila columna y direccioacuten La fila y la columna determinanel nuacutemero que marcaraacute las dos posibles diagonales dentro del array Ladireccioacuten es una cadena de caracteres que puede ser ldquonoserdquo o ldquonesordquo Lacadena ldquonoserdquo indica que se elige la diagonal que va del noroeste haciael sureste mientras que la cadena ldquonesordquo indica que se elige la diagonalque va del noreste hacia el suroeste

9 Programacioacuten orientada a objetos

91 Clases y objetos

La programacioacuten orientada a objetos es un paradigma de programacioacuten que se basacomo su nombre indica en la utilizacioacuten de objetos Estos objetos tambieacuten se suelenllamar instanciasUn objeto en teacuterminos de POO no se diferencia mucho de lo que conocemos comoun objeto en la vida real Pensemos por ejemplo en un coche Nuestro coche seriacuteaun objeto concreto de la vida real igual que el coche del vecino o el coche de uncompantildeero de trabajo o un deportivo que vimos por la calle el fin de semana pasadohellipTodos esos coches son objetos concretos que podemos ver y tocarTanto mi coche como el coche del vecino tienen algo en comuacuten ambos son cochesEn este caso mi coche y el coche del vecino seriacutean instancias (objetos) y coche (asecas) seriacutea una clase La palabra coche define algo geneacuterico es una abstraccioacutenno es un coche concreto sino que hace referencia a unos elementos que tienen unaserie de propiedades como matriacutecula marca modelo color etc este conjunto depropiedades se denominan atributos o variables de instancia

ClaseConcepto abstracto que denota una serie de cualidades por ejemplo cocheInstanciaObjeto palpable que se deriva de la concrecioacuten de una clase por ejemplo micocheAtributosConjunto de caracteriacutesticas que comparten los objetos de una clase porejemplo para la clase coche tendriacuteamos matriacutecula marca modelo color ynuacutemero de plazas

En Java los nombres de las clases se escriben con la primera letra en mayuacutesculamientras que los nombres de las instancias comienzan con una letra en minuacutesculaPor ejemplo la clase coche se escribe en Java como Coche y el objeto ldquomi cocherdquo sepodriacutea escribir como miCocheDefiniremos cada clase en un fichero con el mismo nombre maacutes la extensioacuten java portanto la definicioacuten de la clase Coche debe estar contenida en un fichero con nombreCochejava

Vamos a definir a continuacioacuten la clase Libro con los atributos isbn autor titulo ynumeroPaginas

95

Programacioacuten orientada a objetos 96

Librojava Definicioacuten de la clase Libro author Luis Joseacute Saacutenchez

public class Libro

atributosString isbn

String titulo

String autor

int numeroPaginas

A continuacioacuten creamos varios objetos de esta clase

PruebaLibrojava Programa que prueba la clase Libro author Luis Joseacute Saacutenchez

public class PruebaLibro

public static void main(String[] args)

Libro lib = new Libro()

Libro miLibrito = new Libro()

Libro quijote = new Libro()

Hemos creado tres instancias de la clase libro lib miLibrito y quijote Ya sabemos definiruna clase indicando sus atributos y crear instancias

Las variables de instancia (atributos) determinan las cualidades de losobjetos

92 Encapsulamiento y ocultacioacuten

Uno de los pilares en los que se basa la Programacioacuten Orientada a Objetos es elencapsulamiento Baacutesicamente el encapsulamiento consiste en definir todas las

Programacioacuten orientada a objetos 97

propiedades y el comportamiento de una clase dentro de esa clase es decir en laclase Coche estaraacute definido todo lo concerniente a la clase Coche y en la clase Libro

estaraacute definido todo lo que tenga que ver con la clase LibroEl encapsulamiento parece algo obvio casi de perogrullo pero hay que tenerlosiempre muy presente al programar utilizando clases y objetos En alguna ocasioacutenpuede que estemos tentados a mezclar parte de una clase con otra clase distintapara resolver un problema puntual No hay que caer en esa trampa Se deben escribirlos programas de forma que cada cosa esteacute en su sitio Sobre todo al principiocuando definimos nuestras primeras clases debemos estar pendientes de que todoestaacute definido donde correspondeLa ocultacioacuten es una teacutecnica que incorporan algunos lenguajes (entre ellos Java) quepermite esconder los elementos que definen una clase de tal forma que desde otraclase distinta no se pueden ldquover las tripasrdquo de la primera La ocultacioacuten facilita comoveremos maacutes adelante el encapsulamiento

93 Meacutetodos

Un coche arranca para se aparca hace sonar el claxon se puede llevar a repararhellipUn gato puede comer dormir maullar ronronearhellipLas acciones asociadas a una clase se llaman meacutetodos Estos meacutetodos se definendentro del cuerpo de la clase y se suelen colocar a continuacioacuten de los atributos

Los meacutetodos determinan el comportamiento de los objetos

931 Creiacute haber visto un lindo gatito

Vamos a crear la clase GatoSimple La llamamos asiacute porque maacutes adelante crearemos otraclase algo maacutes elaborada que se llamaraacute Gato Para saber queacute atributos debe tener estaclase hay que preguntarse queacute caracteriacutesticas tienen los gatos Todos los gatos son deun color determinado pertenecen a una raza tienen una edad tienen un determinadosexo - son machos o hembras - y tienen un peso que se puede expresar en kilogramosEacutestos seraacuten por tanto los atributos que tendraacute la clase GatoSimplePara saber queacute metodos debemos implementar hay que preguntarse queacute accionesestaacuten asociadas a los gatos Bien pues los gatos maullan ronronean comen y si sonmachos se pelean entre ellos para disputarse el favor de las hembras Esos seraacuten losmeacutetodos que definamos en la clase

Programacioacuten orientada a objetos 98

GatoSimplejava Definicioacuten de la clase GatoSimple author Luis Joseacute Saacutenchez

public class GatoSimple

atributos

String color raza sexo

int edad

double peso

meacutetodos

constructorGatoSimple (String s)

thissexo = s

getterString getSexo()

return thissexo

Hace que el gato maulle

void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute

Programacioacuten orientada a objetos 99

param comida la comida que se le ofrece al gato

void come(String comida)

if (comidaequals(pescado))

Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Pone a pelear dos gatos Solo se van a pelear dos machos entre siacute param contrincante es el gato contra el que pelear

void peleaCon(GatoSimple contrincante)

if (thissexoequals(hembra))

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo()equals(hembra))

Systemoutprintln(no peleo contra gatitas)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

ConstructorEl meacutetodo constructor tiene siempre el mismo nombre que la clase y se utilizanormalmente para inicializar los atributos

Los atributos de la clase GatoSimple - color raza sexo edad y peso - se declaran igual quelas variables que hemos venido usando hasta ahora pero hay una gran diferenciaentre estos atributos y las variables que aparecen en el main (programa principal) Unavariable definida en el cuerpo del programa principal es uacutenica sin embargo cada unode los objetos que se crean en el programa principal tienen sus propios atributos esdecir si en el programa principal se crean 20 objetos de la clase GatoSimple cada unotiene sus valores para los atributos color raza etcFiacutejate en la cabecera del meacutetodo peleaCon

Programacioacuten orientada a objetos 100

void peleaCon(GatoSimple contrincante)

Como puedes comprobar es posible pasar un objeto como paraacutemetro A continuacioacutense muestra un programa que prueba la clase GatoSimple Te recomiendo seguir elprograma liacutenea a liacutenea y observar atentamente la salida que produce

PruebaGatoSimplejava Programa que prueba la clase GatoSimple author Luis Joseacute Saacutenchez

public class PruebaGatoSimple

public static void main(String[] args)

GatoSimple garfield = new GatoSimple(macho)

Systemoutprintln(hola gatito)

garfieldmaulla()

Systemoutprintln(toma tarta)

garfieldcome(tarta selva negra)

Systemoutprintln(toma pescado a ver si esto te gusta)

garfieldcome(pescado)

GatoSimple tom = new GatoSimple(macho)

Systemoutprintln(Tom toma sopita de verduras)

tomcome(sopa de verduras)

GatoSimple lisa = new GatoSimple(hembra)

Systemoutprintln(gatitos a ver coacutemo maullaacuteis)

garfieldmaulla()

tommaulla()

lisamaulla()

garfieldpeleaCon(lisa)

lisapeleaCon(tom)

tompeleaCon(garfield)

Observa coacutemo al crear una instancia se llama al constructor que como deciacuteamos antestiene el mismo nombre de la clase y sirve para inicializar los atributos En este casose inicializa el atributo sexo Maacutes adelante veremos constructores que inicializan variosatributos e incluso definiremos distintos constructores en la misma clase

Programacioacuten orientada a objetos 101

GatoSimple garfield = new GatoSimple(macho)

Como puedes ver hay meacutetodos que no toman ninguacuten paraacutemetro

garfieldmaulla()

Y hay otros meacutetodos que deben tomar paraacutemetros obligatoriamente

garfieldcome(tarta selva negra)

932 Meacutetodos getter y setter

Vamos a crear la clase Cubo Para saber queacute atributos se deben definir nos preguntamosqueacute caracteriacutesticas tienen los cubos - igual que hicimos con la clase GatoSimple Todos loscubos tienen una determinada capacidad un color estaacuten hechos de un determinadomaterial - plaacutestico latoacuten etc - y puede que tengan asa o puede que no Un cubo sefabrica con el propoacutesito de contener liacutequido por tanto otra caracteriacutestica es la cantidadde litros de liacutequido que contiene en un momento determinado Por ahora solo nosinteresa saber la capacidad maacutexima y los litros que contiene el cubo en cada momentoasiacute que esos seraacuten los atributos que tendremos en cuenta

Cubojava Definicioacuten de la clase Cubo author Luis Joseacute Saacutenchez

public class Cubo

atributos

int capacidad capacidad maacutexima en litrosint contenido contenido actual en litros

meacutetodos

constructorCubo (int c)

thiscapacidad = c

meacutetodos getterint getCapacidad()

return thiscapacidad

Programacioacuten orientada a objetos 102

int getContenido()

return thiscontenido

meacutetodo settervoid setContenido(int litros)

thiscontenido = litros

otros meacutetodosvoid vacia()

thiscontenido = 0

Llena el cubo al maacuteximo de su capacidad

void llena()

thiscontenido = thiscapacidad

Pinta el cubo en la pantalla Se muestran los bordes del cubo con el caraacutecter y el agua que contiene con el caraacutecter ~

void pinta()

for (int nivel = thiscapacidad nivel gt 0 nivel--)

if (thiscontenido gt= nivel)

Systemoutprintln(~~~~)

else

Systemoutprintln( )

Systemoutprintln()

Vuelca el contenido de un cubo sobre otro Antes de echar el agua se comprueba cuaacutento le cabe al cubo destino

void vuelcaEn(Cubo destino)

Programacioacuten orientada a objetos 103

int libres = destinogetCapacidad() - destinogetContenido()

if (libres gt 0)

if (thiscontenido lt= libres)

destinosetContenido(destinogetContenido() + thiscontenido)thisvacia()

else

thiscontenido -= libres

destinollena()

Observa estos meacutetodos extraiacutedos de la clase Cubo

int getCapacidad()

return thiscapacidad

int getContenido()

return thiscontenido

Se trata de meacutetodos muy simples su cometido es devolver el valor de un atributoPodriacutean tener cualquier nombre pero en Java es costumbre llamarlos con la palabraget (obtener) seguida del nombre del atributoFijeacutemonos ahora este otro meacutetodo

void setContenido(int litros)

thiscontenido = litros

Ahora estamos ante un setter Este tipo de meacutetodos tiene el cometido de establecerun valor para un determinado atributo Como puedes ver setContenido estaacute formadapor set (asignar) maacutes el nombre del atributoPodriacuteas preguntarte iquestpor queacute se crea un meacutetodo getter para extraer el valor de unavariable y no se accede a la variable directamenteParece maacutes loacutegico hacer esto

Systemoutprint(miCubocapacidad)

que esto otro

Programacioacuten orientada a objetos 104

Systemoutprint(miCubogetCapacidad())

Sin embargo en Java se opta casi siempre por esta uacuteltima opcioacuten Tiene su explicacioacuteny lo entenderaacutes bien cuando estudies el apartado Aacutembitovisibilidad de los elementosde una clase - public protected y privateProbamos con el siguiente ejemplo la clase Cubo que acabamos de definir Crea tuspropios cubos pasa agua de unos a otros y observa lo que se muestra por pantalla

PruebaCubojava Programa que prueba la clase Cubo author Luis Joseacute Saacutenchez

public class PruebaCubo

public static void main(String[] args)

Cubo cubito = new Cubo(2)

Cubo cubote = new Cubo(7)

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

Systemoutprintln(nLleno el cubito n)

cubitollena()

cubitopinta()

Systemoutprintln(nEl cubote sigue vaciacuteo n)

cubotepinta()

Systemoutprintln(nAhora vuelco lo que tiene el cubito en el cuboten)

cubitovuelcaEn(cubote)

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

Systemoutprintln(nAhora vuelco lo que tiene el cubote en el cubiton)

cubotevuelcaEn(cubito)

Programacioacuten orientada a objetos 105

Systemoutprintln(Cubito n)

cubitopinta()

Systemoutprintln(nCubote n)

cubotepinta()

933 Meacutetodo toString

La definicioacuten de la clase Cubo del apartado anterior contiene el meacutetodo pinta que comosu nombre indica permite pintar en pantalla un objeto de esa clase Se podriacutea definirel meacutetodo ficha para mostrar informacioacuten sobre objetos de la clase Alumno por ejemploTambieacuten seriacutea posible implementar el meacutetodo imprime dentro de la clase Libro con elpropoacutesito de mostrar por pantalla los datos de un libro Todos estos meacutetodos - pintaficha e imprime - hacen baacutesicamente lo mismoEn Java existe una solucioacuten muy elegante para mostrar informacioacuten sobre un objetopor pantalla Si se quiere mostrar el contenido de la variable entera x se utilizaSystemoutprint(x) y si se quiere mostrar el valor de la variable de tipo cadena decaracteres nombre se escribe Systemoutprint(nombre) De la misma manera si se quieremostrar el objeto miPiramide que pertenece a la clase Piramide tambieacuten se podriacutea usarSystemoutprint(miPiramide) Java sabe perfectamente coacutemo mostrar nuacutemeros y cadenasde caracteres pero no sabe a priori coacutemo se pintan piraacutemides Para indicar a Java coacutemodebe pintar un objeto de la clase Piramide basta con implementar el meacutetodo toString

dentro de la claseVeamos un ejemplo muy sencillo de implementacioacuten de toString Definiremos la claseCuadrado con el atributo lado el constructor y el meacutetodo toString

Cuadradojava Definicioacuten de la clase Cuadrado author Luis Joseacute Saacutenchez

public class Cuadrado

int lado

public Cuadrado(int l)

thislado = l

public String toString()

Programacioacuten orientada a objetos 106

int i espacios

String resultado =

for (i = 0 i lt thislado i++)

resultado +=

resultado += n

for (i = 1 i lt thislado - 1 i++)

resultado +=

for (espacios = 1 espacios lt thislado - 1 espacios++)

resultado +=

resultado += n

for (i = 0 i lt thislado i++)

resultado +=

resultado += n

return resultado

Observa que el meacutetodo toString() devuelve una cadena de caracteres Esa cadena esprecisamente la que mostraraacute por pantalla Systemoutprint() En el programa que semuestra a continuacioacuten y que prueba la clase Cuadrado puedes comprobar que se pintaun cuadrado igual que si se tratara de cualquier otra variable

PruebaCuadradojava Programa que prueba la clase Cuadrado author Luis Joseacute Saacutenchez

public class PruebaCuadrado

public static void main(String[] args)

Cuadrado miCuadradito = new Cuadrado(5)

Systemoutprintln(miCuadradito)

Programacioacuten orientada a objetos 107

94 Aacutembitovisibilidad de los elementos de una clase - publicprotected y private

Al definir los elementos de una clase se pueden especificar sus aacutembitos (scope) devisibilidad o accesibilidad Un elemento public (puacuteblico) es visible desde cualquierclase un elemento protected (protegido) es visible desde la clase actual y desde todassus subclases y finalmente un elemento private (privado) uacutenicamente es visible dentrode la clase actualEn el siguiente apartado veremos queacute son las subclases De momento fiacutejate en elaacutembito del atributo y de los meacutetodos en la definicioacuten de la clase Animal

Animaljava Definicioacuten de la clase Animal author Luis Joseacute Saacutenchez

public abstract class Animal

private Sexo sexo

public Animal ()

sexo = SexoMACHO

public Animal (Sexo s)

sexo = s

public Sexo getSexo()

return sexo

public String toString()

return Sexo + thissexo + n

Hace que el animal se eche a dormir

public void duerme()

Systemoutprintln(Zzzzzzz)

Programacioacuten orientada a objetos 108

Fiacutejate que el atributo sexo se ha definido como private

private Sexo sexo

Eso quiere decir que a ese atributo uacutenicamente se tiene acceso dentro de la claseAnimal Sin embargo todos los meacutetodos se han definido public lo que significa quese podraacuten utilizar desde cualquier otro programa por ejemplo como veremos maacutesadelante desde el programa PurebaAnimaljava

Salvo casos puntuales se seguiraacute la regla de declarar private las variables deinstancia y public los meacutetodos

El sexo de un animal solo puede ser macho hembra o hermafrodita Una forma dedelimitar los valores que puede tomar un atributo es definir un tipo enumerado

Tipo enumeradoMediante enum se puede definir un tipo enumerado de esta forma un atributosolo podraacute tener uno de los posibles valores que se dan como opcioacuten Losvalores que se especifican en el tipo enumerado se suelen escribir con todaslas letras en mayuacutescula

Sexojava Definicioacuten del tipo enumerado Sexo author Luis Joseacute Saacutenchez

public enum Sexo

MACHO HEMBRA HERMAFRODITA

95 Herencia

La herencia es una de las caracteriacutesticas maacutes importantes de la POO Si definimosuna serie de atributos y meacutetodos para una clase al crear una subclase todos estosatributos y meacutetodos siguen siendo vaacutelidosEn el apartado anterior se define la clase Animal Uno de los meacutetodos de esta clase esduerme A continuacioacuten podemos crear las clases Gato y Perro como subclases de AnimalDe forma automaacutetica se puede utilizar el meacutetodo duerme con las instancias de las clasesGato y Perro iquestno es fantaacutestico

Programacioacuten orientada a objetos 109

La clase Ave es subclase de Animal y la clase Pinguino a su vez seriacutea subclase de Ave ypor tanto hereda todos sus atributos y meacutetodos

Clase abstracta (abstract)Una clase abstracta es aquella que no va a tener instancias de forma directaaunque siacute habraacute instancias de las subclases (siempre que esas subclasesno sean tambieacuten abstractas) Por ejemplo si se define la clase Animal comoabstracta no se podraacuten crear objetos de la clase Animal es decir no se podraacutehacer Animal mascota = new Animal() pero siacute se podraacuten crear instancias de la claseGato Ave o Pinguino que son subclases de Animal

Para crear en Java una subclase de otra clase existente se utiliza la palabra reservadaextends A continuacioacuten se muestra el coacutedigo de las clases Gato Ave y Pinguino asiacutecomo el programa que prueba estas clases creando instancias y aplicaacutendoles meacutetodosRecuerda que la definicioacuten de la clase Animal se muestra en el apartado anterior

Gatojava Definicioacuten de la clase Gato author Luis Joseacute Saacutenchez

public class Gato extends Animal

private String raza

public Gato (Sexo s String r)

super(s)raza = r

public Gato (Sexo s)

super(s)raza = siameacutes

public Gato (String r)

super(SexoHEMBRA)raza = r

public Gato ()

super(SexoHEMBRA)

Programacioacuten orientada a objetos 110

raza = siameacutes

public String toString()

return supertoString()+ Raza + thisraza+ nn

Hace que el gato maulle

public void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

public void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al gato

public void come(String comida)

if (comidaequals(pescado))

Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Pone a pelear dos gatos Solo se van a pelear dos machos entre siacute param contrincante es el gato contra el que pelear

public void peleaCon(Gato contrincante)

Programacioacuten orientada a objetos 111

if (thisgetSexo() == SexoHEMBRA)

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo() == SexoHEMBRA)

Systemoutprintln(no peleo contra gatitas)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

Observa que se definen nada menos que cuatro constructores en la clase Gato Desdeel programa principal se dilucida cuaacutel de ellos se utiliza en funcioacuten del nuacutemero y tipode paraacutemetros que se pasa al meacutetodo Por ejemplo si desde el programa principal secrea un gato de esta forma

Gato gati = new Gato()

entonces se llamariacutea al constructor definido como

public Gato ()

super(SexoHEMBRA)raza = siameacutes

Por tanto gati seriacutea una gata de raza siameacutes Si por el contrario creamos gati de estaotra manera desde el programa principal

Gato gati = new Gato(SexoMACHO siberiano)

se llamariacutea al siguiente constructor

public Gato (Sexo s String r)

super(s)raza = r

y gati seriacutea en este caso un gato macho de raza siberianoEl meacutetodo super() hace una llamada al meacutetodo equivalente de la superclase Fiacutejate quese utiliza tanto en el constructor como en el meacutetodo toString() Por ejemplo al llamara super() dentro del meacutetodo toString() se estaacute llamando al toString() que hay definidoen la clase Animal justo un nivel por encima de Gato en la jerarquiacutea de clasesA continuacioacuten tenemos la definicioacuten de la clase Ave que es una subclase de Animal

Programacioacuten orientada a objetos 112

Avejava Definicioacuten de la clase Ave author Luis Joseacute Saacutenchez

public class Ave extends Animal

public Ave(Sexo s)

super(s)

public Ave()

super()

Hace que el ave se limpie

public void aseate()

Systemoutprintln(Me estoy limpiando las plumas)

Hace que el ave levante el vuelo

public void vuela()

Systemoutprintln(Estoy volando)

951 Sobrecarga de meacutetodos

Un meacutetodo se puede redefinir (volver a definir con el mismo nombre) en una subclasePor ejemplo el meacutetodo vuela que estaacute definido en la clase Ave se vuelve a definir enla clase Pinguino En estos casos indicaremos nuestra intencioacuten de sobreescribir unmeacutetodo mediante la etiqueta OverrideSi no escribimos esta etiqueta la sobreescritura del meacutetodo se realizaraacute de todasformas ya que Override indica simplemente una intencioacuten Ahora imagina que quieressobreescribir el meacutetodo come de Animal declarando un come especiacutefico para los gatos enla clase Gato Si escribes Override y luego te equivocas en el nombre del meacutetodo yescribes comer entonces el compilador diriacutea algo como ldquoiexclCuidado algo no estaacute bienme has dicho que ibas a sobreescribir un meacutetodo de la superclase y sin embargo comer

no estaacute definidordquoA continuacioacuten tienes la definicioacuten de la clase Pinguino

Programacioacuten orientada a objetos 113

Pinguinojava Definicioacuten de la clase Pinguino author Luis Joseacute Saacutenchez

public class Pinguino extends Ave

public Pinguino()

super()

public Pinguino(Sexo s)

super(s)

El pinguumlino se siente triste porque no puede volar

Override

public void vuela()

Systemoutprintln(No puedo volar)

Con el siguiente programa se prueba la clase Animal y todas las subclases que derivande ella Observa cada liacutenea y comprueba queacute hace el programa

PruebaAnimaljava Programa que prueba la clase Animal y sus subclases author Luis Joseacute Saacutenchez

public class PruebaAnimal

public static void main(String[] args)

Gato garfield = new Gato(SexoMACHO romano)

Gato tom = new Gato(SexoMACHO)

Gato lisa = new Gato(SexoHEMBRA)

Gato silvestre = new Gato()

Systemoutprintln(garfield)

Systemoutprintln(tom)

Systemoutprintln(lisa)

Programacioacuten orientada a objetos 114

Systemoutprintln(silvestre)

Ave miLoro = new Ave()

miLoroaseate()

miLorovuela()

Pinguino pingu = new Pinguino(SexoHEMBRA)

pinguaseate()

pinguvuela()

En el ejemplo anterior los objetos miLoro y pingu actuacutean de manera polimoacuterfica porquea ambos se les aplican los meacutetodos aseate y vuela

PolimorfismoEn Programacioacuten Orientada a Objetos se llama polimorfismo a la capacidadque tienen los objetos de distinto tipo (de distintas clases) de responder almismo meacutetodo

96 Atributos y meacutetodos de clase (static)

Hasta el momento hemos definido atributos de instancia como raza sexo o color ymeacutetodos de instancia como maulla come o vuela De tal modo que si en el programa secrean 20 gatos cada uno de ellos tiene su propia raza y puede haber potencialmente20 razas diferentes Tambieacuten podriacutea aplicar el meacutetodo maulla a todos y cada uno deesos 20 gatosNo obstante en determinadas ocasiones nos puede interesar tener atributos de clase(variables de clase) y meacutetodos de clase Cuando se define una variable de clase soloexiste una copia del atributo para toda la clase y no una para cada objeto Esto es uacutetilcuando se quiere llevar la cuenta global de alguacuten paraacutemetro Los meacutetodos de clase seaplican a la clase y no a instancias concretasA continuacioacuten se muestra un ejemplo que contiene la variable de clase kilometra-

jeTotal Si bien cada coche tiene un atributo kilometraje donde se van acumulando loskiloacutemetros que va recorriendo en la variable de clase kilometrajeTotal se lleva la cuentade los kiloacutemetros que han recorrido todos los coches que se han creadoTambieacuten se crea un meacutetodo de clase llamado getKilometrajeTotal que simplemente esun getter para la variable de clase kilometrajeTotal

Programacioacuten orientada a objetos 115

Cochejava Definicioacuten de la clase Coche author Luis Joseacute Saacutenchez

public class Coche

atributo de claseprivate static int kilometrajeTotal = 0

meacutetodo de clasepublic static int getKilometrajeTotal()

return kilometrajeTotal

private String marca

private String modelo

private int kilometraje

public Coche(String ma String mo)

marca = ma

modelo = mo

kilometraje = 0

public int getKilometraje()

return kilometraje

Recorre una determinada distancia param km distancia a recorrer en kiloacutemetros

public void recorre(int km)

kilometraje += km

kilometrajeTotal += km

Como ya hemos comentado el atributo kilometrajeTotal almacena el nuacutemero total dekiloacutemetros que recorren todos los objetos de la clase Coche es un uacutenico valor por esose declara como static Por el contrario el atributo kilometraje almacena los kiloacutemetrosrecorridos por un objeto concreto y tendraacute un valor distinto para cada uno de ellos

Programacioacuten orientada a objetos 116

Si en el programa principal se crean 20 objetos de la clase Coche cada uno tendraacute supropio kilometrajeA continuacioacuten se muestra el programa que prueba la clase Coche

PruebaCochejava Programa que prueba la clase Coche author Luis Joseacute Saacutenchez

public class PruebaCoche

public static void main(String[] args)

Coche cocheDeLuis = new Coche(Saab 93)

Coche cocheDeJuan = new Coche(Toyota Avensis)

cocheDeLuisrecorre(30)

cocheDeLuisrecorre(40)

cocheDeLuisrecorre(220)

cocheDeJuanrecorre(60)

cocheDeJuanrecorre(150)

cocheDeJuanrecorre(90)

Systemoutprintln(El coche de Luis ha recorrido + cocheDeLuisgetKilometraje() +

Km)

Systemoutprintln(El coche de Juan ha recorrido + cocheDeJuangetKilometraje() +

Km)

Systemoutprintln(El kilometraje total ha sido de + CochegetKilometrajeTotal() +

Km)

El meacutetodo getKilometrajeTotal() se aplica a la clase Coche por tratarse de un meacutetodo declase (meacutetodo static) Este meacutetodo no se podriacutea aplicar a una instancia de la mismamanera que un meacutetodo que no sea static no se puede aplicar a la clase sino a losobjetos

97 Interfaces

Una interfaz contiene uacutenicamente la cabecera de una serie de meacutetodos (opcional-mente tambieacuten puede contener constantes) Por tanto se encarga de especificar uncomportamiento que luego tendraacute que ser implementado La interfaz no especificael ldquocoacutemordquo ya que no contiene el cuerpo de los meacutetodos solo el ldquoqueacuterdquoUna interfaz puede ser uacutetil en determinadas circunstancias En principio separala definicioacuten de la implementacioacuten o como deciacuteamos antes el ldquoqueacuterdquo del ldquocoacutemordquo

Programacioacuten orientada a objetos 117

Tendremos entonces la menos dos ficheros la interfaz y la clase que implementaesa interfaz Se puede dar el caso que un programador escriba la interfaz y luegose la pase a otro programador para que sea eacuteste uacuteltimo quien la implementeHay que destacar que cada interfaz puede tener varias implementaciones asociadasPara ilustrar el uso de interfaces utilizaremos algunas clases ya conocidas La super-clase que va a estar por encima de todas las demaacutes seraacute la clase Animal vista conanterioridad El coacutedigo de esta clase no variacutea por lo tanto no lo vamos a reproduciraquiacute de nuevoDefinimos la interfaz Mascota

Mascotajava Definicioacuten de la interfaz Mascota author Luis Joseacute Saacutenchez

public interface Mascota

String getCodigo()

void hazRuido()

void come(String comida)

void peleaCon(Animal contrincante)

Como puedes ver uacutenicamente se escriben las cabeceras de los meacutetodos que debetener las clases que implementen la interfaz MascotaUna de las implementaciones de Mascota seraacute Gato

Gatojava Definicioacuten de la clase Gato author Luis Joseacute Saacutenchez

public class Gato extends Animal implements Mascota

private String codigo

public Gato (Sexo s String c)

super(s)thiscodigo = c

Override

Programacioacuten orientada a objetos 118

public String getCodigo()

return thiscodigo

Hace que el gato emita sonidos

Override

public void hazRuido()

thismaulla()thisronronea()

Hace que el gato maulle

public void maulla()

Systemoutprintln(Miauuuu)

Hace que el gato ronronee

public void ronronea()

Systemoutprintln(mrrrrrr)

Hace que el gato coma A los gatos les gusta el pescado si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al gato

Override

public void come(String comida)

if (comidaequals(pescado))

supercome()Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como pescado)

Programacioacuten orientada a objetos 119

Pone a pelear al gato contra otro animal Solo se van a pelear dos machos entre siacute param contrincante es el animal contra el que pelear

Override

public void peleaCon(Animal contrincante)

if (thisgetSexo() == SexoHEMBRA)

Systemoutprintln(no me gusta pelear)

else

if (contrincantegetSexo() == SexoHEMBRA)

Systemoutprintln(no peleo contra hembras)

else

Systemoutprintln(ven aquiacute que te vas a enterar)

Mediante la siguiente liacutenea

public class Gato extends Animal implements Mascota

estamos diciendo que Gato es una subclase de Animal y que ademaacutes es una im-plementacioacuten de la interfaz Mascota Fiacutejate que no es lo mismo la herencia que laimplementacioacutenObserva que los meacutetodos que se indicaban en Mascota uacutenicamente con la cabeceraahora estaacuten implementados completamente en Gato Ademaacutes Gato contiene otrosmeacutetodos que no se indicaban en Mascota como maulla y ronroneaLos meacutetodos de Gato que implementan meacutetodos especificados en Mascota deben tenerla anotacioacuten OverrideComo dijimos anteriormente una interfaz puede tener varias implementaciones Acontinuacioacuten se muestra Perro otra implementacioacuten de Mascota

Programacioacuten orientada a objetos 120

Perrojava Definicioacuten de la clase Perro author Luis Joseacute Saacutenchez

public class Perro extends Animal implements Mascota

private String codigo

public Perro (Sexo s String c)

super(s)thiscodigo = c

Override

public String getCodigo()

return thiscodigo

Hace que el Perro emita sonidos

Override

public void hazRuido()

thisladra()

Hace que el Perro ladre

public void ladra()

Systemoutprintln(Guau guau)

Hace que el Perro coma A los Perros les gusta la carne si le damos otra comida la rechazaraacute param comida la comida que se le ofrece al Perro

Override

public void come(String comida)

if (comidaequals(carne))

Programacioacuten orientada a objetos 121

supercome()Systemoutprintln(Hmmmm gracias)

else

Systemoutprintln(Lo siento yo solo como carne)

Pone a pelear el perro contra otro animal Solo se van a pelear si los dos son perros param contrincante es el animal contra el que pelear

Override

public void peleaCon(Animal contrincante)

if (contrincantegetClass()getSimpleName()equals(Perro))

Systemoutprintln(ven aquiacute que te vas a enterar)

else

Systemoutprintln(no me gusta pelear)

Por uacuteltimo mostramos el programa que prueba Mascota y sus implementaciones Gato yPerro

PruebaMascotajava Programa que prueba la interfaz Mascota author Luis Joseacute Saacutenchez

public class PruebaMascota

public static void main(String[] args)

Mascota garfield = new Gato(SexoMACHO 34569)

Mascota lisa = new Gato(SexoHEMBRA 96059)

Mascota kuki = new Perro(SexoHEMBRA 234678)

Mascota ayo = new Perro(SexoMACHO 778950)

Systemoutprintln(garfieldgetCodigo())

Systemoutprintln(lisagetCodigo())

Systemoutprintln(kukigetCodigo())

Systemoutprintln(ayogetCodigo())

garfieldcome(pescado)

Programacioacuten orientada a objetos 122

lisacome(hamburguesa)

kukicome(pescado)

lisapeleaCon((Gato)garfield)

ayopeleaCon((Perro)kuki)

Observa que para crear una mascota que es un gato escribimos lo siguiente

Mascota garfield = new Gato(SexoMACHO 34569)

Una interfaz no se puede instanciar por tanto la siguiente liacutenea seriacutea incorrecta

Mascota garfield = new Mascota(SexoMACHO 34569)

InterfacesLa interfaz indica ldquoqueacuterdquo hay que hacer y la implementacioacuten especifica ldquocoacutemordquose haceUna interfaz puede tener varias implementacionesUna interfaz no se puede instanciarLa implementacioacuten puede contener meacutetodos adicionales cuyas cabeceras noestaacuten en su interfaz

98 Arrays de objetos

Del mismo modo que se pueden crear arrays de nuacutemeros enteros decimales o cadenasde caracteres tambieacuten es posible crear arrays de objetosVamos a definir la clase Alumnopara luego crear un array de objetos de esta clase

Alumnojava Definicioacuten de la clase Alumno author Luis Joseacute Saacutenchez

public class Alumno

private String nombre

private double notaMedia = 00

public String getNombre()

Programacioacuten orientada a objetos 123

return nombre

public void setNombre(String nombre)

thisnombre = nombre

public double getNotaMedia()

return notaMedia

public void setNotaMedia(double notaMedia)

thisnotaMedia = notaMedia

A continuacioacuten se define un array de cinco alumnos que posteriormente se rellena Poruacuteltimo se muestran los datos de los alumnos por pantallaObserva que la siguiente liacutenea uacutenicamente define la estructura del array pero no crealos objetos

Alumno[] alum = new Alumno[5]

Cada objeto concreto se crea de forma individual mediante

alum[i] = new Alumno()

Aquiacute tienes el ejemplo completo

ArrayDeAlumnosPrincipaljava Programa que prueba un array de la clase Alumno author Luis Joseacute Saacutenchez

public class ArrayDeAlumnosPrincipal

public static void main(String[] args)

Define la estructura un array de 5 alumnos pero no crea los objetosAlumno[] alum = new Alumno[5]

Pide los datos de los alumnos

Programacioacuten orientada a objetos 124

Systemoutprintln(A continuacion debera introducir el nombre y la nota media de 5 al

umnos)

String nombreIntroducido

double notaIntroducida

for(int i = 0 i lt 5 i++)

alum[i] = new Alumno()

Systemoutprintln(Alumno + i)

Systemoutprint(Nombre )

nombreIntroducido = Systemconsole()readLine()

(alum[i])setNombre(nombreIntroducido)

Systemoutprint(Nota media )

notaIntroducida = DoubleparseDouble(Systemconsole()readLine())

alum[i]setNotaMedia(notaIntroducida)

for i

Muestra los datos de los alumnos

Systemoutprintln(Los datos introducidos son los siguientes)

double sumaDeMedias = 0

for(int i = 0 i lt 5 i++)

Systemoutprintln(Alumno + i)

Systemoutprintln(Nombre + alum[i]getNombre())

Systemoutprintln(Nota media + alum[i]getNotaMedia())

Systemoutprintln(----------------------------)

sumaDeMedias += alum[i]getNotaMedia()

for i

Systemoutprintln(La media global de la clase es + sumaDeMedias 5)

Veamos ahora un ejemplo algo maacutes complejo Se trata de una gestioacuten tiacutepica - altabaja listado y modificacioacuten - de una coleccioacuten de discos Este tipo de programas sesuele denominar CRUD (Create Read Update Delete)Primero se define la clase Disco

Programacioacuten orientada a objetos 125

Discojava Definicioacuten de la clase Disco author Luis Joseacute Saacutenchez

public class Disco

private String codigo = LIBRE

private String autor

private String titulo

private String genero

private int duracion duracioacuten total en minutos

public String getCodigo()

return codigo

public void setCodigo(String codigo)

thiscodigo = codigo

public String getAutor()

return autor

public void setAutor(String autor)

thisautor = autor

public String getGenero()

return genero

public void setGenero(String genero)

thisgenero = genero

public String getTitulo()

return titulo

public void setTitulo(String titulo)

thistitulo = titulo

Programacioacuten orientada a objetos 126

public int getDuracion()

return duracion

public void setDuracion(int duracion)

thisduracion = duracion

public String toString()

String cadena = n------------------------------------------

cadena += nCoacutedigo + thiscodigocadena += nAutor + thisautorcadena += nTiacutetulo + thistitulocadena += nGeacutenero + thisgenerocadena += nDuracioacuten + thisduracioncadena += n------------------------------------------

return cadena

A continuacioacuten se crea el programa principal Cada elemento de la coleccioacuten seraacuteun objeto de la clase Disco Se trata como veraacutes de una gestioacuten muy simple perototalmente funcionalNo se incluye en el manual porque ocupariacutea varias paacuteginas El coacutedigo del programa sepuede descargar desde el siguiente enlace httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos09_POOColeccionDeDiscosColeccionDeDiscosPrincipaljava

Programacioacuten orientada a objetos 127

99 Ejercicios

991 Conceptos de POO

Ejercicio 1iquestCuaacuteles seriacutean los atributos de la clase PilotoDeFormula1 iquestSe te ocurren algunasinstancias de esta clase

Ejercicio 2A continuacioacuten tienes una lista en la que estaacuten mezcladas varias clases coninstancias de esas clases Para ponerlo un poco maacutes difiacutecil todos los elementosestaacuten escritos en minuacutescula Di cuaacuteles son las clases cuaacuteles las instanciasa queacute clase pertenece cada una de estas instancias y cuaacutel es la jerarquiacuteaentre las clases paula goofy gardfiel perro mineral caballo tom silvestrepirita rocinante milu snoopy gato pluto animal javier bucefalo pegasoayudante_de_santa_claus cuarzo laika persona pato_lucas

Ejercicio 3iquestCuaacuteles seriacutean los atributos de la clase Vivienda iquestQueacute subclases se te ocurren

Ejercicio 4Piensa en la liga de baloncesto iquestqueacute 5 clases se te ocurren para representar5 elementos distintos que intervengan en la liga

Ejercicio 5Haz una lista con los atributos que podriacutea tener la clase caballo A continuacioacutenhaz una lista con los posibles meacutetodos (acciones asociadas a los caballos)

Ejercicio 6Lista los atributos de la clase Alumno iquestSeriacutea nombre uno de los atributos de laclase Razona tu respuesta

Ejercicio 7iquestCuaacuteles seriacutean los atributos de la clase Ventana (de ordenador) iquestcuaacuteles seriacuteanlos meacutetodos Piensa en las propiedades y en el comportamiento de unaventana de cualquier programa

Programacioacuten orientada a objetos 128

992 POO en Java

Ejercicio 1Implementa la clase Caballo vista en un ejercicio anterior Prueacutebala creandoinstancias y aplicaacutendole algunos meacutetodos

Ejercicio 2Crea la clase Vehiculo asiacute como las clases Bicicleta y Coche como subclases dela primera Para la clase Vehiculo crea los atributos de clase vehiculosCreadosykilometrosTotales asiacute como el atributo de instancia kilometrosRecorridos Creatambieacuten alguacuten meacutetodo especiacutefico para cada una de las subclases Prueba lasclases creadas mediante un programa con un menuacute como el que se muestraa continuacioacuten

VEHIacuteCULOS

=========

1 Anda con la bicicleta

2 Haz el caballito con la bicicleta

3 Anda con el coche

4 Quema rueda con el coche

5 Ver kilometraje de la bicicleta

6 Ver kilometraje del coche

7 Ver kilometraje total

8 Salir

Elige una opcioacuten (1-8)

Ejercicio 3Crea las clases Animal Mamifero Ave Gato Perro Canario Pinguino y Lagarto Creaal menos tres meacutetodos especiacuteficos de cada clase y redefne ellos meacutetodoscuando sea necesario Prueba las clases creadas en un programa en el que seinstancien objetos y se les apliquen meacutetodos

Ejercicio 4Crea la clase Fraccioacuten Los atributos seraacuten numerador y denominador Y algunos delos meacutetodos pueden ser invierte simplifica multiplica divide etc

Programacioacuten orientada a objetos 129

Ejercicio 5Crea la clase Pizza con los atributos y meacutetodos necesarios Sobre cada pizzase necesita saber el tamantildeo - mediana o familiar - el tipo - margarita cuatroquesos o funghi - y su estado - pedida o servida La clase debe almacenarinformacioacuten sobre el nuacutemero total de pizzas que se han pedido y que sehan servido Siempre que se crea una pizza nueva su estado es ldquopedidardquoEl siguiente coacutedigo del programa principal debe dar la salida que se muestra

public class PedidosPizza

public static void main(String[] args)

Pizza p1 = new Pizza(margarita mediana)

Pizza p2 = new Pizza(funghi familiar)

p2sirve()

Pizza p3 = new Pizza(cuatro quesos mediana)

Systemoutprintln(p1)

Systemoutprintln(p2)

Systemoutprintln(p3)

p2sirve()

Systemoutprintln(pedidas + PizzagetTotalPedidas())

Systemoutprintln(servidas + PizzagetTotalServidas())

pizza margarita mediana pedida

pizza funghi familiar servida

pizza cuatro quesos mediana pedida

esa pizza ya se ha servido

pedidas 3

servidas 1

Ejercicio 6Crea la clase Tiempo con los meacutetodos suma y resta Los objetos de la clase Tiempo

son intervalos de tiempo y se crean de la forma Tiempo t = new Tiempo(1 20

30) donde los paraacutemetros que se le pasan al constructor son las horas losminutos y los segundos respectivamente Crea el meacutetodo toString para ver losintervalos de tiempo de la forma 10h 35m 5s Si se suman por ejemplo 30m 40s y35m 20s el resultado deberiacutea ser 1h 6m 0s Realiza un programa de prueba paracomprobar que la clase funciona bien

Programacioacuten orientada a objetos 130

Ejercicio 7Queremos gestionar la venta de entradas (no numeradas) de ExpocochesCampanillas que tiene 3 zonas la sala principal con 1000 entradas dispo-nibles la zona de compra-venta con 200 entradas disponibles y la zona vipcon 25 entradas disponibles Hay que controlar que existen entradas antes devenderlasLa clase Zona con sus atributos y meacutetodos se muestra a continuacioacuten

Definicioacuten de la clase Zona author Luis Joseacute Saacutenchez

public class Zona

private int entradasPorVender

public Zona(int n)

entradasPorVender = n

public int getEntradasPorVender()

return entradasPorVender

Vende un nuacutemero de entradas ltpgt Comprueba si quedan entradas libres antes de realizar la venta param n nuacutemero de entradas a vender

public void vender(int n)

if (thisentradasPorVender == 0)

Systemoutprintln(Lo siento las entradas para esa zona estaacuten agotadas)

else if (thisentradasPorVender lt n)

Systemoutprintln(Soacutelo me quedan + thisentradasPorVender+ entradas para esa zona)

if (thisentradasPorVender gt= n)

entradasPorVender -= n

Systemoutprintln(Aquiacute tiene sus + n + entradas gracias)

El menuacute del programa debe ser el que se muestra a continuacioacuten Cuandoelegimos la opcioacuten 2 se nos debe preguntar para queacute zona queremos lasentradas y cuaacutentas queremos Loacutegicamente el programa debe controlar queno se puedan vender maacutes entradas de la cuenta

1 Mostrar nuacutemero de entradas libres

2 Vender entradas

3 Salir

Programacioacuten orientada a objetos 131

993 Arrays de objetos

Ejercicio 1Utiliza la clase Gato para crear un array de cuatro gatos e introduce los datosde cada uno de ellos mediante un bucle Muestra a continuacioacuten los datos detodos los gatos utilizando tambieacuten un bucle

Ejercicio 2Cambia el programa anterior de tal forma que los datos de los gatos se intro-duzcan directamente en el coacutedigo de la forma gatito[2]setColor(ldquomarroacutenrdquo) o bienmediante el constructor de la forma gatito[3] = new Gato(ldquoGarfieldrdquo ldquonaranjardquo

ldquomachordquo) Muestra a continuacioacuten los datos de todos los gatos utilizando unbucle

Ejercicio 3Realiza el programa ldquoColeccioacuten de discosrdquo por tu cuenta mirando lo menosposible el ejemplo que se proporciona Prueacutebalo primero para ver coacutemofunciona y luego intenta implementarlo tuacute mismo

Ejercicio 4Modifica el programa ldquoColeccioacuten de discosrdquo como se indica a continuacioacutena) Mejora la opcioacuten ldquoNuevo discordquo de tal forma que cuando se llenen todas lasposiciones del array el programa muestre un mensaje de error No se permitiraacuteintroducir los datos de ninguacuten disco hasta que no se borre alguno de la listab) Mejora la opcioacuten ldquoBorrarrdquo de tal forma que se verifique que el coacutedigointroducido por el usuario existec) Modifica el programa de tal forma que el coacutedigo del disco sea uacutenico es decirque no se pueda repetird) Crea un submenuacute dentro dentro de ldquoListadordquo de tal forma que exista unlistado completo un listado por autor (todos los discos que ha publicado undeterminado autor) un listado por geacutenero (todos los discos de un geacutenero de-terminado) y un listado de discos cuya duracioacuten esteacute en un rango determinadopor el usuario

Programacioacuten orientada a objetos 132

Ejercicio 5Crea el programa GESTISIMAL (GESTIoacuten SIMplificada de Almaceacuten) para llevarel control de los artiacuteculos de un almaceacuten De cada artiacuteculo se debe saberel coacutedigo la descripcioacuten el precio de compra el precio de venta y el stock(nuacutemero de unidades) El menuacute del programa debe tener al menos lassiguientes opciones

1 Listado

2 Alta

3 Baja

4 Modificacioacuten

5 Entrada de mercanciacutea

6 Salida de mercanciacutea

7 Salir

La entrada y salida de mercanciacutea supone respectivamente el incremento ydecremento de stock de un determinado artiacuteculo Hay que controlar que no sepueda sacar maacutes mercanciacutea de la que hay en el almaceacuten

10 Colecciones y diccionarios

101 Colecciones la clase ArrayList

Una coleccioacuten en Java es una estructura de datos que permite almacenar muchosvalores del mismo tipo por tanto conceptualmente es praacutecticamente igual que unarray Seguacuten el uso y seguacuten si se permiten o no repeticiones Java dispone de un ampliocataacutelogo de colecciones ArrayList (lista) ArrayBlockingQueue (cola) HashSet (conjunto)Stack (pila) etc En este manual estudiaremos la coleccioacuten ArrayListUn ArrayList es una estructura en forma de lista que permite almacenar elementos delmismo tipo (pueden ser incluso objetos) su tamantildeo va cambiando a medida que seantildeaden o se eliminan esos elementosNos podemos imaginar un ArrayList como un conjunto de celdas o cajoncitos donde seguardan los valores exactamente igual que un array convencional En la praacutectica seraacutemaacutes faacutecil trabajar con un ArrayListEn capiacutetulos anteriores hemos podido comprobar la utilidad del array es un recursoimprescindible que cualquier programador debe manejar con soltura No obstante elarray presenta algunos inconvenientes Uno de ellos es la necesidad de conocer eltamantildeo exacto en el momento de su creacioacuten Una coleccioacuten sin embargo se crea sinque se tenga que especificar el tamantildeo posteriormente se van antildeadiendo y quitandoelementos a medida que se necesitanTrabajando con arrays es frecuente cometer errores al utilizar los iacutendices por ejemploal intentar guardar un elemento en una posicioacuten que no existe (iacutendice fuera de rango)Aunque las colecciones permiten el uso de iacutendices no es necesario indicarlos siemprePor ejemplo en una coleccioacuten del tipo ArrayList cuando hay que antildeadir el elementoAmapola se puede hacer simplemente floresadd(Amapola) Al no especificar iacutendice elelemento Amapola se antildeadiriacutea justo al final de flores independientemente del tamantildeoy del nuacutemero de elementos que se hayan introducido yaLa clase ArrayList es muy similar a la clase Vector Eacutesta uacuteltima estaacute obsoleta y por tantono se recomienda su uso

1011 Principales meacutetodos de ArrayList

Las operaciones maacutes comunes que se pueden realizar con un objeto de la claseArrayList son las siguientes

add(elemento)Antildeade un elemento al final de la lista

133

Colecciones y diccionarios 134

add(indice elemento)Inserta un elemento en una posicioacuten determinada desplazando el resto deelementos hacia la derecha

clear()Elimina todos los elementos pero no borra la lista

contains(elemento)Devuelve true si la lista contiene el elemento que se especifica y false en casocontrario

get(indice)Devuelve el elemento de la posicioacuten que se indica entre pareacutentesis

indexOf(elemento)Devuelve la posicioacuten de la primera ocurrencia del elemento que se indica entrepareacutentesis

isEmpty()Devuelve true si la lista estaacute vaciacutea y false en caso de tener alguacuten elemento

remove(indice)Elimina el elemento que se encuentra en una posicioacuten determinada

remove(elemento)Elimina la primera ocurrencia de un elemento

set(indice elemento)Machaca el elemento que se encuentra en una determinada posicioacuten con elelemento que se pasa como paraacutemetro

size()Devuelve el tamantildeo (nuacutemero de elementos) de la lista

toArray()Devuelve un array con todos y cada uno de los elementos que contiene la lista

Puedes consultar todos los meacutetodos disponibles en la documentacioacuten oficial de la claseArrayList1

1httpdocsoraclecomjavase7docsapijavautilArrayListhtml

Colecciones y diccionarios 135

1012 Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de suselementos

A continuacioacuten se muestra un ejemplo en el que se puede ver coacutemo se declara unArrayList y coacutemo se insertan y se extraen elementos

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList01

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

Systemoutprintln(Nordm de elementos + asize())

aadd(rojo)

aadd(verde)

aadd(azul)

Systemoutprintln(Nordm de elementos + asize())

aadd(blanco)

Systemoutprintln(Nordm de elementos + asize())

Systemoutprintln(El elemento que hay en la posicioacuten 0 es + aget(0))

Systemoutprintln(El elemento que hay en la posicioacuten 3 es + aget(3))

Observa que al crear un objeto de la clase ArrayList hay que indicar el tipo de dato quese almacenaraacute en las celdas de esa lista Para ello se utilizan los caracteres lt y gt Nohay que olvidar los pareacutentesis del final

Es necesario importar la clase ArrayList para poder crear objetos de estaclase para ello debe aparecer al principio del programa la liacutenea import

javautilArrayList Algunos IDEs (por ej Netbeans) insertan esta liacutenea decoacutedigo de forma automaacutetica

En el siguiente ejemplo se muestra un ArrayList de nuacutemeros enteros

Colecciones y diccionarios 136

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList011

public static void main(String[] args)

ArrayListltIntegergt a = new ArrayListltIntegergt()

aadd(18)

aadd(22)

aadd(-30)

Systemoutprintln(Nordm de elementos + asize())

Systemoutprintln(El elemento que hay en la posicioacuten 1 es + aget(1))

Se define la estructura de la siguiente manera

ArrayListltIntegergt a = new ArrayListltIntegergt()

Fiacutejate que no se utiliza el tipo simple int sino el wrapper Integer Recuerda quelos wrapper son clases que engloban a los tipos simples y les antildeaden nuevasfuncionalidades (p ej permiten tratar a las variables numeacutericas como objetos) Elwrapper de int es Integer el de float es Float el de double es Double el de long es Longel de boolean es Boolean y el de char es CharacterEn el siguiente ejemplo podemos ver coacutemo extraer todos los elementos de una lista ala manera tradicional con un bulce for

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList02

Colecciones y diccionarios 137

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(int i=0 i lt asize() i++)

Systemoutprintln(aget(i))

Si estaacutes acostumbrado al for claacutesico habraacutes visto que es muy sencillo recorrer todoslos elementos del ArrayList No obstante al trabajar con colecciones es recomendableusar el for al estilo foreach como se muestra en el siguiente ejemplo Como puedes verla sintaxis es maacutes corta y no se necesita crear un iacutendice para recorrer la estructura

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList03

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(String color a)

Colecciones y diccionarios 138

Systemoutprintln(color)

Fiacutejate en estas liacuteneas

for(String color a)

Systemoutprintln(color)

El significado de este coacutedigo seriacutea el siguiente

for(String color a)

rarr Saca uno a uno todos los elementos de a y ve metieacutendolos en una variable de nombrecolor

Systemoutprintln(color)

rarr Muestra por pantalla el contenido de la variable colorVeamos ahora en otro ejemplo coacutemo eliminar elementos de un ArrayList Se utiliza elmeacutetodo remove() y se puede pasar como paraacutemetro el iacutendice del elemento que se quiereeliminar o bien el valor del elemento O sea aremove(2) elimina el elemento que seencuentra en la posicioacuten 2 de a mientras que aremove(blanco) elimina el valor blancoEs importante destacar que el ArrayList se reestructura de forma automaacutetica despueacutesdel borrado de cualquiera de sus elementos

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList04

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

Colecciones y diccionarios 139

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

aadd(blanco)

Systemoutprintln(Contenido de la lista )

for(String color a)

Systemoutprintln(color)

if (acontains(blanco))

Systemoutprintln(El blanco estaacute en la lista de colores)

aremove(blanco)

Systemoutprintln(Contenido de la lista despueacutes de quitar la +

primera ocurrencia del color blanco )

for(String color a)

Systemoutprintln(color)

aremove(2)

Systemoutprintln(Contenido de la lista despueacutes de quitar el +

elemento de la posicioacuten 2 )

for(String color a)

Systemoutprintln(color)

A continuacioacuten se muestra un ejemplo en el que se ldquomachacardquo una posicioacuten delArrayList Al hacer aset(2 turquesa) se borra lo que hubiera en la posicioacuten 2 y secoloca el valor turquesa Seriacutea equivalente a hacer a[2] = turquesa en caso de que a

fuese un array tradicional en lugar de un ArrayList

Colecciones y diccionarios 140

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList05

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido del vector )

for(String color a)

Systemoutprintln(color)

aset(2 turquesa)

Systemoutprintln(Contenido del vector despueacutes de machacar la posicioacuten 2 )

for(String color a)

Systemoutprintln(color)

El meacutetodo add permite antildeadir elementos a un ArrayList como ya hemos visto Porejemplo aadd(amarillo) antildeade el elemento amarillo al final de a Este meacutetodo sepuede utilizar tambieacuten con un iacutendice de la forma aadd(1 turquesa) En este caso loque se hace es insertar en la poscioacuten indicada Lo mejor de todo es que el ArrayList sereestructura de forma automaacutetica desplazando el resto de elementos

Colecciones y diccionarios 141

Ejemplo de uso de la clase ArrayList author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList06

public static void main(String[] args)

ArrayListltStringgt a = new ArrayListltStringgt()

aadd(rojo)

aadd(verde)

aadd(azul)

aadd(blanco)

aadd(amarillo)

Systemoutprintln(Contenido de la lista )

for(String color a)

Systemoutprintln(color)

aadd(1 turquesa)

Systemoutprintln(Contenido del vector despueacutes de insertar en la posicioacuten 1 )

for(String color a)

Systemoutprintln(color)

1013 ArrayList de objetos

Una coleccioacuten ArrayList puede contener objetos que son instancias de clases definidaspor el programador Esto es muy uacutetil sobre todo en aplicaciones de gestioacuten paraguardar datos de alumnos productos libros etcEn el siguiente ejemplo definimos una lista de gatos En cada celda de la lista sealmacenaraacute un objeto de la clase Gato

Colecciones y diccionarios 142

Uso de un ArrayList de objetos author Luis Joseacute Saacutenchez

import javautilArrayList

public class EjemploArrayList07

public static void main(String[] args)

ArrayListltGatogt g = new ArrayListltGatogt()

gadd(new Gato(Garfield naranja mestizo))

gadd(new Gato(Pepe gris angora))

gadd(new Gato(Mauri blanco manx))

gadd(new Gato(Ulises marroacuten persa))

Systemoutprintln(nDatos de los gatosn)

for (Gato gatoAux g)

Systemoutprintln(gatoAux+n)

En el siguiente apartado se muestra la definicioacuten de la clase Gato

1014 Ordenacioacuten de un ArrayList

Los elementos de una lista se pueden ordenar con el meacutetodo sort El formato es elsiguiente

Collectionssort(lista)

Observa que sort es un meacutetodo de clase que estaacute definido en Collections Para poderutilizar este meacutetodo es necesario incluir la liacutenea

import javautilCollections

al principio del programa A continuacioacuten se muestra un ejemplo del uso de sort

Colecciones y diccionarios 143

Ordenacioacuten de un ArrayList author Luis Joseacute Saacutenchez

import javautilCollectionsimport javautilArrayList

public class EjemploArrayList071

public static void main(String[] args)

ArrayListltIntegergt a = new ArrayListltIntegergt()

aadd(67)

aadd(78)

aadd(10)

aadd(4)

Systemoutprintln(nNuacutemeros en el orden original)

for (int numero a)

Systemoutprintln(numero)

Collectionssort(a)

Systemoutprintln(nNuacutemeros ordenados)

for (int numero a)

Systemoutprintln(numero)

Tambieacuten es posible ordenar una lista de objetos En este caso es necesario indicar elcriterio de ordenacioacuten en la definicioacuten de la clase En el programa principal se utilizael meacutetodo sort igual que si se tratase de una lista de nuacutemeros o de palabras como semuestra a continuacioacuten

Colecciones y diccionarios 144

Ordenacioacuten de un ArrayList de objetos author Luis Joseacute Saacutenchez

import javautilCollectionsimport javautilArrayList

public class EjemploArrayList08

public static void main(String[] args)

ArrayListltGatogt g = new ArrayListltGatogt()

gadd(new Gato(Garfield naranja mestizo))

gadd(new Gato(Pepe gris angora))

gadd(new Gato(Mauri blanco manx))

gadd(new Gato(Ulises marroacuten persa))

gadd(new Gato(Adaacuten negro angora))

Collectionssort(g)

Systemoutprintln(nDatos de los gatos ordenados por nombre)

for (Gato gatoAux g)

Systemoutprintln(gatoAux+n)

Ahora bien en la definicioacuten de la clase Gato hay que indicar de alguna manera coacutemo sedebe realizar la ordenacioacuten ya que Java no sabe de antemano si los gatos se ordenanseguacuten el color el nombre el peso etcLo primero que hay que hacer es indicar que los objetos de la clase Gato se puedencomparar unos con otros Para ello cambiamos la siguiente liacutenea

public class Gato

por esta otra

public class Gato implements ComparableltGatogt

Lo siguiente y no menos importante es definir el meacutetodo compareTo Este meacutetodo debedevolver un 0 si los elementos que se comparan son iguales un nuacutemero negativo si

Colecciones y diccionarios 145

el primer elemento que se compara es menor que el segundo y un nuacutemero positivoen caso contrario Afortunadamente las clases String Integer Double etc ya tienenimplementado su propio meacutetodo compareTo asiacute que tenemos hecho lo maacutes difiacutecil Louacutenico que deberemos escribir en nuestro coacutedigo es un compareTo con los atributos quequeremos compararEn el caso que nos ocupa si queremos ordenar los gatos por nombre tendremos queimplementar el compareTo de la clase Gato de tal forma que nos devuelva el resultadodel compareTo de los nombres de los gatos que estamos comparando de la siguientemanera

public int compareTo(Gato g)

return (thisnombre)compareTo(ggetNombre())

Si en lugar de ordenar por nombre quisieacuteramos ordenar por raza el meacutetodo compareTo

de la clase Gato seriacutea el siguiente

public int compareTo(Gato g)

return (thisraza)compareTo(ggetRaza())

A continuacioacuten se muestra la definicioacuten completa de la clase Gato

Definicioacuten de la clase Gato author

public class Gato implements ComparableltGatogt

private String nombre

private String color

private String raza

public Gato(String nombre String color String raza)

thisnombre = nombre

thiscolor = color

thisraza = raza

public String getNombre()

return nombre

Colecciones y diccionarios 146

public String getRaza()

return raza

public String toString()

return Nombre + thisnombre + nColor + thiscolor + nRaza + thisraza

public int compareTo(Gato g)

return (thisnombre)compareTo(ggetNombre())

public boolean equals(Gato g)

return (thisnombre)equals(ggetNombre())

102 Diccionarios la clase HashMap

Imagina un diccionario ingleacutes-espantildeol Queremos saber queacute significa la palabra ldquostiffrdquoSabemos que en el diccionario hay muchas entradas y en cada entrada tenemos unapalabra en ingleacutes y su correspondiente traduccioacuten al espantildeol Buscando por la ldquosrdquoencontramos que ldquostiffrdquo significa ldquoagujetasrdquoUn diccionario en Java funciona exactamente igual Contiene una serie de elementosque son las entradas que a su vez estaacuten formadas por un par (clave valor) La clave(key) permite acceder al valor No puede haber claves duplicadas En el ejemploanterior la clave seriacutea ldquostiffrdquo y el valor ldquoagujetasrdquoJava dispone de varios tipos de diccionarios HashMap EnumMap Hashtable IdentityHashMapLinkedHashMap etc Nosotros estudiaremos el diccionario HashMap

1021 Principales meacutetodos de HashMap

Algunos de los meacutetodos maacutes importantes de la clase HasMap son

get(clave)Obtiene el valor correspondiente a una clave Devuelve null si no existe esa claveen el diccionario

put(clave valor)Antildeade un par (clave valor) al diccionario Si ya habiacutea un valor para esa clave semachaca

keySet()Devuelve un conjunto (set) con todas las claves

Colecciones y diccionarios 147

values()Devuelve una coleccioacuten con todos los valores (los valores pueden estar duplicadosa diferencia de las claves)

entrySet()Devuelve una coleccioacuten con todos los pares (clave valor)

containsKey(clave)Devuelve true si el diccionario contiene la clave indicada y false en caso contrario

getKey()Devuelve la clave de la entrada Se aplica a una sola entrada del diccionario (noal diccionario completo) es decir a una pareja (clave valor)

Por ejemplo

for (MapEntry pareja mentrySet())

Systemoutprintln(parejagetKey())

getValue()Devuelve el contenido de la entrada Se aplica a una entrada del diccionario (noal diccionario completo) es decir a una pareja (clave valor)

Por ejemplo

for (MapEntry pareja mentrySet())

Systemoutprintln(parejagetValue())

1022 Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas

Al declarar un diccionario hay que indicar los tipos tanto de la clave como del valorEn el siguiente ejemplo definimos el diccionario m que tendraacute como clave un nuacutemeroentero y una cadena de caracteres como valor Este diccionario se declara de estaforma

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

No hay que olvidar importar la clase al principio del programa

import javautilHashMap

Para insertar una entrada en el diccionario se utiliza el meacutetodo put indicando siemprela clave y el valor Veamos un ejemplo completo

Colecciones y diccionarios 148

Ejemplo de uso de la clase HasMap author Luis Joseacute Saacutenchez

import javautilHashMap

public class EjemploHashMap01

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(Los elementos de m son n + m)

Para extraer valores se utiliza el meacutetodo get Se proporciona una clave y el diccionarionos devuelve el valor igual que un diccionario de verdad Si no existe ninguna entradacon la clave que se indica se devuelve null

Ejemplo de uso de la clase HasMap author Luis Joseacute Saacutenchez

import javautilHashMap

public class EjemploHashMap011

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

Colecciones y diccionarios 149

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(mget(921))

Systemoutprintln(mget(605))

Systemoutprintln(mget(888))

iquestY si queremos extraer todas las entradas Tenemos varias opciones Podemos usar elmeacutetodo print directamente sobre el diccionario de la forma Systemoutprint(diccionario)

como vimos en un ejemplo anterior de esta manera se muestran por pantalla todaslas entradas encerradas entre llaves Tambieacuten podemos convertir el diccionario enun entrySet (conjunto de entradas) y mostrarlo con print de esta forma se obtieneuna salida por pantalla muy parecida a la primera (en lugar de llaves se muestrancorchetes) Otra opcioacuten es utilizar un for para recorrer una a una todas las entradasEn este uacuteltimo caso hay que convertir el diccionario en un entrySet ya que no se puedensacar las entradas directamente del diccionario Estas dos uacuteltimas opciones se ilustranen el siguiente ejemplo

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautilHashMapimport javautilMap

public class EjemploHashMap02

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(Todas las entradas del diccionario extraiacutedas con entrySet)

Systemoutprintln(mentrySet())

Systemoutprintln(nEntradas del diccionario extraiacutedas una a una)

Colecciones y diccionarios 150

for (MapEntry pareja mentrySet())

Systemoutprintln(pareja)

A continuacioacuten se muestra el uso de los meacutetodos getKey y getValue que extraen la clavey el valor de una entrada respectivamente

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautil

public class EjemploHashMap03

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprintln(CoacutedigotNombren------t-------------)

for (MapEntry pareja mentrySet())

Systemoutprint(parejagetKey() + t)

Systemoutprintln(parejagetValue())

En el uacuteltimo programa de ejemplo hacemos uso del meacutetodo containsKey que nos serviraacutepara saber si existe o no una determinada clave en un diccionario y del meacutetodo get

que como ya hemos visto sirve para extraer un valor a partir de su clave

Colecciones y diccionarios 151

Ejemplo de uso de la clase HashMap author Luis Joseacute Saacutenchez

import javautil

public class EjemploHashMap04

public static void main(String[] args)

HashMapltInteger Stringgt m = new HashMapltInteger Stringgt()

mput(924 Amalia Nuacutentildeez)

mput(921 Cindy Nero)

mput(700 Ceacutesar Vaacutezquez)

mput(219 Viacutector Tilla)

mput(537 Alan Brito)

mput(605 Esteban Quito )

Systemoutprint(Por favor introduzca un coacutedigo )

int codigoIntroducido = IntegerparseInt(Systemconsole()readLine())

if (mcontainsKey(codigoIntroducido))

Systemoutprint(El coacutedigo + codigoIntroducido + corresponde a )

Systemoutprintln(mget(codigoIntroducido))

else

Systemoutprint(El coacutedigo introducido no existe)

Colecciones y diccionarios 152

103 Ejercicios

Ejercicio 1Crea un ArrayList con los nombres de 6 compantildeeros de clase A continuacioacutenmuestra esos nombres por pantalla Utiliza para ello un bucle for que recorratodo el ArrayList sin usar ninguacuten iacutendice

Ejercicio 2Realiza un programa que introduzca valores aleatorios (entre 0 y 100) en unArrayList y que luego calcule la suma la media el maacuteximo y el miacutenimo de esosnuacutemeros El tamantildeo de la lista tambieacuten seraacute aleatorio y podraacute oscilar entre 10y 20 elementos ambos inclusive

Ejercicio 3Escribe un programa que ordene 10 nuacutemeros enteros introducidos por tecladoy almacenados en un objeto de la clase ArrayList

Ejercicio 4Realiza un programa equivalente al anterior pero en esta ocasioacuten el programadebe ordenar palabras en lugar de nuacutemeros

Ejercicio 5Realiza de nuevo el ejercicio de la coleccioacuten de discos pero utilizando esta vezuna lista para almacenar la informacioacuten sobre los discos en lugar de un arrayconvencional Comprobaraacutes que el coacutedigo se simplifica notablemente iquestCuaacutentoocupa el programa original hecho con un array iquestCuaacutento ocupa este nuevoprograma hecho con una lista

Ejercicio 6Implementa el control de acceso al aacuterea restringida de un programa Se debepedir un nombre de usuario y una contrasentildea Si el usuario introduce losdatos correctamente el programa diraacute ldquoHa accedido al aacuterea restringidardquo Elusuario tendraacute un maacuteximo de 3 oportunidades Si se agotan las oportunidadesel programa diraacute ldquoLo siento no tiene acceso al aacuterea restringidardquo Los nombresde usuario con sus correspondientes contrasentildeas deben estar almacenadosen una estructura de la clase HashMap

Colecciones y diccionarios 153

Ejercicio 7La maacutequina Eurocoin genera una moneda de curso legal cada vez que se pulsaun botoacuten siguiendo la siguiente pauta o bien coincide el valor con la monedaanteriormente generada - 1 ceacutentimo 2 ceacutentimos 5 ceacutentimos 10 ceacutentimos 25ceacutentimos 50 ceacutentimos 1 euro o 2 euros - o bien coincide la posicioacuten ndash cara ocruz Simula mediante un programa la generacioacuten de 6 monedas aleatoriassiguiendo la pauta correcta Cada moneda generada debe ser una instanciade la clase Moneda y la secuencia se debe ir almacenando en una lista

Ejemplo

2 ceacutentimos ndash cara

2 ceacutentimos ndash cruz

50 ceacutentimos ndash cruz

1 euro ndash cruz

1 euro ndash cara

10 ceacutentimos ndash cara

Ejercicio 8Realiza un programa que escoja al azar 10 cartas de la baraja espantildeola(10 objetos de la clase Carta) Emplea un objeto de la clase ArrayList paraalmacenarlas y aseguacuterate de que no se repite ninguna

Ejercicio 9Modifica el programa anterior de tal forma que las cartas se muestren orde-nadas Primero se ordenaraacuten por palo bastos copas espadas oros Cuandocoincida el palo se ordenaraacute por nuacutemero as 2 3 4 5 6 7 sota caballo rey

Ejercicio 10Crea un mini-diccionario espantildeol-ingleacutes que contenga al menos 20 palabras(con su correspondiente traduccioacuten) Utiliza un objeto de la clase HashMap paraalmacenar las parejas de palabras El programa pediraacute una palabra en espantildeoly daraacute la correspondiente traduccioacuten en ingleacutes

Ejercicio 11Realiza un programa que escoja al azar 5 palabras en espantildeol del mini-diccionario del ejercicio anterior El programa iraacute pidiendo que el usuarioteclee la traduccioacuten al ingleacutes de cada una de las palabras y comprobaraacute sison correctas Al final el programa deberaacute mostrar cuaacutentas respuestas sonvaacutelidas y cuaacutentas erroacuteneas

Colecciones y diccionarios 154

Ejercicio 12Escribe un programa que genere una secuencia de 5 cartas de la barajaespantildeola y que sume los puntos seguacuten el juego de la brisca El valor de lascartas se debe guardar en una estructura HashMap que debe contener parejas(figura valor) por ejemplo (ldquocaballordquo 3) La secuencia de cartas debe ser unaestructura de la clase ArrayList que contiene objetos de la clase Carta El valorde las cartas es el siguiente as rarr 11 tres rarr 10 sota rarr 2 caballo rarr 3 rey rarr4 el resto de cartas no vale nada

Ejemplo

as de oros

cinco de bastos

caballo de espadas

sota de copas

tres de oros

Tienes 26 puntos

Ejercicio 13Modifica el programa Gestisimal realizado anteriormente antildeadiendo lassiguientes mejoras

bull Utiliza una lista en lugar de un array para el almacenamiento de los datosbull Comprueba la existencia del coacutedigo en el alta la baja y la modificacioacuten

de artiacuteculos para evitar erroresbull Cambia la opcioacuten ldquoSalida de stockrdquo por ldquoVentardquo Esta nueva opcioacuten

permitiraacute hacer una venta de varios artiacuteculos y emitir la factura corres-pondiente Se debe preguntar por los coacutedigos y las cantidades de cadaartiacuteculo que se quiere comprar Aplica un 21 de IVA

11 Ficheros de texto y paso de paraacutemetrospor liacutenea de comandos

Mediante un programa en Java se puede acceder al contenido de un fichero grabadoen un dispositivo de almacenamiento (por ejemplo en el disco duro) tanto para leercomo para escribir (grabar) datosLa informacioacuten contenida en las variables los arrays los objetos o cualquier otraestructura de datos es volaacutetil es decir se pierde cuando se cierra el programaLos ficheros permiten tener ciertos datos almacenados y disponibles en cualquiermomento para cuando nuestro programa los necesitePensemos por ejemplo en un juego Podriacuteamos utilizar un fichero para guardar elranking de jugadores con las mejores puntuaciones De esta manera estos datos nose perderiacutean al salir del juego De igual forma en un programa de gestioacuten puede seruacutetil tener un fichero de configuracioacuten con datos como el nuacutemero maacuteximo de elementosque se muestran en un listado o los distintos tipos de IVA aplicables a las facturas Almodificar esta informacioacuten quedaraacute almacenada en el fichero correspondiente y nose perderaacute cuando se cierre el programa

Cuando un programa se cierra se pierde la informacioacuten almacenada envariables arrays objetos o cualquier otra estructura Si queremos conservarciertos datos debemos guardarlos en ficheros

Hay programas que hacen un uso intensivo de datos Por ejemplo la aplicacioacutenSeacuteneca- que por cierto estaacute hecha en Java - lleva el control de la matriculacioacuten de cientosde miles de alumnos y la gestioacuten de decenas de miles de profesores En este caso yen otros similares se utiliza un sistema gestor de bases de datos El acceso a bases dedatos mediante Java lo estudiaremos en el capiacutetulo 13

La creacioacuten y uso de ficheros desde un programa en Java se lleva a cabocuando hay poca informacioacuten que almacenar o cuando esa informacioacuten esheterogeacutenea En los casos en que la informacioacuten es abundante y homogeacuteneaes preferible usar una base de datos relacional (por ejemplo MySQL) en lugarde ficheros

En este capiacutetulo estudiaremos ademaacutes del acceso a ficheros desde un programa enJava el paso de paraacutemetros desde la liacutenea de comandos Son cosas diferentes y nohay que utilizarlas juntas necesariamente pero como podraacutes comprobar se combinanmuy bien por eso hemos incluido estos dos recursos de Java en un mismo capiacutetulo

155

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 156

111 Lectura de un fichero de texto

Aunque Java puede manejar tambieacuten ficheros binarios vamos a centrarnos exclusi-vamente en la utilizacioacuten de ficheros de texto Los ficheros de texto tienen una granventaja se pueden crear y manipular mediante cualquier editor como por ejemploGEditSiempre que vayamos a usar ficheros deberemos incluir al principio del programa unao varias liacuteneas para cargar las clases necesarias Anque se pueden cargar varias clasesen una sola liacutenea usando el asterisco de la siguiente manera

import javaio

nosotros no lo haremos asiacute ya que nuestro coacutedigo sigue las normas del estaacutendar deGoogle y estas normas lo prohiben taxativamente Se importaraacuten las clases usandovarias liacuteneas una liacutenea por cada clase que se importa en el programa de esta forma

import javaioBufferedReaderimport javaioFileReader

No es necesario saber de memoria los nombres de las clases el entorno de desarrolloNetbeans detecta queacute clases hacen falta cargar y antildeade los import de forma automaacute-ticaTodas las operaciones que se realicen sobre ficheros deberaacuten estar incluidas en unbloque try-catch Esto nos permitiraacute mostrar mensajes de error y terminar el programade una forma ordenada en caso de que se produzca alguacuten fallo - el fichero no existeno tenemos permiso para acceder a eacutel etcEl bloque try-catch tiene el siguiente formato

try

Operaciones_con_fichero

catch (tipo_de_error nombre_de_variable)

Mensaje_de_error

Tanto para leer como para escribir utilizamos lo que en programacioacuten se llama unldquomanejador de ficherordquo Es algo asiacute como una variable que hace referencia al ficherocon el que queremos trabajarEn nuestro ejemplo el manejador de fichero se llama bf y se crea de la siguientemanera

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 157

BufferedReader bf = new BufferedReader(new FileReader(malaga1txt))

El fichero con el que vamos a trabajar tiene por nombre malaga1txt y contieneinformacioacuten extraiacuteda de la Wikipedia sobre la bonita ciudad de Maacutelaga1 A partir deaquiacute siempre que queramos realizar una operacioacuten sobre ese archivo utilizaremos sumanejador de fichero asociado es decir bfEn el ejemplo que se muestra a continuacioacuten el programa lee el contenido del ficheromalaga1txt y lo muestra tal cual en pantalla igual que si hicieacuteramos en una ventanade terminal cat malaga1txtObserva que se va leyendo el fichero liacutenea a liacutenea mediante bfreadLine() hasta que seacaban las liacuteneas Cuando no quedan maacutes liacuteneas por leer se devuelve el valor null

Ejemplo de uso de la clase File Lectura de un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileNotFoundExceptionimport javaioFileReaderimport javaioIOException

class EjemploFichero01

public static void main(String[] args)

try

BufferedReader bf = new BufferedReader(new FileReader(malaga1txt))

String linea =

while (linea = null)

Systemoutprintln(linea)

linea = bfreadLine()

bfclose()

catch (FileNotFoundException e) queacute hacer si no se encuentra el ficheroSystemoutprintln(No se encuentra el fichero malagatxt)

catch (IOException e) queacute hacer si hay un error en la lectura del fichero

1httpeswikipediaorgwikiMC3A1laga

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 158

Systemoutprintln(No se puede leer el fichero malagatxt)

Es importante ldquocerrar el ficherordquo cuando se han realizado todas las operacionesnecesarias sobre eacutel En este ejemplo esta accioacuten se ha llevado a cabo con la sentenciabfclose()A continuacioacuten se muestra un programa un poco maacutes complejo Se trata de unaaplicacioacuten que pide por teclado un nombre de fichero Previamente en ese fichero(por ejemplo numerostxt) habremos introducido una serie de nuacutemeros a razoacuten de unopor liacutenea Se podriacutean leer tambieacuten los nuacutemeros si estuvieran separados por comaso espacios aunque seriacutea un poco maacutes complicado (no mucho maacutes) Los nuacutemerospueden contener decimales ya que se van a leer como Double Cada nuacutemero que selee del fichero se va sumando de tal forma que la suma total estaraacute contenida en lavariable suma a la par se va llevando la cuenta de los elementos que se van leyendoen la variable i Finalmente dividiendo la suma total entre el nuacutemero de elementosobtenemos la media aritmeacutetica de los nuacutemeros contenidos en el fichero

Ejemplo de uso de la clase File Calcula la media de los nuacutemeros que se encuentran en un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileReaderimport javaioIOException

class EjemploFichero08

public static void main(String[] args)

Systemoutprint(Introduzca el nombre del archivo donde se encuentran los nuacutemeros )

String nombreFichero = Systemconsole()readLine()

try

BufferedReader bf = new BufferedReader(new FileReader(nombreFichero))

String linea = 0

int i = 0

double suma = 0

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 159

while (linea = null)

i++

suma += DoubleparseDouble(linea)

linea = bfreadLine()

i--

bfclose()

Systemoutprintln(La media es + suma (double)i)

catch (IOException e)

Systemoutprintln(egetMessage())

112 Escritura sobre un fichero de texto

La escritura en un fichero de texto es si cabe maacutes faacutecil que la lectura Solo hay quecambiar Systemoutprint(texto) por manejadorwrite(texto) Se pueden incluir saltosde liacutenea tabuladores y espacios igual que al mostrar un mensaje por pantallaEs importante ejecutar close() despueacutes de realizar la escritura de esta manera nosaseguramos que se graba toda la informacioacuten en el discoAl realizar escrituras en ficheros con Java hay que tener ciertas precauciones Cuandotoca dar este tema en clase es frecuente que a maacutes de un alumno le empiece a irlento el ordenador luego se le queda inutilizado y por uacuteltimo ni siquiera le arrancaiquestqueacute ha pasado Pues que ha estado escribiendo datos en ficheros y por alguna razoacutensu programa se ha metido en un bucle infinito lo que da como resultado cuelgues yficheros de varios gigabytes de basura Por eso es muy importante asegurarse biende que la informacioacuten que se va a enviar a un fichero es la correcta iquestcoacutemo muy faacutecilenviaacutendola primero a la pantalla

Primero a pantalla y luego a ficheroEnviacutea primero a la pantalla todo lo que quieras escribir en el fichero Cuandocompruebes que lo que se ve por pantalla es realmente lo que quieres grabaren el fichero entonces y solo entonces cambia Systemoutprint(texto) pormanejadorwrite(texto)

A continuacioacuten se muestra un programa de ejemplo que crea un fichero de texto yluego esribe en eacutel tres palabras una por cada liacutenea

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 160

Ejemplo de uso de la clase File Escritura en un fichero de texto author Luis Joseacute Saacutenchez

import javaioBufferedWriterimport javaioFileWriterimport javaioIOException

class EjemploFichero02

public static void main(String[] args)

try

BufferedWriter bw = new BufferedWriter(new FileWriter(frutatxt))

bwwrite(naranjan)

bwwrite(mangon)

bwwrite(chirimoyan)

bwclose()

catch (IOException ioe)

Systemoutprintln(No se ha podido escribir en el fichero)

113 Lectura y escritura combinadas

Las operaciones de lectura y escritura sobre ficheros se pueden combinar de tal formaque haya un flujo de lectura y otro de escritura uno de lectura y dos de escritura tresde lectura etcEn el ejemplo que presentamos a continuacioacuten hay dos flujos de lectura y uno deescritura Observa que se declaran en total tres manejadores de fichero (dos paralectura y uno para escritura) El programa va leyendo de forma alterna una liacutenea decada fichero - una liacutenea de fichero1txt y otra liacutenea de fichero2txt - mientras quedenliacuteneas por leer en alguno de los ficheros y al mismo tiempo va guardando esas liacuteneasen otro fichero con nombre mezclatxt

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 161

Ejemplo de uso de la clase File Mezcla de dos ficheros author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioBufferedWriterimport javaioFileReaderimport javaioFileWriterimport javaioIOException

class EjemploFichero03

public static void main(String[] args)

try

BufferedReader bf1 = new BufferedReader(new FileReader(fichero1txt))

BufferedReader bf2 = new BufferedReader(new FileReader(fichero2txt))

BufferedWriter bw = new BufferedWriter(new FileWriter(mezclatxt))

String linea1 =

String linea2 =

while ( (linea1 = null) || (linea2 = null) )

linea1 = bf1readLine()

linea2 = bf2readLine()

if (linea1 = null) bwwrite(linea1 + n)

if (linea2 = null) bwwrite(linea2 + n)

bf1close()

bf2close()

bwclose()

catch (IOException ioe)

Systemoutprintln(Se ha producido un error de lecturaescritura)

Systemerrprintln(ioegetMessage())

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 162

114 Otras operaciones sobre ficheros

Ademaacutes de leer desde o escribir en un fichero hay otras operaciones relacionadas conlos archivos que se pueden realizar desde un programa escrito en JavaVeremos tan solo un par de ejemplos Si quieres profundizar maacutes eacutechale un vistazo ala documentacioacuten oficial de la clase File2El siguiente ejemplo muestra por pantalla un listado con todos los archivos quecontiene un directorio

Ejemplo de uso de la clase File Listado de los archivos del directorio actual author Luis Joseacute Saacutenchez

import javaioFile

class EjemploFichero04

public static void main(String[] args)

File fichero = new File() se indica la ruta entre comillas el punto () es el directorio actual

String[] listaArchivos = ficherolist()

for(int i = 0 i lt listaArchivoslength i++)

Systemoutprintln(listaArchivos[i])

El siguiente programa de ejemplo comprueba si un determinado archivo existe ono mediante exists() y en caso de que exista lo elimina mediante delete() Siintentaacuteramos borrar un archivo que no existe obtendriacuteamos un error

2httpdocsoraclecomjavase7docsapijavaioFilehtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 163

Ejemplo de uso de la clase File Comprobacioacuten de existencia y borrado de un fichero author Luis Joseacute Saacutenchez

import javaioFile

class EjemploFichero05

public static void main(String[] args)

Systemoutprint(Introduzca el nombre del archivo que desea borrar )

String nombreFichero = Systemconsole()readLine()

File fichero = new File(nombreFichero)

if (ficheroexists())

ficherodelete()

Systemoutprintln(El fichero se ha borrado correctamente)

else

Systemoutprintln(El fichero + nombreFichero + no existe)

115 Paso de argumentos por liacutenea de comandos

Como dijimos al comienzo de este capiacutetulo el paso de argumentos por liacutenea decomandos no estaacute directamente relacionado con los ficheros aunque es muy frecuentecombinar estos dos recursosSeguro que has usado muchas veces el paso de argumentos por liacutenea de comandossin saberlo Por ejemplo si tecleas el siguiente comando en una ventana de terminal

$ head -5 etcbashbashrc

se muestran por pantalla las 5 primeras liacuteneas del fichero bashbashrc que se encuentraen el directorio etc En este caso head es el nombre del programa que estamosejecutando y los valores -5 y etcbashbashrc son los argumentosVolvamos al comienzo al primer capiacutetulo iquestRecuerdas coacutemo ejecutaste tu primerprograma en Java iexclQueacute tiempos aqueacutellos El programa HolaMundo se ejecutaba asiacute

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 164

$ java HolaMundo

Para probar los ejemplos que te presentamos maacutes adelante deberaacutes hacer lo mismo yademaacutes antildeadir a continuacioacuten y separados por espacios los argumentos que quieresque lea el programa Vamos a verlo en detalleEl siguiente programa de ejemplo simplemente muestra por pantalla los argumentosintroducidos Compila el programa y prueba a ejecutar lo siguiente

$ java EjemploArgumentos06 hola que tal 24 12 fin

con lo que obtendraacutes el siguiente resultado

Los argumentos introducidos son

hola

que

tal

24

12

fin

Los argumentos han pasado al programa en virtud del paraacutemetro que incluimos en laliacutenea del main

public static void main(String[] args)

Fiacutejate en lo que hay entre pareacutentesis String[] args Se trata de un array de cadenasde caracteres (String) donde cada uno de los elementos seraacute un argumento que se hapasado como paraacutemetro Si has ejecutado el ejemplo tal y como se ha indicado args[0]vale ldquoholardquo args[1] vale ldquoquerdquo args[2] vale ldquotalrdquo args[3] vale ldquo24rdquo args[4] vale ldquo12rdquo yargs[5] vale ldquofinrdquo

Paso de argumentos en la liacutenea de comandos author Luis Joseacute Saacutenchez

class EjemploArgumentos06

public static void main(String[] args)

Systemoutprintln(Los argumentos introducidos son )

for (int i = 0 i lt argslength i++)

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 165

Systemoutprintln(args[i])

Hagamos algo un poco maacutes uacutetil con los argumentos En el siguiente ejemplo se sumantodos los argumentos que se pasan como paraacutemetros y se muestra por pantalla elresultado de la sumaDespueacutes de compilar deberaacutes ejecutar desde una ventana de terminal lo siguiente(puedes cambiar los nuacutemeros si quieres)

$ java EjemploArgumentos07 10 36 44

con lo que obtendraacutes este resultado

90

es decir la suma de los nuacutemeros que has pasado como paraacutemetros

Paso de argumentos en la liacutenea de comandos author Luis Joseacute Saacutenchez

class EjemploArgumentos07

public static void main(String[] args)

int suma = 0

for (int i = 0 i lt argslength i++)

suma += IntegerparseInt(args[i])

Systemoutprintln(suma)

Observa que el programa convierte en nuacutemeros enteros todos y cada uno de losargumentos mediante el meacutetodo IntegerparseInt() para poder sumarlos

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 166

Los argumentos recogidos por liacutenea de comandos se guardan siempre enun array de String Cuando sea necesario realizar operaciones matemaacuteticascon esos argumentos habriacutea que convertirlos al tipo adecuado medianteIntegerparseInt() o DoubleparseDouble()

116 Combinacioacuten de ficheros y paso de argumentos

Llegoacute el momento de combinar las operaciones con ficheros con el paso de paraacutemetrospor liacutenea de comandos El ejemplo que mostramos a continuacioacuten es parecido al quehemos visto en el apartado anterior calcula la media de una serie de nuacutemeros peroesta vez esos nuacutemeros se leen desde un fichero y lo que se pasa como paraacutemetro por laliacutenea de comandos es precisamente el nombre del fichero donde estaacuten esos nuacutemerosCrea un fichero y noacutembralo numerostxt e introduce los siguientes nuacutemeros (es impor-tante que esteacuten separados por un salto de liacutena para que el programa funcione bien)

25

100

44

17

6

8

A continuacioacuten compila el programa de ejemplo EjemploFichero09java y teclea losiguiente en la ventana de terminal

$ java EjemploFichero09 numerostxt

Apareceraacute el siguiente resultado

La media es 33333333333333336

Ejemplo de uso de la clase File Calcula la media de los nuacutemeros que se encuentran en un fichero de texto El nombre del fichero se pasa como argumento en la liacutenea de comandos author Luis Joseacute Saacutenchez

import javaioBufferedReaderimport javaioFileReader

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 167

import javaioIOException

class EjemploFichero09

public static void main(String[] args)

if (argslength = 1)

Systemoutprintln(Este programa calcula la media de los nuacutemeros contenidos en un f

ichero)

Systemoutprintln(Uso del programa java EjemploFichero09 FICHERO)

Systemexit(-1) sale del programa

try

BufferedReader bf = new BufferedReader(new FileReader(args[0]))

String linea = 0

int i = 0

double suma = 0

while (linea = null)

i++

suma += DoubleparseDouble(linea)

linea = bfreadLine()

i--

bfclose()

Systemoutprintln(La media es + suma(double)i)

catch (IOException e)

Systemoutprintln(egetMessage())

Observa que el programa comprueba el nuacutemero de argumentos que se pasan por laliacutenea de comandos mediante if (argslength = 1) y si este nuacutemero es distinto de 1muestra este mensaje

Este programa calcula la media de los nuacutemeros contenidos en un fichero

Uso del programa java EjemploFichero09 FICHERO

y sale del programa De esta manera el usuario sabe exactamente coacutemo hay queutilizar el programa y coacutemo hay que pasarle la informacioacuten

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 168

117 Procesamiento de archivos de texto

La posibilidad de realizar desde Java operaciones con ficheros abre muchas posibili-dades a la hora de procesar archivos cambiar una palabra por otra eliminar ciertoscaracteres mover de sitio una liacutenea o una palabra borrar espacios o tabulaciones alfinal de las liacuteneas o cualquier otra cosa que se nos pueda ocurrirCuando se procesa un archivo de texto los pasos a seguir son los siguientes

1 Leer una liacutenea del fichero origen mientras quedan liacuteneas por leer2 Modificar la liacutenea (normalmente utilizando los meacutetodos que ofrece la clase String)3 Grabar la liacutenea modificada en el fichero destino4 Volver al paso 1

A continuacioacuten tienes algunos meacutetodos de la clase String que pueden resultar muyuacutetiles para procesar archivos de texto

bull charAt(int n) Devuelve el caraacutecter que estaacute en la posicioacuten n-eacutesima de la cadenaRecuerda que la primera posicioacuten es la nuacutemero 0

bull indexOf(String palabra) Devuelve un nuacutemero que indica la posicioacuten en la quecomienza una palabra determinada

bull length() Devuelve la longitud de la cadenabull replace(char c1 char c2) Devuelve una cadena en la que se han cambiado

todas las ocurrencias del caraacutecter c1 por el caraacutecter c2bull substring(int inicioint fin) Devuelve una subcadenabull toLowerCase() Convierte todas las letras en minuacutesculasbull toUpperCase() Convierte todas las letras en mayuacutesculas

Puedes consultar todos los meacutetodos de la clase String en la documentacioacuten oficial3A continuacioacuten tienes un ejemplo en el que se usan los meacutetodos descritos anterior-mente

Ejemplos de uso de String author Luis Joseacute Saacutenchez

public class EjemplosString

public static void main(String[] args)

Systemoutprintln(nEjemplo 1)

Systemoutprintln(En la posicioacuten 2 de berengena estaacute la letra

3httpdocsoraclecomjavase7docsapijavalangStringhtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 169

+ berengenacharAt(2))

Systemoutprintln(nEjemplo 2)

String frase = Hola caracola

char[] trozo = new char[10]trozo[0] = z trozo[1] = z trozo[2] = z

frasegetChars(2 7 trozo 1)

Systemoutprint(El array de caracteres vale )

Systemoutprintln(trozo)

Systemoutprintln(nEjemplo 3)

Systemoutprintln(La secuencia co aparece en la frase en la posicioacuten

+ fraseindexOf(co))

Systemoutprintln(nEjemplo 4)

Systemoutprintln(La palabra murcieacutelago tiene

+ murcieacutelagolength() + letras)

Systemoutprintln(nEjemplo 5)

String frase2 = frasereplace(o u)

Systemoutprintln(frase2)

Systemoutprintln(nEjemplo 6)

frase2 = frasesubstring(3 10)

Systemoutprintln(frase2)

Systemoutprintln(nEjemplo 7)

Systemoutprintln(frasetoLowerCase())

Systemoutprintln(nEjemplo 8)

Systemoutprintln(frasetoUpperCase())

A continuacioacuten se muestra un programa que procesa archivos de texto Lo que hacees cambiar cada tabulador por dos espacios en blanco Lo hice a propoacutesito cuandoestaba escribiendo este manual ya que el estaacutendar de Google para la codificacioacuten enJava4 especifica que la sangriacutea debe ser precisamente de dos espacios Teniacutea muchosprogramas escritos en Java (ejemplos y soluciones a ejercicios) que no cumpliacutean esterequisito porque la sangriacutea estaba aplicada con el caraacutecter de tabulacioacuten teniacutea dosposibilidades abrir todos y cada uno de los ficheros y cambiarlo a mano o escribir unprograma que lo hiciera Opteacute por la segunda opcioacuten y aquiacute tienes el programa iquestverdadque es muy sencillo

4httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 170

import javaioBufferedReaderimport javaioBufferedWriterimport javaioFileimport javaioFileReaderimport javaioFileWriterimport javaioIOException

Cambia los tabuladores por 2 espacios author Luis Joseacute Saacutenchez

public class EjemploProcesamiento10

public static void main(String[] args)

for (int i = 0 i lt argslength i++)

Systemoutprint(Procesando el archivo + args[i] + )

try

renombra el fichero antildeadiendo tmpFile ficheroOriginal = new File(args[i])

File ficheroTemporal = new File(args[i] + tmp)

ficheroOriginalrenameTo(ficheroTemporal)

lee los datos del archivo temporalBufferedReader bf = new BufferedReader(new FileReader(args[i] + tmp))

crea un fichero nuevo con el nombre originalBufferedWriter bw = new BufferedWriter(new FileWriter(args[i]))

String linea =

while ( linea = null )

linea = bfreadLine()

if (linea = null)

cambia el tabulador por 2 espacioslinea = lineareplace(t )

bwwrite(linea + n)

bfclose()

bwclose()

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 171

borra el fichero temporalficheroTemporaldelete()

catch (IOException ioe)

Systemoutprintln(Se ha producido un error de lecturaescritura)

Systemerrprintln(ioegetMessage())

Systemoutprintln(hecho)

118 Ejercicios

Ejercicio 1Escribe un programa que guarde en un fichero con nombre primosdat losnuacutemeros primos que hay entre 1 y 500

Ejercicio 2Realiza un programa que lea el fichero creado en el ejercicio anterior y quemuestre los nuacutemeros por pantalla

Ejercicio 3Escribe un programa que guarde en un fichero el contenido de otros dosficheros de tal forma que en el fichero resultante aparezcan las liacuteneas de losprimeros dos ficheros mezcladas es decir la primera liacutenea seraacute del primerfichero la segunda seraacute del segundo fichero la tercera seraacute la siguiente delprimer fichero etcLos nombres de los dos ficheros origen y el nombre del fichero destino se debenpasar como argumentos en la liacutenea de comandosHay que tener en cuenta que los ficheros de donde se van cogiendo las liacuteneaspueden tener tamantildeos diferentes

Ficheros de texto y paso de paraacutemetros por liacutenea de comandos 172

Ejercicio 4Realiza un programa que sea capaz de ordenar alfabeacuteticamente las palabrascontenidas en un fichero de texto El nombre del fichero que contiene laspalabras se debe pasar como argumento en la liacutenea de comandos El nombredel fichero resultado debe ser el mismo que el original antildeadiendo la coletillasort por ejemplo palabras_sorttxt Suponemos que cada palabra ocupa unaliacutenea

Ejercicio 5Escribe un programa capaz de quitar los comentarios de un programa de JavaSe utilizariacutea de la siguiente maneraquita_commentarios PROGRAMA_ORIGINAL PROGRAMA_LIMPIO

Por ejemploquita_comentarios holajava holav2java

crea un fichero con nombre holav2java que contiene el coacutedigo de holajava perosin los comentarios

Ejercicio 6Realiza un programa que diga cuaacutentas ocurrencias de una palabra hay en unfichero Tanto el nombre del fichero como la palabra se deben pasar comoargumentos en la liacutenea de comandos

12 Aplicaciones web en Java (JSP)Hasta el momento los programas realizados funcionan en una austera ventana determinal No se trata de algo casual hemos elegido esta manera de trabajar de formadeliberada para que el estudiante se centre en resolver el problema y no se distraigadaacutendole sombra a un botoacuten o escogiendo la mejor imagen de fondo para un listadoLlegamos no obstante a un punto en que algunos programas piden a gritos unaapariencia maacutes vistosaEn este capiacutetulo vamos a aprender coacutemo utilizar paacuteginas web como interfaz paraprogramas en Java Usaremos JSP (JavaServer Pages) que nos permitiraacute mezclar coacutedigoen Java con coacutedigo HTML El coacutedigo en Java que utilizaremos seraacute muy parecido alque hemos venido utilizando hasta ahora Cambiaraacute uacutenicamente lo relativo a mostrarinformacioacuten por pantalla (ahora se volcaraacute todo a HTML) y la manera en que seintroducen los datos que se realizaraacute mediante formularios

El lector deberaacute tener unos conocimientos baacutesicos de HTML para entender bieny sacar provecho de este capiacutetulo Una web excelente para aprender HTML esW3Schools1

El estaacutendar de programacioacuten de Google para el coacutedigo fuente escrito en Java2 noespecifica ninguna regla en cuanto a la manera de nombrar los ficheros correspon-dientes a las aplicaciones JSP Por tanto vamos a adoptar las convenciones de Oracle3

en esta materia Seguacuten estas convenciones los nombres de los ficheros JSP debenestar escritos en lowerCamelCase es decir la primera letra siempre es minuacutesculay en caso de utilizar varias palabras dentro del nombre eacutestas van seguidas unade otra empezando cada una por mayuacutescula Finalmente se antildeade la extensioacuten jspPor ejemplo listadoSociosjsp es un nombre correcto mientras que ListadoSociosjsplistado_sociosjsp o Listadosociosjsp son incorrectos

121 Hola Mundo en JSP

Para desarrollar aplicaciones en JSP utilizaremos el entorno de desarrollo NetbeansEste IDE se puede descargar de forma gratuita en httpsnetbeansorgdownloadsnota12_-14

Sigue estos pasos para crear una aplicacioacuten en JSP con Netbeans1httpw3schoolscom2httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml3httpwwworaclecomtechnetworkarticlesjavasecode-convention-138726html4ParamaacutesdetallessobrelainstalacioacutenyconfiguracioacutendeNetbeansverel[ApeacutendiceB](apendiceb)

173

Aplicaciones web en Java (JSP) 174

bull En el menuacute principal selecciona Archivo y a continuacioacuten Nuevo Proyecto Sepuede hacer maacutes raacutepido con la combinacioacuten Control + Mayuacutescula + N

bull Apareceraacute una ventana emergente para elegir el tipo de proyecto SeleccionaJava Web en el apartado ldquoCategoriacuteasrdquo y Aplicacioacuten Web en el apartadoldquoProyectosrdquo Haz clic en Siguiente

bull Ahora hay que darle el nombre al proyecto lo puedes llamar por ejemploSaludo1 Recuerda no utilizar caracteres especiales ni signos de puntuacioacuten Secrearaacute una carpeta con el mismo nombre que el proyecto que contendraacute todoslos ficheros necesarios Haz clic en Siguiente

bull En la siguiente ventana tendraacutes que elegir el servidor la versioacuten de Java y laruta Elige Glass Fish Server En caso de no haber ninguacuten servidor disponibleNetbeans permite antildeadir uno sobre la marcha (se lo descarga y lo instala) Hazclic en Finalizar

A la izquierda en la ventana de proyectos debe aparecer el que acabas de crearSaludo1 Navegando por la estructura del proyecto veraacutes que hay una carpeta connombre Web Pages en esta carpeta se deberaacuten guardar los archivos correspondien-tes a la aplicacioacuten archivos jsp html css imaacutegenes archivos de audio etc Para quelos archivos esteacuten ordenados se pueden organizar a su vez en subcarpetas dentrode Web PagesPor defecto cuando se crea un proyecto JSP se crea el archivo indexhtml Elimina estearchivo de tu proyecto y luego crea indexjsp haciendo clic con el botoacuten derecho enWeb Pages rarr Nuevo rarr JSP Al indicar el nombre no hay que poner la extensioacutenYa tienes un ldquoHola Mundordquo en ingleacutes Si lo quieres en espantildeol solo tienes que cambiarldquoHello Worldrdquo por ldquoHola Mundordquo con lo que la aplicacioacuten quedariacutea como sigue

lt-- saludo1jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Mundolth1gt

En esta paacutegina se usa uacutenicamente HTML

ltbodygt

lthtmlgt

Para ejecutar la aplicacioacuten hay que hacer clic en el botoacuten verde Ejecutar Proyecto opulsar F6 En ese momento Netbeans buscaraacute un fichero con el nombre indexjsp ylo lanzaraacute en el navegador

Aplicaciones web en Java (JSP) 175

Observa que el programa del ejemplo se llama saludo1jsp y no indexjsp En estecaso para ejecutar la aplicacioacuten hay que hacer clic con el botoacuten derecho encima desaludo1jsp y seleccionar EjecutarDe momento solo hemos visto coacutedigo HTML iquestdoacutende estaacute Java Bien vamos a verlopero antes hay entender bien coacutemo funciona JSPUna aplicacioacuten JSP consistiraacute en una o varias paacuteginas web que normalmente contendraacutecoacutedigo HTML y que llevaraacuten ldquoinsertadordquo coacutedigo en Java Este coacutedigo en Java puedecolocarse en cualquier parte del archivo y se delimita mediante las etiquetas lt y gtCuando se pulsa F6 para ejecutar la aplicacioacuten sucede lo siguiente

1 Todo el coacutedigo (tanto HTML como JAVA) se enviacutea al servidor (Glass Fish o ApacheTomcat por ejemplo)

2 El servidor deja intacto el coacutedigo HTML y compila y ejecuta el coacutedigo en JavaGeneralmente el coacutedigo Java genera coacutedigo HTML mediante las instruccionesoutprint y outprintln

3 Por uacuteltimo todo el coacutedigo (ya solo queda HTML) se enviacutea al navegador que es elque muestra la paacutegina Recuerda que el navegador no entiende Java (entiendeJavascript que es otro lenguaje diferente) y es imprescindible que todo el coacutedigoJava haya sido traducido previamente

122 Mezclando Java con HTML

A continuacioacuten se muestra un ejemplo que siacute tiene Java Como ves el coacutedigo Java estaacutedelimitado por los caracteres lt y gt

lt-- saludo2jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt outprintln(lth1gtiexclHola Mundolth1gt) gt

ltbodygt

lthtmlgt

Mediante Java se puede generar cualquier contenido HTML por ejemplo para modi-ficar estilos crear tablas mostrar imaacutegenes etc Trabajando en consola lo que seincluye en un print es exactamente lo que se muestra por pantalla Ahora con JSP loque se incluye dentro del print es ldquorenderizadordquo a posteriori por el navegador En elsiguiente ejemplo se puede ver claramente este comportamiento

Aplicaciones web en Java (JSP) 176

lt-- saludo3jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Caracolalth1gt

lt outprint(ltbgtltigt) gt

Esta liacutenea se ha puesto en negrita y cursiva mediante Java

lt outprint(ltigtltbgt) gt

ltbodygt

lthtmlgt

Es muy uacutetil ver el coacutedigo fuente que se ha generado una vez que se puede visualizarla aplicacioacuten en el navegador Para ver el coacutedigo fuente tanto en Firefox como enChrome hay que hacer clic con el botoacuten derecho en la paacutegina y seleccionar la opcioacutenldquoVer coacutedigo fuente de la paacuteginardquoCuando el contenido que se quiere volcar en HTML es el resultado de una expresioacutense pueden utilizar de forma opcional las etiquetas lt= y gt

lt-- saludo4jsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtiexclHola Caracolalth1gt

lt= ltbgtltigt gt

Esta liacutenea se ha puesto en negrita y cursiva mediante Java

lt= ltigtltbgt gt

ltbodygt

lthtmlgt

En el coacutedigo Java que se inserta en las aplicaciones JSP se pueden utilizar todos loselemento del lenguaje vistos anteriormente bucles sentencias de control arraysdiccionarios etcEn el siguiente ejemplo se utiliza un bucle for para mostrar texto en diferentestamantildeos utilizando las etiquetas desde la lth6gt (cabecera pequentildea) hasta la lth1gt

(cabecera maacutes grande)

Aplicaciones web en Java (JSP) 177

lt-- pruebaVariable1 --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

for (int i = 1 i lt 7 i++)

outprintln(lth + (7-i) + gt+ i + lth + (7-i) + gt)

gt

ltbodygt

lthtmlgt

El coacutedigo en Java se puede insertar en cualquier parte dentro del coacutedigo HTML eincluso se pueden insertar varios trozos como se puede ver en el siguiente ejemploAunque una variable se haya definido en una determinada zona su aacutembito deactuacioacuten no se ve reducido a ese fragmento de coacutedigo sino que se puede utilizarposteriormente en otro lugar de la aplicacioacutenObserva que en el siguiente ejemplo la definicioacuten e inicializacioacuten de la variable x serealiza en un bloque de coacutedigo en Java y que luego esta variable se utiliza en otros dosbloques diferentes

lt-- pruebaVariable2 --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt int x = 3 gt

lthlt outprint(x) gtgtholalthlt outprint(x) gtgt

ltbodygt

lthtmlgt

En ocasiones puede ser uacutetil recabar informacioacuten del sistema versioacuten de Java en usosistema operativo nombre de usuario etc Estos datos se pueden obtener medianteSystemgetProperty(propiedad)

Aplicaciones web en Java (JSP) 178

lt-- muestraInfojsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lth1gtInformacioacuten del entorno de trabajolth1gt

lt

outprint(Fabricante de Java + SystemgetProperty(javavendor))

outprint(ltbrgtUrl del fabricante + SystemgetProperty(javavendorurl))

outprint(ltbrgtVersioacuten + SystemgetProperty(javaversion))

outprint(ltbrgtSistema operativo + SystemgetProperty(osname))

outprint(ltbrgtUsuario + SystemgetProperty(username))

gt

ltbodygt

lthtmlgt

Para mostrar informacioacuten en una paacutegina de forma ordenada es muy frecuente utilizartablas Las tablas son especialmente uacutetiles para mostrar listados obtenidos de unabase de datos como veremos en el siguiente capiacutetuloEn el siguiente ejemplo se muestra una tabla con dos columnas en la primera columnase muestran los nuacutemeros del 0 al 9 y en la segunda sus correspondientes cuadrados

lt-- tablajsp --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltbodygt

lth1gtEjemplo de tablalth1gt

lttable border=2gt

lttrgt

lttdgtNuacutemerolttdgtlttdgtCuadradolttdgt

lttrgt

lt

for(int i = 0 i lt 10 i++)

outprintln(lttrgt)

outprintln(lttdgt + i + lttdgt)

outprintln(lttdgt)

outprintln(i i)

outprintln(lttdgtlttrgt)

Aplicaciones web en Java (JSP) 179

gt

lttablegt

ltbodygt

lthtmlgt

123 Recogida de datos en JSP

En cualquier aplicacioacuten web la introduccioacuten de datos se realiza mediante formulariosAunque se puede hacer todo en la misma paacutegina de momento vamos a tener dos Laprimera paacutegina contendraacute un formulario y seraacute la encargada de recoger la informacioacuteny enviarla a una segunda paacutegina Esta uacuteltima paacutegina recibiraacute los datos realizaraacute unaserie de caacutelculos u operaciones si procede y por uacuteltimo mostraraacute un resultadoEn el primer ejemplo - un proyecto que llamaremos PasoDeCadena - tenemos una paacuteginacon nombre indexjsp que contiene un formulario HTML Este formulario contiene unaentrada de texto donde el usuario introduciraacute una cadena de caracteres Es muyimportante darle un valor a la etiqueta name En el caso que nos ocupa tenemosname=cadenaIntro por tanto el dato que recoge el formulario se llama de esa maneraseriacutea el equivalente al nombre de la variable en Java No menos importante es indicarla paacutegina que recibiraacute los datos que recoge el formulario Esta informacioacuten se indicacon la etiqueta action en nuestro ejemplo action=frasejsp indica que seraacute el ficherofrasejsp el que recibiraacute cadenaIntroEl fichero indexjsp uacutenicamente contiene coacutedigo HTML por tanto se podriacutea llamarindexhtml y la aplicacioacuten funcionariacutea exactamente igual

lt-- indexjsp (proyecto PasoDeCadena) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtPaso de cadenalttitlegt

ltheadgt

ltbodygt

lth1gtPasando una cadena de caractereslth1gt

ltform method=post action=frasejspgt

Introduzca el nombre de una fruta

ltinput type=text name=cadenaIntrogt

ltinput type=submit value=OKgt

ltformgt

ltbodygt

lthtmlgt

Para recoger los datos enviados por un formulario se utiliza requestgetParameter(nombreDeVariable)

donde nombreDeVariable es el dato que se enviacutea desde el formulario En caso de que el

Aplicaciones web en Java (JSP) 180

dato enviado sea un texto que pueda contener tildes o entildees hay que especificar lacodificacioacuten mediante requestsetCharacterEncoding(UTF-8) antes de recoger el dato

lt-- frasejsp (proyecto PasoDeCadena) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtPaso de cadenalttitlegt

ltheadgt

ltbodygt

lt requestsetCharacterEncoding(UTF-8) gt

Me gusta mucho comer

lt outprint(requestgetParameter(cadenaIntro))gt

ltbodygt

lthtmlgt

En el siguiente ejemplo llamado Incrementa5 se muestra coacutemo manipular en JSP un datonumeacuterico La aplicacioacuten recoge un nuacutemero y luego muestra ese nuacutemero incrementadoen 5 unidades

lt-- indexjsp (proyecto Incrementa5) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

ltform method=get action=incrementa5jspgt

Introduzca un nuacutemero (puede tener decimales)

ltinput type=text name=numeroIntrogt

ltinput type=submit value=OKgt

ltformgt

ltbodygt

lthtmlgt

Observa en el fichero incrementa5jsp coacutemo se transforma la cadena de caracteresque se recibe en numeroIntro en un dato numeacuterico con el meacutetodo DoubleparseDoubleexactamente igual que si estuvieacuteramos leyendo un nuacutemero desde teclado en laventana de terminal

Aplicaciones web en Java (JSP) 181

lt-- incrementa5jsp (proyecto Incrementa5) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

El nuacutemero introducido maacutes cinco es

lt

double resultado

resultado = DoubleparseDouble(requestgetParameter(numeroIntro)) + 5

outprint(resultado)

gt

ltbodygt

lthtmlgt

El siguiente ejemplo ilustra la recogida y enviacuteo de dos variables x e y Observa queahora el formulario contiene dos entradas de texto una para cada variable

lt-- indexjsp (proyecto Suma) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtSumalttitlegt

ltheadgt

ltbodygt

lth1gtSupercalculadoralth1gt

ltform method=get action=resultadojspgt

x ltinput type=text name=xgtltbrgt

y ltinput type=text name=ygtltbrgt

ltinput type=submitgt

ltformgt

ltbodygt

lthtmlgt

En el fichero resultadojsp se reciben las variables recogidas en indexjsp y se sumanRecuerda que por defecto la informacioacuten enviada por un formulario es una cadenade caracteres Si queremos sumar los valores introducidos debemos transformar lascadenas de caracteres a nuacutemeros enteros con el meacutetodo IntegervalueOf()

Aplicaciones web en Java (JSP) 182

lt-- resultadojsp (proyecto Suma) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtSumalttitlegt

ltheadgt

ltbodygt

La suma es

lt

int primerNumero = IntegervalueOf(requestgetParameter(x))

int segundoNumero = IntegervalueOf(requestgetParameter(y))

outprintln(primerNumero + segundoNumero)

gt

ltbodygt

lthtmlgt

El siguiente proyecto de ejemplo es Animales En la paacutegina principal (indexjsp) se puedeseleccionar un animal - gato o caracol - y un nuacutemero Una vez introducidos los datoseacutestos se enviacutean a animalesjsp

lt-- indexjsp (proyecto Animales) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtAnimaleslttitlegt

ltheadgt

ltbodygt

ltform method=post action=animalesjspgt

Seleccione animal a visualizar

ltselect name=animalgt

ltoptiongtGatoltoptiongt

ltoptiongtCaracolltoptiongt

ltselectgt

ltbrgt

Nuacutemero de animales ltinput type=text name=numero size=3gt

ltbrgt

ltinput type=submitgt

ltformgt

ltbodygt

lthtmlgt

Aplicaciones web en Java (JSP) 183

La paacutegina animalesjsp nos mostraraacute una imagen del animal elegido repetida el nuacutemerode veces que hemos indicado

lt-- animalesjsp (proyecto Animales) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtAnimaleslttitlegt

ltheadgt

ltbodygt

lt

String nombreAnimal = requestgetParameter(animal)

String nombreImagen

if (nombreAnimalequals(Gato))

nombreImagen = gatojpg

else

nombreImagen = caracoljpg

int veces = IntegerparseInt(requestgetParameter(numero))

for (int i = 0 i lt veces i++)

outprint(ltimg src= + nombreImagen + width=20gt)

gt

ltbodygt

lthtmlgt

124 POO en JSP

En las aplicaciones realizadas en JSP se puenden incluir clases definidas por el usuariopara posteriormente crear objetos de esas clases Lo habitual es que el fichero quecontiene la definicioacuten de la clase se encuentre separado del programa principalEn un nuevo proyecto con nombre GatosConClase vamos a crear la clase Gato paraello haz clic derecho sobre el icono del proyecto selecciona Nuevo y luego seleccionaClase de Java El nombre de la clase seraacute Gato y el nombre del paquete seraacute porejemplo daw1El fichero Gatojava quedariacutea como el que se muestra a continuacioacuten

Aplicaciones web en Java (JSP) 184

Gatojava (proyecto GatosConClase)

package daw1

public class Gato

private String nombre

private String imagen

public Gato(String nombre String imagen)

thisnombre = nombre

thisimagen = imagen

public String getNombre()

return nombre

public String getImagen()

return imagen

Override

public String toString()

return ltimg src= + imagen + width=80gtHola soy + nombre + ltbrgt

public String maulla()

return ltimg src= + imagen + width=80gtMiauuuuuuuultbrgt

public String come(String comida)

return ltimg src= + imagen + width=80gtEstoy comiendo + comida + ltbrgt

Hemos creado una clase Gato muy sencilla que uacutenicamente contiene dos atributosel nombre del gato y el nombre del fichero de su foto Como meacutetodos se hanimplementado toString() maulla() y come()

Aplicaciones web en Java (JSP) 185

lt-- indexjsp (proyecto GatosConClase) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltpage import=daw1Gatogt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtGatos con claselttitlegt

ltheadgt

ltbodygt

lth1gtGatos con claselth1gt

lthrgt

lt

Gato g1 = new Gato(Pepe gatojpg)

Gato g2 = new Gato(Garfield garfieldjpg)

Gato g3 = new Gato(Tom tompng)

outprintln(g1)

outprintln(g2)

outprintln(g3)

outprintln(g1maulla())

outprintln(g2come(sardinas))

gt

ltbodygt

lthtmlgt

El coacutedigo Java del programa principal es casi ideacutentico al que tendriacuteamos en unprograma para consolaEl siguiente ejemplo - GatosConClaseYBocadillos - es una mejora del anterior Seantildeaden estilos5 para mostrar lo que dicen los gatos igual que en un coacutemic

Gatojava (proyecto GatosConClaseYBocadillos)

package daw1

public class Gato

private String nombre

private String imagen

public Gato(String nombre String imagen)

thisnombre = nombre

thisimagen = imagen

5httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos12_JSPGatosConClaseYBocadillosestiloscss

Aplicaciones web en Java (JSP) 186

public String getNombre()

return nombre

public String getImagen()

return imagen

Override

public String toString()

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspHola soy + nombre + ampnbspltdivgtltdivgt

public String maulla()

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspMiauuuuuuuuampnbspltdivgtltdivgt

public String come(String comida)

return ltdiv class=acciongatogtltimg src= + imagen + width=80gtltdiv class=

arrow_boxgtampnbspEstoy comiendo + comida + ampnbspltdivgtltdivgt

El uacutenico antildeadido al programa principal es una liacutenea situada en la cabecera de la paacuteginaque carga la hoja de estilos estiloscss

lt-- indexjsp (proyecto GatosConClaseYBocadillos) --gt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltpage import=daw1Gatogt

ltDOCTYPE htmlgtlthtmlgt

ltheadgtltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gtlttitlegtGatos con clase y bocadilloslttitlegt

ltlink rel=stylesheet type=textcss href=estiloscss gtltheadgtltbodygtlth1gtGatos con claselth1gtlthrgtlt

Gato g1 = new Gato(Pepe gatojpg)

Aplicaciones web en Java (JSP) 187

Gato g2 = new Gato(Garfield garfieldjpg)

Gato g3 = new Gato(Tom tompng)

outprintln(g1)

outprintln(g2)

outprintln(g3)

outprintln(g1maulla())

outprintln(g2come(sardinas))

gt

ltbodygtlthtmlgt

Aplicaciones web en Java (JSP) 188

125 Ejercicios

Ejercicio 1Crea una aplicacioacuten web en Java que muestre tu nombre y tus datos personalespor pantalla La paacutegina principal debe ser un archivo con la extensioacuten jspComprueba que se lanzan bien el servidor y el navegador web Observa losmensajes que da el servidor Fiacutejate en la direccioacuten que aparece en la barra dedirecciones del navegador

Ejercicio 2Mejora el programa anterior de tal forma que la apariencia de la paacuteginaweb que muestra el navegador luzca maacutes bonita mediante la utilizacioacuten deCSS (utiliza siempre ficheros independientes para CSS para no mezclarlo conHTML)

Ejercicio 3Escribe una aplicacioacuten que pida tu nombre A continuacioacuten mostraraacute ldquoHolardquoseguido del nombre introducido El nombre se deberaacute recoger mediante unformulario

Ejercicio 4Realiza una aplicacioacuten que calcule la media de tres notas

Ejercicio 5Realiza un conversor de euros a pesetas

Ejercicio 6Realiza un conversor de pesetas a euros

Ejercicio 7Combina las dos aplicaciones anteriores en una sola de tal forma que en lapaacutegina principal se pueda elegir pasar de euros a pesetas o de pesetas a eurosAdorna la paacutegina con alguna foto o dibujo

Aplicaciones web en Java (JSP) 189

Ejercicio 8Realiza una aplicacioacuten que pida un nuacutemero y que luego muestre la tabla demultiplicar de ese nuacutemero El resultado se debe mostrar en una tabla (lttablegten HTML)

Ejercicio 9Realiza una aplicacioacuten que pinte una piraacutemide La altura se pediraacute en unformulario La piraacutemide estaraacute hecha de bolitas ladrillos o cualquier otraimagen

Ejercicio 10Realiza un cuestionario con 10 preguntas tipo test sobre las asignaturasque se imparten en el curso Cada pregunta acertada sumaraacute un punto Elprograma mostraraacute al final la calificacioacuten obtenida Paacutesale el cuestionario a tuscompantildeeros y piacutedeles que lo hagan para ver queacute tal andan de conocimientosen las diferentes asignaturas del curso Utiliza radio buttons en las preguntasdel cuestionario

Ejercicio 11Escribe una aplicacioacuten que genere el calendario de un mes Se pediraacute elnombre del mes el antildeo el texto que queremos que aparezca sobre elcalendario el diacutea de la semana en que cae el diacutea 1 y el nuacutemero de diacuteas quetiene el mes

Ejercicio 12Mejora la aplicacioacuten anterior de tal forma que no haga falta introducir el diacuteade la semana en que cae el diacutea 1 y el nuacutemero de diacuteas que tiene el mes Elprograma debe deducir estos datos del mes y el antildeo Pista puedes usar laclase Calendar (javautilCalendar)

Ejercicio 13Transforma el test de infidelidad realizado anteriormente para consola en unaaplicacioacuten web

Aplicaciones web en Java (JSP) 190

Ejercicio 14Escribe un programa que muestre los n primeros teacuterminos de la serie deFibonacci El primer teacutermino de la serie de Fibonacci es 0 el segundo es 1y el resto se calcula sumando los dos anteriores por lo que tendriacuteamos quelos teacuterminos son 0 1 1 2 3 5 8 13 21 34 55 89 144hellip El nuacutemero n sedebe introducir por teclado

Ejercicio 15Realiza una aplicacioacuten que genere 100 nuacutemeros aleatorios del 1 al 200 Losprimos deberaacuten aparecer en un color diferente al resto

Ejercicio 16Realiza una aplicacioacuten que muestre la tirada aleatoria de tres dados de poacutekerUtiliza imaacutegenes de dados reales

Ejercicio 17Realiza un configurador del interior de un vehiacuteculo El usuario puede elegirmediante un formulario el color de la tapiceriacutea ndash blanco negro o berengena -y el material de las molduras ndash madera o carbono Se debe mostrar el interiordel coche tal y como lo quiere el usuario

Ejercicio 18Crea la aplicacioacuten ldquoEl Trilerdquo Deben aparecer tres cubiletes por pantalla y elusuario deberaacute seleccionar uno de ellos Para dicha seleccioacuten se puede usar unformulario con radio-button una lista desplegable hacer clic en el cubilete o loque resulte maacutes faacutecil Se levantaraacuten los tres cubiletes y se veraacute si estaba o nola bolita dentro del que el usuario indicoacute asiacute mismo se mostraraacute un mensajediciendo ldquoLo siento no has acertadordquo o ldquoiexclEnhorabuena has encontrado labolitardquo La probabilidad de encontrar la bolita es de 13

Ejercicio 19Crea el juego ldquoApuesta y ganardquo El usuario debe introducir inicialmente unacantidad de dinero A continuacioacuten apareceraacute por pantalla una imagen deforma aleatoria Si sale una calavera el usuario pierde todo su dinero y terminael juego Si sale medio limoacuten el usuario pierde la mitad del dinero y puedeseguir jugando con esa cantidad o puede dejar de jugar Si sale el gato chinode la suerte el usuario multiplica por dos su dinero y puede seguir jugandocon esa cantidad o puede dejar de jugar

Aplicaciones web en Java (JSP) 191

Ejercicio 20Crea una aplicacioacuten que dibuje un tablero de ajedrez mediante una tabla HTMLgenerada con bucles usando JSP y que situacutee dentro del tablero un alfil y uncaballo en posiciones aleatorias Las dos figuras no pueden estar colocadas enla misma casilla Las filas y las columnas del tablero deben estar etiquetadascorrectamente

13 Acceso a bases de datosEn el capiacutetulo 11 vimos coacutemo almacenar informacion en ficheros de texto de tal formaque esta informacioacuten no se pierde cuando el programa se cierra Normalmente losficheros de texto se usan en casos concretos como archivos de configuracioacuten o archivosde registro (log)Las bases de datos relacionales entran en juego cuando se necesita almacenar muchainformacioacuten y ademaacutes esta informacioacuten es homogeacutenea y se puede representarmediante tablas Por ejemplo una aplicacioacuten que permita gestionar la matriculacioacutende los alumnos de un centro educativo deberaacute ser capaz de almacenar los datos degran cantidad de alumnos (puede que miles) En este caso concreto cada alumno serepresenta mediante un registro que contiene determinados datos como el nuacutemerode expediente el nombre los apellidos la nota media etc A estos datos se les llamacamposEn este capiacutetulo vamos a ver coacutemo se puede acceder mediante Java a una basede datos relacional MySQL para hacer listados insertar nuevos elementos y borrarelementos existentesLos programas de ejemplo que se muestran en este capiacutetulo son aplicaciones JSPaprovechando lo visto en el capiacutetulo anterior aunque tambieacuten se puede acceder auna base de datos desde un programa en Java escrito para la consola

131 Socios de un club de baloncesto

Para ilustrar el acceso a una base de datos mediante Java vamos a utilizar comoejemplo un club de baloncesto Nuestro club necesita tener almacenada la informacioacutende todos los socios Sobre cada socio se necesita saber su nombre completo suestatura su edad y su localidad de residencia Cada socio tendraacute ademaacutes un nuacutemerode identificacioacuten uacutenico que seraacute el nuacutemero de socioNuestra aplicacioacuten consistiraacute en varias paacuteginas JSP que van a permitir ver un listadocon los datos de todos los socios dar de alta un nuevo miembro en el club y tambieacutenborrar o modificar los datos de un determinado socioSi todaviacutea no tienes instalado en tu equipo el gestor de bases de datosMySQL deberaacutesinstalarlo Tambieacuten es recomendable instalar PHPMyAdmin que es una aplicacioacuten quepermite crear y manejar bases de datos MySQL de una forma muy sencilla medianteuna interfaz web

192

Acceso a bases de datos 193

Instalacioacuten de MySQL

sudo apt-get install mysql-server

sudo apt-get install mysql-client

Para el usuario root de MySQL deberaacutes establecer la contrasentildea root para quete funcionen correctamente los ejemplos

Instalacioacuten de PHPMyAdmin

sudo apt-get install phpmyadmin

Para acceder a PHPMyAdmin debes escribir httplocalhostphpmyadmin en labarra de direcciones del navegador

Deberaacutes crear la base de datos MySQL a la que llamaraacutes baloncesto que contendraacuteuna tabla de nombre socio con los campos socioID nombre estatura edad y localidad yluego deberaacutes antildeadir los datos de los socios Todo esto lo tienes ya preparado en unfichero con nombre baloncestosql que estaacute en GitHub en la direccioacuten httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDbaloncestosql Descaacutergate este fichero lo utilizaremos en seguidaA continuacioacuten mostramos un fragmento del fichero baloncestosql para que veas coacutemose crea la base de datos la tabla socio y coacutemo se introducen los datos de muestra

---- Base de datos `baloncesto`--CREATE DATABASE IF NOT EXISTS `baloncesto` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

USE `baloncesto`

-- --------------------------------------------------------

---- Estructura de tabla para la tabla `socio`--

CREATE TABLE IF NOT EXISTS `socio` (

`socioID` int(11) NOT NULL`nombre` varchar(40) COLLATE utf8_spanish2_ci DEFAULT NULL`estatura` int(11) DEFAULT NULL`edad` int(11) DEFAULT NULL`localidad` varchar(30) COLLATE utf8_spanish2_ci DEFAULT NULLPRIMARY KEY (`socioID`)

Acceso a bases de datos 194

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci

---- Volcado de datos para la tabla `socio`--

INSERT INTO `socio` (`socioID` `nombre` `estatura` `edad` `localidad`) VALUES(1235 Bermuacutedez Espada Ana Mariacutea 186 46 Maacutelaga)

(1236 Cano Cuenca Margarita 161 48 Maacutelaga)

En dos sencillos pasos tendraacutes preparada y lista para usar la base de datos de ejemploPara acceder a PHPMyAdmin debes escribir httplocalhostphpmyadmin en la barrade direcciones de tu navegador A continuacioacuten teclea el nombre de usuario y lacontrasentildea Si has instalado MySQL como te hemos indicado tanto el nombre deusuario como la contrasentildea deberiacutean ser root

A continuacioacuten haz clic en la pestantildea Importar y seguidamente en el botoacuten Exami-nar Selecciona el fichero baloncestosql que descargaste antes

Acceso a bases de datos 195

Si has seguido correctamente los pasos ya tienes la base de datos lista para usardesde un programa escrito en Java

132 Preparacioacuten del proyecto de ejemplo

1321 Activar la conexioacuten a MySQL

Abre el entorno Netbeans y crea un nuevo proyecto del tipo Java Web - como vimosen el capiacutetulo 12 - y noacutembralo BaloncestoAhora es necesario activar el servicio de bases de datos Haz clic en la pestantildeaServicios (estaacute junto a la pestantildea Proyectos) Haz clic con el botoacuten derecho enBasesde datos y luego selecciona Nueva conexioacuten A continuacioacuten aparece una ventanapara seleccionar el driver debes seleccionar MySQL (ConnectorJdriver)

Acceso a bases de datos 196

Una vez se haya establecido el servicio veraacutes las bases de datos disponibles en unaestructura de aacuterbol Puedes ir desplegando hasta encontrar la base de datos baloncesto

y la tabla socio que contiene los campos socioID nombre estatura edad y localidad

Una vez activada la conexioacuten a MySQL no es necesario realizarla de nuevo para cada

Acceso a bases de datos 197

proyecto

1322 Incluir la libreriacutea MySQL JDBC

Cada proyecto de aplicacioacuten en Java que haga uso de una base de datos MySQLdeberaacute incluir la libreriacutea MySQL JDBC Para incluir esta libreriacutea despliega el proyectoBaloncesto haz clic con el botoacuten derecho en Libreriacuteas selecciona Antildeadir libreriacuteay por uacuteltimo selecciona MySQL JDBC Driver

133 Listado de socios

El primer ejemplo de acceso a una base de datos mediante Java que veremos seraacute unlistado Si echas un vistazo desde PHPMyAdmin a la tabla socio de la base de datosbaloncesto veraacutes que ya contiene informacioacuten sobre maacutes de 20 socios Nuestro primerejemplo seraacute una aplicacioacuten en Java que mueste todos esos datos en una paacuteginaweb Copia el archivo listadoSociosjsp1 a la carpeta principal del proyecto (donde estaacuteindexhtml) Para ejecutarlo haz clic con el botoacuten derecho y selecciona EjecutarA continuacioacuten tienes el coacutedigo JSP del listado de socios

1httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDBaloncestolistadoSociosjsp

Acceso a bases de datos 198

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

lttitlegtListado Socioslttitlegt

ltheadgt

ltbodygt

lth1gtListado de Socioslth1gt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balonce

storoot root)

Statement s = conexioncreateStatement()

ResultSet listado = sexecuteQuery (SELECT FROM socio)

while (listadonext())

outprintln(listadogetString(socioID) + + listadogetString(nombre) + ltbrgt

)

conexionclose()

gt

ltbodygt

lthtmlgt

Si todo ha salido bien al ejecutar el archivo - haciendo clic con el botoacuten derecho sobreel archivo y seleccionando Ejecutar - veraacutes por pantalla un listado como el siguientecon el nuacutemero y el nombre de cada socio

Acceso a bases de datos 199

Vamos a ldquodiseccionarrdquo el coacutedigo Las siguientes tres liacuteneas son obligatorias y deberaacutescopiarlas en todas las paacuteginas JSP que accedan a una base de datos Lo uacutenico quetendraacutes que cambiar es el nombre de la base de datos - la de nuestro ejemplo sellama baloncesto - seguacuten el caso

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306baloncesto

root root)

Statement s = conexioncreateStatement()

La siguiente liacutenea ejecuta la consulta

SELECT FROM socio

sobre la base de datos y guarda el resultado en el objeto listado Esta consulta extraetodos los datos () de la tabla socio Si quisieacuteramos obtener esos datos ordenados pornombre la consulta seriacutea

SELECT FROM socio ORDER BY nombre

Aquiacute estaacute la liacutenea en cuestioacuten

Acceso a bases de datos 200

ResultSet listado = sexecuteQuery (SELECT FROM socio)

Una vez extraiacutedos los datos en bruto hace falta ir sacando cada uno de los registroses decir cada una de las liacuteneas En cada liacutenea se van a mostrar los datos de un socioPara ello usamos un while que va extrayendo liacuteneas mientras quede alguna en el objetolistado

while (listadonext())

outprintln(listadogetString(socioID) + + listadogetString(nombre) + ltbrgt)

Observa que el meacutetodo getString toma como paraacutemetro el nombre de un campoEn este ejemplo estamos mostrando uacutenicamente los nuacutemeros de socio con suscorrespondientes nombres Si quisieacuteramos mostrar tambieacuten la altura de cada sociola podemos extraer mediante listadogetString(altura)

134 Alta

Para dar de alta un nuevo socio necesitamos recoger los datos mediante un formularioque puede ser un programa JSP o simplemente una paacutegina HTML Estos datos recogidospor el formulario seraacuten enviados a otra paacutegina encargada de grabarlos en la tabla socio

de la base de datos baloncesto mediante el comando INSERT de SQLA continuacioacuten se muestra el coacutedigo de formularioSociojsp que recoge los datos delnuevo socio Como puedes comprobar es un simple formulario HTML y no contienecoacutedigo en Java

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgtlthtmlgtltheadgtltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgtltbodygtlth2gtIntroduzca los datos del nuevo sociolth2gtltform method=get action=grabaSociojspgtNordm socio ltinput type=text name=numerogtltbrgtNombre ltinput type=text name=nombregtltbrgtEstatura ltinput type=text name=estaturagtltbrgtEdad ltinput type=text name=edadgtltbrgtLocalidad ltinput type=text name=localidadgtltbrgtltinput type=submit value=Aceptargt

ltformgtltbodygt

lthtmlgt

Acceso a bases de datos 201

El siguiente programa - grabaSociojsp - se encarga de tomar los datos que enviacuteaformularioSociojsp y grabarlos en la base de datosIgual que en los programas del capiacutetulo 12 incluimos esta liacutenea para poder recogercorrectamente cadenas de caracteres que contienen tildes la letra ntilde etc

requestsetCharacterEncoding(UTF-8)

La variable insercion es una cadena de caracteres en la que se va componiendo a basede ir juntando trozos la sentencia SQL correspondiente a la insercioacuten

String insercion = INSERT INTO socio VALUES (

+ IntegervalueOf(requestgetParameter(numero))

+ + requestgetParameter(nombre)

+ + IntegervalueOf(requestgetParameter(estatura))

+ + IntegervalueOf(requestgetParameter(edad))

+ + requestgetParameter(localidad) + )

Una vez que se han recogido los datos del formulario y se ha creado la cadena en lavariable insercion deberiacutea quedar algo como esto

INSERT INTO socio VALUES (6789 Brito Fino Alan 180 40 Benalmaacutedena)

Por uacuteltimo se ejecuta la sentencia de insercioacuten mediante sexecute(insercion)A continuacioacuten tienes el coacutedigo completo de grabaSociojsp

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

requestsetCharacterEncoding(UTF-8)

Acceso a bases de datos 202

String insercion = INSERT INTO socio VALUES (

+ IntegervalueOf(requestgetParameter(numero))

+ + requestgetParameter(nombre)

+ + IntegervalueOf(requestgetParameter(estatura))

+ + IntegervalueOf(requestgetParameter(edad))

+ + requestgetParameter(localidad) + )

sexecute(insercion)

conexionclose()

gt

Socio dado de alta

ltbodygt

lthtmlgt

Al componer una sentencia SQL concatenando trozos es frecuente que seproduzcan errores porque faltan o sobran comillas pareacutentesis comas etc Sise produce un error al ejecutar la sentencia la manera maacutes faacutecil de detectarloes mostrar por pantalla la sentencia Por ejemplo si la sentencia es unainsercioacuten de datos y la cadena de caracteres que la contiene se llama insercioncomo en el ejemplo que acabamos de ver simplemente tendriacuteamos queescribir outprintln(insercion)

135 Borrado

El borrado al igual que el alta se realiza en dos pasos En el primer paso se carga lapaacutegina pideNumeroSociojsp que muestra en una tabla todos los socios cada uno en unafila Junto a cada socio se coloca un botoacuten borrar que al ser pulsado enviacutea el nuacutemerode socio a la paacutegina borraSociojsp que se encarga de ejecutar la sentencia SQL deborradoLa tabla con los socios y los botones de borrado quedariacutea como se muestra acontinuacioacuten

Acceso a bases de datos 203

A continucacioacuten se muestra el coacutedigo de pideNumeroSociojsp El fichero estiloscss2 seencuentra disponible en GitHub igual que el resto de archivos

ltpage import=javasqlStatementgt

ltpage import=javasqlResultSetgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltlink rel=stylesheet type=textcss href=estiloscss gt

ltheadgt

ltbodygt

lt

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

2httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciosblobmasterejemplos13_JSP_y_BBDDBaloncestoestiloscss

Acceso a bases de datos 204

ResultSet listado = sexecuteQuery (SELECT FROM socio)

gt

lttablegt

lttrgtltthgtCoacutedigoltthgtltthgtNombreltthgtltthgtEstaturaltthgtltthgtEdadltthgtltthgtLocalidadltthgtlt

trgt

lt

while (listadonext())

outprintln(lttrgtlttdgt)

outprintln(listadogetString(socioID) + lttdgt)

outprintln(lttdgt + listadogetString(nombre) + lttdgt)

outprintln(lttdgt + listadogetString(estatura) + lttdgt)

outprintln(lttdgt + listadogetString(edad) + lttdgt)

outprintln(lttdgt + listadogetString(localidad) + lttdgt)

gt

lttdgt

ltform method=get action=borraSociojspgt

ltinput type=hidden name=codigo value=lt=listadogetString(socioID) gtgt

ltinput type=submit value=borrargt

ltformgt

lttdgtlttrgt

lt

whileconexionclose()

gt

lttablegt

ltbodygt

lthtmlgt

A continuacioacuten se muestra el coacutedigo de borraSociojsp Como puedes comprobar lasentencia SQL que borra el registro deseado es un DELETE que toma como referencia elnuacutemero de socio para realizar el borrado

ltpage import=javasqlResultSetgt

ltpage import=javasqlStatementgt

ltpage import=javasqlDriverManagergt

ltpage import=javasqlConnectiongt

ltpage contentType=texthtml pageEncoding=UTF-8gt

ltDOCTYPE htmlgt

lthtmlgt

ltheadgt

ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt

ltheadgt

ltbodygt

lt

Acceso a bases de datos 205

ClassforName(commysqljdbcDriver)

Connection conexion = DriverManagergetConnection(jdbcmysqllocalhost3306balon

cestoroot root)

Statement s = conexioncreateStatement()

sexecute (DELETE FROM socio WHERE socioID= + requestgetParameter(codigo))

gt

ltscriptgtdocumentlocation = pideNumeroSociojspltscriptgt

ltbodygt

lthtmlgt

136 CRUD completo con Bootstrap

Los programas que ofrecen la posibilidad de hacer listados y de realizar modificacionesy borrado sobre los registros de una tabla se denominan CRUD que son las siglas eningleacutes de Create Read Update y Delete en espantildeol se diriacutea que es un programa dealta listado modificacioacuten y borrado El coacutedigo fuente completo estaacute disponible en lacarpeta BaloncestoMejorado de nuestro repositorio en GitHub3

Para dar de alta un nuevo socio simplemente habriacutea que rellenar los campos delformulario que aparecen en la primera liacutenea y hacer clic en el botoacuten Antildeadir Laaplicacioacuten comprueba si el nuacutemero de socio introducido ya existe en la base de datosy en tal caso muestra un mensaje de error recuerda que el nuacutemero de socio es uacutenico

3httpsgithubcomLuisJoseSanchezaprende-java-con-ejerciciostreemasterejemplos13_JSP_y_BBDDBaloncestoMejorado

Acceso a bases de datos 206

El borrado se lleva a cabo de la misma manera que en el ejemplo del apartado anteriorEl botoacuten Modificar nos lleva a otra paacutegina que contiene un formulario con todos losdatos del socio donde podemos modificar la informacioacuten necesaria A continuacioacuten semuestra una captura

Para los estilos - colores botones iconos etc - hemos utilizado Boostrap4 Boostrapes un framework que incluye unos estilos predefinidos para que con solo incluirloen nuestro proyecto la aplicacioacuten tenga una apariencia bonita y homogeacutenea Puedesencontrar maacutes informacioacuten de coacutemo utilizar este framework en la paacutegina oficial deBoostrap5

4httpgetbootstrapcom5httpgetbootstrapcom

Acceso a bases de datos 207

137 Ejercicios

Ejercicio 1Establece un control de acceso mediante nombre de usuario y contrasentildeapara alguno de los programas de la relacioacuten anterior (por ejemplo el quepinta una piraacutemide) Lo primero que apareceraacute por pantalla seraacute un formulariopidiendo el nombre de usuario y la contrasentildea Si el usuario y la contrasentildea soncorrectos se podraacute acceder al ejercicio en caso contrario volveraacute a aparecerel formulario pidiendo los datos de acceso y no se nos dejaraacute ejecutar laaplicacioacuten hasta que iniciemos sesioacuten con un nombre de usuario y contrasentildeacorrectos Los nombres de usuario y contrasentildeas deben estar almacenados enla tabla de una base de datos

Acceso a bases de datos 208

Ejercicio 2Mejora el programa anterior de tal forma que se puedan dar de alta nuevosusuarios para acceder a la aplicacioacuten Si se introduce un nombre de usuarioque no sea el administrador (admin) y una contrasentildea correcta la aplicacioacutenfuncionaraacute exactamente igual que el ejercicio anterior Si se introduce elusuario admin y la contrasentildea correcta la aplicacioacuten entra en la gestioacuten deusuarios donde se podraacuten dar de alta nuevos usuarios indicando nombre deusuario y contrasentildea No puede haber dos nombres de usuario iguales aunquesiacute puede haber claves repetidas

Acceso a bases de datos 209

Ejercicio 3Ampliacutea el programa anterior para que se pueda asignar o quitar permiso paraejecutar las aplicaciones de la relacioacuten anterior a los distintos usuarios Porejemplo que se pueda especificar que el usuario ldquojaimitordquo pueda ejecutar losejercicios 2 3 y 5 Para ello en la base de datos deberaacute existir una tabla con lasparejas (usuario nordm ejercicio) Por ejemplo si el usuario ldquojaimitordquo tiene accesoa los ejercicios 2 3 y 5 en la tabla correspondiente estaraacuten las parejas (jaimito2) (jaimito 3) y (jaimito 5) Lo ideal es que la asignacioacuten de permisos se hagamediante el marcado de muacuteltiples ldquocheckboxrdquo

Acceso a bases de datos 210

Ejercicio 4Crea una aplicacioacuten web que permita hacer listado alta baja y modificacioacutensobre la tabla cliente de la base de datos banco Un cliente tiene su identifica-dor nombre completo direccioacuten teleacutefono y fecha de nacimiento

Acceso a bases de datos 211

Ejercicio 5Ampliacutea el programa anterior para que se pueda hacer una buacutesqueda por nom-bre El programa buscaraacute la cadena introducida dentro del campo ldquonombrerdquoy si hay varias coincidencias se mostraraacute una lista de clientes para poderseleccionar uno de ellos y ver todos los datos Si solo hay una coincidencia semostraraacuten directamente los datos del cliente en cuestioacuten

Acceso a bases de datos 212

Ejercicio 6Crea una versioacuten web del programa GESTISIMAL (GESTIoacuten SIMplifcada deAlmaceacuten) para llevar el control de los artiacuteculos de un almaceacuten De cada artiacuteculose debe saber el coacutedigo la descripcioacuten el precio de compra el precio de ventay el stock (nuacutemero de unidades) La entrada y salida de mercanciacutea suponerespectivamente el incremento y decremento de stock de un determinadoartiacuteculo Hay que controlar que no se pueda sacar maacutes mercanciacutea de la que hayen el almaceacuten Aprovecha las opciones que puede ofrecer una interfaz webpor ejemplo para eliminar un artiacuteculo ya no seraacute necesario pedir el coacutedigo sinoque se puede mostrar un listado de todos los artiacuteculos de tal forma que sepuedan borrar un artiacuteculo directamente pulsando un botoacuten

213

Apeacutendice A Ejercicios de ampliacioacuten 214

Apeacutendice A Ejercicios de ampliacioacuten

Ejercicio 1 Transcomunicacioacuten instrumental mediante ficherosde texto digitalesSe conoce la transcomunicacioacuten instrumental (TCI) como la teacutecnica decomunicacioacuten que utiliza aparatos electroacutenicos para establecer comunicacioacutencon los espiacuteritus El caso de TCI maacutes conocido es el de la psicofoniacuteaPara realizar una psicofoniacutea se pone a grabar al aire un dispositivo en unlugar donde previamente hayan ocurrido fenoacutemenos extrantildeos o simplementese invoca la entidad que queremos que se comunique mediante el ritualadecuado Posteriormente se escucha la grabacioacuten para comprobar si se hagrabado algo un mensaje una palabra un grito un lamentohellipLos sonidos extrantildeos se graban gracias a lo que se llama en teacuterminosparapsicoloacutegicos una sentildeal portadora puede ser el chasquido de una ramauna racha de viento un golpe La entidad comunicante aprovecha ese sonidopara supuestamente moldearlo y convertirlo en un mensaje inteligible Muchasde las psicofoniacuteas se realizan utilizando como portadora el ruido que produceuna radio que no estaacute sintonizadaEl ejercicio que se propone es la realizacioacuten de un programa que permitarealizar la TCI mediante la creacioacuten y el posterior anaacutelisis de ficherosde textoEn primer lugar el programa deberaacute generar la portadora que seraacute un ficherode texto creado con caracteres producidos de forma aleatoria Se podraacutenespecificar varios paraacutemetros como el nuacutemero de liacuteneas o paacuteginas que sequieren generar si se incluyen letras uacutenicamente o bien letras y nuacutemerosfrecuencia aproximada de espacios saltos de liacutenea y signos de puntuacioacutenetc Se obtienen portadoras de calidad - con maacutes probabilidad de contenermensajes - cuando la proporcioacuten de las letras que contienen eacutestas coincidecon las del idioma espantildeolFrecuencia de aparicioacuten de letrashttpeswikipediaorgwikiFrecuencia_de_apariciC3B3n_de_letras

Una vez creado el fichero de texto el programa deberaacute ser capaz de analizarloal menos de una forma superficial de modo que nos resulte faacutecil encontrar losposibles mensajes Para realizar este anaacutelisis el programa iraacute comparandouna a una todas las palabras que aparecen en el texto con las que hay enel diccionario de espantildeol En caso de coincidencia la palabra o palabrasencontradas deben aparecer resaltadas con un color diferente al resto deltexto o bien en viacutedeo inverso Opcionalmente se pueden mostrar estadiacutesticascon el nuacutemero total de palabras encontradas distancia media entre esaspalabras palabras reales por cada mil palabras generadas etcEl alumno puede encontrar ficheros con las palabras que tiene el idiomaespantildeol en formato digital en la siguiente direccioacuten Se trata de una muestrahay otros muchos diccionarios disponibles en internethttplasrcsuclaedugeoffispell-dictionarieshtmlSpanish-dicts

Apeacutendice A Ejercicios de ampliacioacuten 215

Ejercicio 2 Coleccioacuten de discos ampliado (con canciones)Este ejercicio consiste en realizar una mejora del ejercicio del capiacutetulo 10que permite gestionar una coleccioacuten de discos Ahora cada disco contienecanciones Deberaacutes crear la clase Cancion con los atributos y meacutetodos queestimes oportunos Antildeade el atributo canciones a la clase Disco Este atributocanciones debe ser un array de objetos de la clase CancionFiacutejate bien que Cancion NO ES una subclase de Disco sino que ahora cadadisco puede tener muchas canciones que estaacuten almacenadas en el atributocancionesModifica convenientemente el meacutetodo toString para que al mostrarse los datosde un disco se muestre tambieacuten la informacioacuten sobre las canciones quecontieneLa aplicacioacuten debe permitir antildeadir borrar y modificar las canciones de losdiscos

Apeacutendice B Entorno de Desarrollo IntegradoNetbeansNetbeans es un IDE (Integrated Development Environment) es decir un Entornode Desarrollo Integrado Consta de un potente editor y de todas las herramientasnecesarias para codificar compilar depurar y ejecutar una aplicacioacutenEste IDE tiene algunas caracteriacutesticas que lo hacen muy atractivo para los programa-dores

bull Es el IDE oficial para desarrollar en Java6bull Chequea errores de sintaxis y da advertencias al mismo tiempo que se escribe el

coacutedigobull Tiene autocompletado inteligente de palabras clave clases meacutetodos paraacuteme-

troshellipbull Permite depurar una aplicacioacuten ejecutaacutendola paso a paso y ver el contendido de

todas las variables en tiempo realbull Soporta muchos lenguajes de programacioacuten ademaacutes de Java PHP Groovy HTML

XML Javascript JSPhellipbull Existe una gran variedad de plugins que ampliacutean las funcionalidades del entorno

Descarga e instalacioacuten

Netbeans se puede descargar de forma gratuita y para cualquier plataforma desdehttpsnetbeansorgdownloads

6Esto no es casualidad ya que es la misma empresa - Oracle - la que estaacute detraacutes del desarrollo de Java y tambieacuten la quesoporta Netbeans

216

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 217

Figura B1 Descarga de Netbeans

El programa de instalacioacuten de Netbeans estaacute disponible en varios paquetes seguacutenel lenguaje de programacioacuten y las tecnologiacuteas que se incluyen En el momento deescribir este libro los paquetes disponibles son Java SE Java EE HTML5JavaScriptPHP CC++ All Este uacuteltimo paquete (All) instala todos los lenguajes y tecnologiacuteasdisponibles para el IDE (sin contar los plugins) Para seguir este libro es suficientecon la versioacuten Java EE sin embargo animo al lector a descargar la versioacuten completa yexperimentar con otros lenguajes diferentes a Java por ejemplo con PHP7

Configuracioacuten

En los ejemplos y soluciones a los ejercicios de este libro nos centildeimos al los estaacuten-dares de programacioacuten de Google para el coacutedigo fuente escrito en el lenguaje deprogramacioacuten Java8 Por tanto despueacutes de la instalacioacuten de Netbeans es necesariorealizar algunso ajustes en la configuracioacuten del editor para cumplir con las siguientescondiciones

7httpsleanpubcomaprendephpconejercicios8httpgoogle-styleguidegooglecodecomsvntrunkjavaguidehtml

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 218

bull La tecla TAB debe insertar espacios no debe insertar el caraacutecter de tabulacioacutenbull La indentacioacuten debe ser de 2 caracteres (por defecto suele estar a 4)bull La condificacioacuten de caracteres debe ser UTF-8

Para ello selecciona Herramientas rarr Opciones rarr Editor A continuacioacuten seleccionala pestantildea Formato y en el menuacute desplegable correspondiente al lenguaje deprogramacioacuten selecciona Java La configuracioacuten deberiacutea quedar como se indica enla imagen

Figura B2 Configuracioacuten de Netbeans

Creacioacuten de un proyecto

Sigue los pasos que damos a continuacioacuten para crear un nuevo proyecto de Java enNetbeansEn primer lugar desde el menuacute principal selecciona Archivo y a continuacioacuten NuevoProyecto Se puede hacer maacutes raacutepido con la combinacioacuten Control + Mayuacutescula + NVeraacutes que aparece una ventana emergente para elegir el tipo de proyecto SeleccionaJava en el apartado ldquoCategoriacuteasrdquo y Aplicacioacuten Java en el apartado ldquoProyectosrdquo Hazclic en Siguiente

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 219

Figura B3 Nuevo proyecto en Java

Ahora es necesario darle el nombre al proyecto lo puedes llamar por ejemplo SaludoRecuerda no utilizar caracteres especiales ni signos de puntuacioacuten Se crearaacute unacarpeta con el mismo nombre que el proyecto que contendraacute todos los ficherosnecesarios Aseguacuterate de que la casilla Crear la clase principal estaacute marcada Hazclic en Terminar

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 220

Figura B4 Proyecto ldquoSaludordquo

Veraacutes que se ha creado el ldquoesqueletordquo de la aplicacioacuten La clase principal se llamaSaludo y contiene el main que seraacute el cuerpo principal del programa Observa que en laparte de la izquierda donde estaacuten todos los proyectos que se van realizando puedesver la estructura de carpetas y ficheros El coacutedigo fuente de nuestra aplicacioacuten estaacuteen el fichero Saludojava Escribe dentro del main la siguiente liacutenea

Systemoutprintln(iexclHola mundo)

Para guardar compilar y ejecutar basta con hacer clic en el botoacuten verde con el iconode Play o bien pulsar la tecla F6

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 221

Figura B5 Ejecucioacuten del proyecto

Si todo ha salido bien veraacutes el mensaje iexclHola mundo en la ventana de terminal integradade Netbeans que hay justo debajo del editor

Depuracioacuten

El entornoNetbeans permite la depuracioacuten paso a paso de un programa En ocasioneses complicado encontrar y corregir los fallos de una aplicacioacuten y ayuda mucho tenerla posibilidad de ir ejecutando un programa liacutenea a liacutenea y ver coacutemo van cambiandolas variablesPara ilustrar la depuracioacuten paso a paso vamos a utilizar un programa de ejemplo delCapiacutetulo 7 Arrays en concreto usaremos el coacutedigo de Array03javaCrea un nuevo proyecto de Java como se ha indicado en el apartado anterior y llaacutemaloArray03 A continuacioacuten copia el contenido del main del fichero Array03java en tuproyecto Ten cuidado de no borrar la liacutenea package array03Comenzaremos la ejecucioacuten paso a paso del programa pulsando de manera sucesivala tecla F7

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 222

Figura B6 Ejecucioacuten paso a paso

Observa coacutemo Netbeans resalta una liacutenea la ejecuta se detiene y espera quesigamos pulsando F7 En la parte de abajo ha aparecido una nueva ventana que resultatremendamente uacutetil Se trata de una zona donde puedes ver en tiempo real el valorque tiene cada variable (por supuesto se incluyen los arrays)Ve pulsando F7 hasta colocarte en la liacutenea siguiente

num[2] = 200

En la ventana inferior donde aparecen todos los datos despliega el array num veraacutesque los elementos 0 y 1 ya tienen los valores 8 y 33 respectivamente Si vuelves apulsar F7 veraacutes que ahora en la posicioacuten 2 se ha almacenado el 200Para salir del modo ldquopaso a pasordquo y terminar de ejecutar el programa pulsa F5Ademaacutes de la ejecucioacuten ldquopaso a pasordquo tambieacuten resultan muy uacutetiles los puntos deruptura o breakpoints Se trata de marcas a modo de sentildeales de STOP dondeindicamos pausas en la ejecucioacuten del programa La depuracioacuten de un programa devarios cientos o miles de liacuteneas puede ser muy tediosa si se ejecuta cada liacutenea paso a

Apeacutendice B Entorno de Desarrollo Integrado Netbeans 223

paso con F7 Los breakpoints permiten parar la ejecucioacuten en liacuteneas concretas dondequeremos ver con maacutes detalle queacute estaacute sucediendo en nuestro programaVamos a colocar varios breakpoints en nuestro coacutedigo Haz clic sobre las liacuteneas 15 20y 24 (justo encima del nuacutemero de liacutenea) Observa que estas liacuteneas quedan marcadascon un pequentildeo cuadradito

Figura B7 Breakpoints

Pulsa la combinacioacuten de teclas Control + F5 Observa coacutemo el programa empiezaa ejecutarse con normalidad y se para justo en la liacutenea 15 donde estaacute el primerbreakpoint Pulsando ahora F5 el programa continuacutea ejecutaacutendose hasta que se paraen la liacutenea 20 donde estaacute el segundo breakpoint Otra pulsacioacuten de F5 hace quecontinuacutee la ejecucioacuten hasta la liacutenea 24 Una uacuteltima pulsacioacuten de esta tecla hace que elprograma continuacutee la ejecucioacuten hasta el final

Apeacutendice C Caracteres especialesLiacuteneas para tablas

Bloques

⊞ ⊟ ⊠ ⊡

Figuras de ajedrez

Ciacuterculos

oplus ⊖ otimes ⊘ ⊙ ⊛ ⊜ ⊝ ⴱ ⴲ ⵀ ⵁ ⵔ ⵕ ⵙ ⵚ

Flechas

larr uarr rarr darr harr ↚ ↛ ↠ ↣ ↦ ↮ crarr ⇎ ⇏ lArr uArr rArr dArr hArr ⇴ ⇵ ⇶ ⇷ ⇸ ⇹ ⇺ ⇻ ⇼ ⇽ ⇾ ⇿

Nuacutemeros en ciacuterculos

❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓

Dados

Fichas de dominoacute

127024 127025 127026 127027 127028 127029 127030 127031 127032 127033 127034 127035 127036 127037 127038 127039 127040 127041 127042 127043 127044 127045 127046 127047 127048 127049127050 127051 127052 127053 127054 127055 127056 127057 127058 127059 127060 127061 127062 127063 127064 127065 127066 127067 127068 127069 127070 127071 127072 127073 127074 127075127076 127077 127078 127079 127080 127081 127082 127083 127084 127085 127086 127087 127088 127089 127090 127091 127092 127093 127094 127095 127096 127097 127098 127099 127100 127101 127102 127103 127104 127105 127106 127107 127108 127109 127110 127111 127112 127113127114 127115 127116 127117 127118 127119 127120 127121 127122 127123

224

Apeacutendice C Caracteres especiales 225

Cartas

127136 127137 127138 127139 127140 127141 127142 127143 127144 127145 127146 127147 127148 127149 127150 127153 127154 127155 127156 127157 127158 127159 127160 127161 127162 127163 127164 127165 127166 127169 127170 127171127172 127173 127174 127175 127176 127177 127178 127179 127180 127181 127182 127183 127185 127186 127187 127188 127189 127190 127191 127192 127193 127194 127195 127196 127197 127198 127199

Caras

128045 128046 128049 128053 128512 128513 128514 128515 128516 128517 128518 128519 128520 128521 128522 128523 128524 128525 128526 128527 128528 128529 128530 128531 128532 128533 128534 128535 128536128537 128538 128539 128540 128541 128542 128543 128544 128545 128546 128547 128549 128550 128551 128552 128553 128554 128555 128557 128558 128559 128560 128561 128562 128563 128564 128565 128566 128567 128568 128569128570 128571 128572 128573 128574 128575 128576

Horoacutescopo

Miscelaacutenea

Ω ꙮ

  • Tabla de contenidos
  • Sobre este libro
  • Sobre el autor
  • Centros en los que se usa este libro
  • Introduccioacuten
  • Instalacioacuten y configuracioacuten del entorno de programacioacuten Java
  • iexclHola mundo - Salida de datos por pantalla
    • iexclHola mundo - Mi primer programa
    • Coloreado de texto
    • Ejercicios
      • Variables
        • Definicioacuten y tipos de variables
          • Enteros (int y long)
          • Nuacutemeros decimales (double y float)
          • Cadenas de caracteres (String)
            • Operadores artimeacuteticos
            • Asignacioacuten de valores a variables
            • Conversioacuten de tipos (casting)
            • Ejercicios
              • Lectura de datos desde teclado
                • Lectura de texto
                • Lectura de nuacutemeros
                • La clase Scanner
                • Ejercicios
                  • Sentencia condicional (if y switch)
                    • Sentencia if
                    • Operadores de comparacioacuten
                    • Operadores loacutegicos
                    • Sentencia switch (seleccioacuten muacuteltiple)
                    • Ejercicios
                      • Bucles
                        • Bucle for
                        • Bucle while
                        • Bucle do-while
                        • Ejercicios
                          • Nuacutemeros aleatorios
                            • Generacioacuten de nuacutemeros aleatorios con y sin decimales
                            • Generacioacuten de palabras de forma aleatoria de un conjunto dado
                            • Ejercicios
                              • Arrays
                                • Arrays de una dimensioacuten
                                • Arrays bidimensionales
                                • Recorrer arrays con for al estilo foreach
                                • Ejercicios
                                  • Arrays de una dimensioacuten
                                  • Arrays bidimensionales
                                      • Funciones
                                        • Implementando funciones para reutilizar coacutedigo
                                        • Comentarios de funciones
                                        • Creacioacuten de bibliotecas de rutinas mediante paquetes
                                        • Aacutembito de las variables
                                        • Paso de paraacutemetros por valor y por referencia
                                        • Ejercicios
                                          • Programacioacuten orientada a objetos
                                            • Clases y objetos
                                            • Encapsulamiento y ocultacioacuten
                                            • Meacutetodos
                                              • Creiacute haber visto un lindo gatito
                                              • Meacutetodos getter y setter
                                              • Meacutetodo toString
                                                • Aacutembitovisibilidad de los elementos de una clase - public protected y private
                                                • Herencia
                                                  • Sobrecarga de meacutetodos
                                                    • Atributos y meacutetodos de clase (static)
                                                    • Interfaces
                                                    • Arrays de objetos
                                                    • Ejercicios
                                                      • Conceptos de POO
                                                      • POO en Java
                                                      • Arrays de objetos
                                                          • Colecciones y diccionarios
                                                            • Colecciones la clase ArrayList
                                                              • Principales meacutetodos de ArrayList
                                                              • Definicioacuten de un ArrayList e insercioacuten borrado y modificacioacuten de sus elementos
                                                              • ArrayList de objetos
                                                              • Ordenacioacuten de un ArrayList
                                                                • Diccionarios la clase HashMap
                                                                  • Principales meacutetodos de HashMap
                                                                  • Definicioacuten de un HasMap e insercioacuten borrado y modificacioacuten de entradas
                                                                    • Ejercicios
                                                                      • Ficheros de texto y paso de paraacutemetros por liacutenea de comandos
                                                                        • Lectura de un fichero de texto
                                                                        • Escritura sobre un fichero de texto
                                                                        • Lectura y escritura combinadas
                                                                        • Otras operaciones sobre ficheros
                                                                        • Paso de argumentos por liacutenea de comandos
                                                                        • Combinacioacuten de ficheros y paso de argumentos
                                                                        • Procesamiento de archivos de texto
                                                                        • Ejercicios
                                                                          • Aplicaciones web en Java (JSP)
                                                                            • Hola Mundo en JSP
                                                                            • Mezclando Java con HTML
                                                                            • Recogida de datos en JSP
                                                                            • POO en JSP
                                                                            • Ejercicios
                                                                              • Acceso a bases de datos
                                                                                • Socios de un club de baloncesto
                                                                                • Preparacioacuten del proyecto de ejemplo
                                                                                  • Activar la conexioacuten a MySQL
                                                                                  • Incluir la libreriacutea MySQL JDBC
                                                                                    • Listado de socios
                                                                                    • Alta
                                                                                    • Borrado
                                                                                    • CRUD completo con Bootstrap
                                                                                    • Ejercicios
                                                                                      • Apeacutendice A Ejercicios de ampliacioacuten
                                                                                      • Apeacutendice B Entorno de Desarrollo Integrado Netbeans
                                                                                        • Descarga e instalacioacuten
                                                                                        • Configuracioacuten
                                                                                        • Creacioacuten de un proyecto
                                                                                        • Depuracioacuten
                                                                                          • Apeacutendice C Caracteres especiales
                                                                                            • Liacuteneas para tablas
                                                                                            • Bloques
                                                                                            • Figuras de ajedrez
                                                                                            • Ciacuterculos
                                                                                            • Flechas
                                                                                            • Nuacutemeros en ciacuterculos
                                                                                            • Dados
                                                                                            • Fichas de dominoacute
                                                                                            • Cartas
                                                                                            • Caras
                                                                                            • Horoacutescopo
                                                                                            • Miscelaacutenea
Page 8: Aprende Java con Ejercicios - DAM
Page 9: Aprende Java con Ejercicios - DAM
Page 10: Aprende Java con Ejercicios - DAM
Page 11: Aprende Java con Ejercicios - DAM
Page 12: Aprende Java con Ejercicios - DAM
Page 13: Aprende Java con Ejercicios - DAM
Page 14: Aprende Java con Ejercicios - DAM
Page 15: Aprende Java con Ejercicios - DAM
Page 16: Aprende Java con Ejercicios - DAM
Page 17: Aprende Java con Ejercicios - DAM
Page 18: Aprende Java con Ejercicios - DAM
Page 19: Aprende Java con Ejercicios - DAM
Page 20: Aprende Java con Ejercicios - DAM
Page 21: Aprende Java con Ejercicios - DAM
Page 22: Aprende Java con Ejercicios - DAM
Page 23: Aprende Java con Ejercicios - DAM
Page 24: Aprende Java con Ejercicios - DAM
Page 25: Aprende Java con Ejercicios - DAM
Page 26: Aprende Java con Ejercicios - DAM
Page 27: Aprende Java con Ejercicios - DAM
Page 28: Aprende Java con Ejercicios - DAM
Page 29: Aprende Java con Ejercicios - DAM
Page 30: Aprende Java con Ejercicios - DAM
Page 31: Aprende Java con Ejercicios - DAM
Page 32: Aprende Java con Ejercicios - DAM
Page 33: Aprende Java con Ejercicios - DAM
Page 34: Aprende Java con Ejercicios - DAM
Page 35: Aprende Java con Ejercicios - DAM
Page 36: Aprende Java con Ejercicios - DAM
Page 37: Aprende Java con Ejercicios - DAM
Page 38: Aprende Java con Ejercicios - DAM
Page 39: Aprende Java con Ejercicios - DAM
Page 40: Aprende Java con Ejercicios - DAM
Page 41: Aprende Java con Ejercicios - DAM
Page 42: Aprende Java con Ejercicios - DAM
Page 43: Aprende Java con Ejercicios - DAM
Page 44: Aprende Java con Ejercicios - DAM
Page 45: Aprende Java con Ejercicios - DAM
Page 46: Aprende Java con Ejercicios - DAM
Page 47: Aprende Java con Ejercicios - DAM
Page 48: Aprende Java con Ejercicios - DAM
Page 49: Aprende Java con Ejercicios - DAM
Page 50: Aprende Java con Ejercicios - DAM
Page 51: Aprende Java con Ejercicios - DAM
Page 52: Aprende Java con Ejercicios - DAM
Page 53: Aprende Java con Ejercicios - DAM
Page 54: Aprende Java con Ejercicios - DAM
Page 55: Aprende Java con Ejercicios - DAM
Page 56: Aprende Java con Ejercicios - DAM
Page 57: Aprende Java con Ejercicios - DAM
Page 58: Aprende Java con Ejercicios - DAM
Page 59: Aprende Java con Ejercicios - DAM
Page 60: Aprende Java con Ejercicios - DAM
Page 61: Aprende Java con Ejercicios - DAM
Page 62: Aprende Java con Ejercicios - DAM
Page 63: Aprende Java con Ejercicios - DAM
Page 64: Aprende Java con Ejercicios - DAM
Page 65: Aprende Java con Ejercicios - DAM
Page 66: Aprende Java con Ejercicios - DAM
Page 67: Aprende Java con Ejercicios - DAM
Page 68: Aprende Java con Ejercicios - DAM
Page 69: Aprende Java con Ejercicios - DAM
Page 70: Aprende Java con Ejercicios - DAM
Page 71: Aprende Java con Ejercicios - DAM
Page 72: Aprende Java con Ejercicios - DAM
Page 73: Aprende Java con Ejercicios - DAM
Page 74: Aprende Java con Ejercicios - DAM
Page 75: Aprende Java con Ejercicios - DAM
Page 76: Aprende Java con Ejercicios - DAM
Page 77: Aprende Java con Ejercicios - DAM
Page 78: Aprende Java con Ejercicios - DAM
Page 79: Aprende Java con Ejercicios - DAM
Page 80: Aprende Java con Ejercicios - DAM
Page 81: Aprende Java con Ejercicios - DAM
Page 82: Aprende Java con Ejercicios - DAM
Page 83: Aprende Java con Ejercicios - DAM
Page 84: Aprende Java con Ejercicios - DAM
Page 85: Aprende Java con Ejercicios - DAM
Page 86: Aprende Java con Ejercicios - DAM
Page 87: Aprende Java con Ejercicios - DAM
Page 88: Aprende Java con Ejercicios - DAM
Page 89: Aprende Java con Ejercicios - DAM
Page 90: Aprende Java con Ejercicios - DAM
Page 91: Aprende Java con Ejercicios - DAM
Page 92: Aprende Java con Ejercicios - DAM
Page 93: Aprende Java con Ejercicios - DAM
Page 94: Aprende Java con Ejercicios - DAM
Page 95: Aprende Java con Ejercicios - DAM
Page 96: Aprende Java con Ejercicios - DAM
Page 97: Aprende Java con Ejercicios - DAM
Page 98: Aprende Java con Ejercicios - DAM
Page 99: Aprende Java con Ejercicios - DAM
Page 100: Aprende Java con Ejercicios - DAM
Page 101: Aprende Java con Ejercicios - DAM
Page 102: Aprende Java con Ejercicios - DAM
Page 103: Aprende Java con Ejercicios - DAM
Page 104: Aprende Java con Ejercicios - DAM
Page 105: Aprende Java con Ejercicios - DAM
Page 106: Aprende Java con Ejercicios - DAM
Page 107: Aprende Java con Ejercicios - DAM
Page 108: Aprende Java con Ejercicios - DAM
Page 109: Aprende Java con Ejercicios - DAM
Page 110: Aprende Java con Ejercicios - DAM
Page 111: Aprende Java con Ejercicios - DAM
Page 112: Aprende Java con Ejercicios - DAM
Page 113: Aprende Java con Ejercicios - DAM
Page 114: Aprende Java con Ejercicios - DAM
Page 115: Aprende Java con Ejercicios - DAM
Page 116: Aprende Java con Ejercicios - DAM
Page 117: Aprende Java con Ejercicios - DAM
Page 118: Aprende Java con Ejercicios - DAM
Page 119: Aprende Java con Ejercicios - DAM
Page 120: Aprende Java con Ejercicios - DAM
Page 121: Aprende Java con Ejercicios - DAM
Page 122: Aprende Java con Ejercicios - DAM
Page 123: Aprende Java con Ejercicios - DAM
Page 124: Aprende Java con Ejercicios - DAM
Page 125: Aprende Java con Ejercicios - DAM
Page 126: Aprende Java con Ejercicios - DAM
Page 127: Aprende Java con Ejercicios - DAM
Page 128: Aprende Java con Ejercicios - DAM
Page 129: Aprende Java con Ejercicios - DAM
Page 130: Aprende Java con Ejercicios - DAM
Page 131: Aprende Java con Ejercicios - DAM
Page 132: Aprende Java con Ejercicios - DAM
Page 133: Aprende Java con Ejercicios - DAM
Page 134: Aprende Java con Ejercicios - DAM
Page 135: Aprende Java con Ejercicios - DAM
Page 136: Aprende Java con Ejercicios - DAM
Page 137: Aprende Java con Ejercicios - DAM
Page 138: Aprende Java con Ejercicios - DAM
Page 139: Aprende Java con Ejercicios - DAM
Page 140: Aprende Java con Ejercicios - DAM
Page 141: Aprende Java con Ejercicios - DAM
Page 142: Aprende Java con Ejercicios - DAM
Page 143: Aprende Java con Ejercicios - DAM
Page 144: Aprende Java con Ejercicios - DAM
Page 145: Aprende Java con Ejercicios - DAM
Page 146: Aprende Java con Ejercicios - DAM
Page 147: Aprende Java con Ejercicios - DAM
Page 148: Aprende Java con Ejercicios - DAM
Page 149: Aprende Java con Ejercicios - DAM
Page 150: Aprende Java con Ejercicios - DAM
Page 151: Aprende Java con Ejercicios - DAM
Page 152: Aprende Java con Ejercicios - DAM
Page 153: Aprende Java con Ejercicios - DAM
Page 154: Aprende Java con Ejercicios - DAM
Page 155: Aprende Java con Ejercicios - DAM
Page 156: Aprende Java con Ejercicios - DAM
Page 157: Aprende Java con Ejercicios - DAM
Page 158: Aprende Java con Ejercicios - DAM
Page 159: Aprende Java con Ejercicios - DAM
Page 160: Aprende Java con Ejercicios - DAM
Page 161: Aprende Java con Ejercicios - DAM
Page 162: Aprende Java con Ejercicios - DAM
Page 163: Aprende Java con Ejercicios - DAM
Page 164: Aprende Java con Ejercicios - DAM
Page 165: Aprende Java con Ejercicios - DAM
Page 166: Aprende Java con Ejercicios - DAM
Page 167: Aprende Java con Ejercicios - DAM
Page 168: Aprende Java con Ejercicios - DAM
Page 169: Aprende Java con Ejercicios - DAM
Page 170: Aprende Java con Ejercicios - DAM
Page 171: Aprende Java con Ejercicios - DAM
Page 172: Aprende Java con Ejercicios - DAM
Page 173: Aprende Java con Ejercicios - DAM
Page 174: Aprende Java con Ejercicios - DAM
Page 175: Aprende Java con Ejercicios - DAM
Page 176: Aprende Java con Ejercicios - DAM
Page 177: Aprende Java con Ejercicios - DAM
Page 178: Aprende Java con Ejercicios - DAM
Page 179: Aprende Java con Ejercicios - DAM
Page 180: Aprende Java con Ejercicios - DAM
Page 181: Aprende Java con Ejercicios - DAM
Page 182: Aprende Java con Ejercicios - DAM
Page 183: Aprende Java con Ejercicios - DAM
Page 184: Aprende Java con Ejercicios - DAM
Page 185: Aprende Java con Ejercicios - DAM
Page 186: Aprende Java con Ejercicios - DAM
Page 187: Aprende Java con Ejercicios - DAM
Page 188: Aprende Java con Ejercicios - DAM
Page 189: Aprende Java con Ejercicios - DAM
Page 190: Aprende Java con Ejercicios - DAM
Page 191: Aprende Java con Ejercicios - DAM
Page 192: Aprende Java con Ejercicios - DAM
Page 193: Aprende Java con Ejercicios - DAM
Page 194: Aprende Java con Ejercicios - DAM
Page 195: Aprende Java con Ejercicios - DAM
Page 196: Aprende Java con Ejercicios - DAM
Page 197: Aprende Java con Ejercicios - DAM
Page 198: Aprende Java con Ejercicios - DAM
Page 199: Aprende Java con Ejercicios - DAM
Page 200: Aprende Java con Ejercicios - DAM
Page 201: Aprende Java con Ejercicios - DAM
Page 202: Aprende Java con Ejercicios - DAM
Page 203: Aprende Java con Ejercicios - DAM
Page 204: Aprende Java con Ejercicios - DAM
Page 205: Aprende Java con Ejercicios - DAM
Page 206: Aprende Java con Ejercicios - DAM
Page 207: Aprende Java con Ejercicios - DAM
Page 208: Aprende Java con Ejercicios - DAM
Page 209: Aprende Java con Ejercicios - DAM
Page 210: Aprende Java con Ejercicios - DAM
Page 211: Aprende Java con Ejercicios - DAM
Page 212: Aprende Java con Ejercicios - DAM
Page 213: Aprende Java con Ejercicios - DAM
Page 214: Aprende Java con Ejercicios - DAM
Page 215: Aprende Java con Ejercicios - DAM
Page 216: Aprende Java con Ejercicios - DAM
Page 217: Aprende Java con Ejercicios - DAM
Page 218: Aprende Java con Ejercicios - DAM
Page 219: Aprende Java con Ejercicios - DAM
Page 220: Aprende Java con Ejercicios - DAM
Page 221: Aprende Java con Ejercicios - DAM
Page 222: Aprende Java con Ejercicios - DAM
Page 223: Aprende Java con Ejercicios - DAM
Page 224: Aprende Java con Ejercicios - DAM
Page 225: Aprende Java con Ejercicios - DAM
Page 226: Aprende Java con Ejercicios - DAM
Page 227: Aprende Java con Ejercicios - DAM
Page 228: Aprende Java con Ejercicios - DAM
Page 229: Aprende Java con Ejercicios - DAM
Page 230: Aprende Java con Ejercicios - DAM
Page 231: Aprende Java con Ejercicios - DAM
Page 232: Aprende Java con Ejercicios - DAM
Page 233: Aprende Java con Ejercicios - DAM
Page 234: Aprende Java con Ejercicios - DAM
Page 235: Aprende Java con Ejercicios - DAM
Page 236: Aprende Java con Ejercicios - DAM
Page 237: Aprende Java con Ejercicios - DAM
Page 238: Aprende Java con Ejercicios - DAM
Page 239: Aprende Java con Ejercicios - DAM