Upload
others
View
11
Download
0
Embed Size (px)
Citation preview
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
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
Ω ꙮ