Vous êtes sur la page 1sur 122

Qu es Java?

,
0.1 EL LENGUAJE DE PROGRAMACION JAVA y LA PLATAFORMA JAVA
El lenguaje de programacin Java es un lenguaje moderno, presentado por primera vez por Sun Microsysterns en el
segundo semestre de 1995. Desde el principio gan adeptos rpidamente por muy diversas razones, una de las ms
importantes es su neutralidad respecto de la plataforma de ejecucin lo que permite, entre otras cosas, aadir progra-
mas a una pgi na Web.
Pero quiz lo que mas guste a los programadores son un par de aspectos que le hacen muy cmodo y agradable de
usar para programar:

La sencillez y elegancia de cmo se escriben los programas en Java. A ello se une que es un lenguaje orientado
a objetos que evita muchas preocupaciones a los programadores. En el proceso de compilacin se realizan
multitud de comprobaciones que permiten eliminar muchos posibles errores posteriores.
Las bibliotecas ya definidas que proporciona el lenguaje y que el programador puede utilizar sin tener que
hacerlas de nuevo.

La evolucin de Java ha sido muy rpida, Desde que se hizo pblico el lenguaje y un primer entorno de desarrollo,
el JDK (Java Development Kit), hasta el momento actual, la plataforma Java ha ido creciendo constantemente ya un
ritmo cada vez mayor segn se han ido incorporando un gran nmero de programadores de todo el mundo.
Pero Java 2 no es slo un lenguaje. Es una plataforma de desarrollo de programas que consta de:

Un lenguaje de programacin: el lenguaje Java, del mismo nombre que la plataforma,


U n conjunto de bi bli otecas estndar que se incluyen con la plataforma y que deben exi stir en cualquier entorno
con Java, Tambin se denomina Java Coreo Estas bibliotecas comprenden: strings, procesos, entrada y salida,
propiedades del sistema, fecha y hora, Applets, API de red, Internacionalizacin, Seguridad, Componentes,
Serializacin, acceso a bases de datos, etc.
Un conjunto de herramientas para el desarrollo de programas, Entre ellas cabe citar el compilador de Java a
cdigo de bytes, el generador de documentacin, el depurador de programas en Java, etc.
U n entorno de ejecucin cuyo pri ncipal componente es una mquina virtual para poder ejecutar los programas
en cdigo de bytes.

La plataforma Java2 se puede utilizar desde distintos sistemas operativos, ejecutndose cada uno de ellos en el
hardware correspondiente. (Vase Figura 0.1.)

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Fuentes Java

Herramientas
(javac y otras)

Bytecodes -
---_. ~--- Java
Sistema de ejecucin
(runtime) API

Mquina virtual

Sistema operativo
(Solaris, Linux, Windows, MacOS, ...)

Hardware
(Sparc, Pentium, PowerPC, ...)

Figura 0.1. Elementos de la plataforma Java 2.

0.2 DESARROLLO DE PROGRAMAS


El desarrollo de programas en Java, al igual que ocurre normalmente en otros lenguajes de programacin, sigue un
proceso como el siguiente:

Edicin del programa fuente. Se denomina programa fuente al programa que se escribe utilizando un entor-
no de programacin como los descritos, o cualquier editor, en un lenguaje de programacin, En Java los
archivos fuentes tienen un nombre como nombre.java, donde el nombre ha de ser el mismo que el empleado
como nombre de la clase y la extensin ha de ser .java.
Compilacin. Tras escribir el programa hay que compilarlo utilizando un compilador. Los entornos de desa-
rrollo facilitan esa tarea, hacindola casi invisible en alguno de ellos. Tambin se puede compilar utilizando la
lnea de comandos con la herramienta javac, de la siguiente forma: javac nombre.java.
En el proceso de compilacin se comprueba que lo que se ha escrito es correcto en Java y se traduce a otro
lenguaje, denominado cdigo de bytes (bytecode). Si durante la compilacin se detectan errores, el entorno
avisar de los problemas detectados y dnde se han encontrado para que pueda corregirlos. Si en la compila-
cin no se detecta ningn error se genera un archivo como nombre.class, con el mismo nombre que la clase
que se compila pero con la extensin .class.
Ejecucin. Una vez compilado se ejecuta el programa y se comprueba si hace lo que se haba previsto. Si el
programa no hace lo previsto se vuelve a editar, modificando los aspectos que no funcionan adecuadamente,

,
0.3 ASPECTOS SOBRE COMO ESCRIBIR LOS PROGRAMAS
Los pasos indicados anteriormente dan una idea muy breve de cmo escribir programas, Cuando escriba un programa
debe tener en cuenta a qu dar ms importancia de acuerdo con la siguiente mxima:

Legibilidad> Correccin> Eficiencia

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Qu es Java?

Que viene a indicar la importancia relativa que debe conceder a estos tres aspectos en la programacin:

Legibilidad: El programa ha de ser fcil de leer y entender, incluso para una persona que no haya participado
en el desarrolJo del programa. Este aspecto es en la actualidad el ms importante. A pesar de lo que pueda
pensar en este momento, dar legibilidad a un programa har que los otros aspectos salgan ganando.
Correccin: U n programa debe hacer lo que tiene que hacer, I de ms, ni de menos. Se supone que con la fase
de pruebas se comprueba hasta cierto nivel que es cierto y que el programa funciona correctamente.
Eficiencia: Suele ser una preocupacin tpica de muchos programadores. La eficiencia se suele medir en
tiempo que se tarda en ejecutar o en cantidad de memoria que ocupa el programa. Nuestro consejo es que se
olvide completamente de este tema. Una vez domine el lenguaje ya tendr tiempo de ocuparse de ello.

En el Apndice B puede encontrar recomendaciones especficas para mejorar la legibilidad de un programa y, por
tanto, debera conocerlas y seguirlas lo mximo posible. Siempre que pueda fjese en cmo escriben los programas los
buenos programadores,

0.4 ENTORNOS DE DESARROLLO


Existen multitud de fabricantes que disponen de entornos de desarrolJo para Java. En primer lugar estn teniendo una
gran aceptacin algunos entornos de libre distribucin. Puede utilizar otros entornos, aunque sean de pago, ya que
existen versiones reducidas que se pueden utilizar para aprender los fundamentos del lenguaje y la programacin con
Java.
En esta seccin se va a hacer un recorrido rpido por cuatro entornos de desarrollo en Java que puede obtener de
forma gratuita y cmo utilizarlos para las tareas bsicas que, como se han descrito en la seccin anterior, son:

Editar el programa fuente.


Compilacin y ejecucin del programa,

Dada la extensin del libro, no se describirn otros aspectos de los entornos de programacin. Tenga en cuenta
tambin, que los entornos que aqu se describen son las ltimas versiones disponibles de los programas en el rnomen-
to final de entrega del libro manuscrito,
Dada la evolucin de los entornos es fcil que la versin actualizada que usted pueda encontrar ya haya variado.
Sin embargo, esperamos que le siga siendo til esta presentacin.

0.4.1 NetBeans ijava.sun.com O www.netbeans.org)


NetBeans es un proyecto de creacin de un entorno de libre distribucin profesional patrocinado por Sun MicroSystems.
En java.sun.corn puede encontrar un paquete completo que viene con el entorno de desarrollo NetBeans y la ltima
versin del lenguaje. Puede encontrarlo en java.sun. comIj2se/l.5. O/
Tras iniciar NetBeans aparece una ventana COIUO la de la Figura 0.3. Para empezar se elige en ella File -> New
Project. En la ventana que aparece seleccione Java Aplication, A continuacin, aparece la ventana de la Figura 0.2. En
ella introduzca en Project Name el nombre del proyecto, por ejemplo Notas. En el ltimo cuadro de texto (Create
Main Class) sustituya el nombre Main que aparece por defecto por el nombre de la clase principal que desee, en este
caso Notas, como ya aparece en la Figura 0.2.
En la ventana de trabajo aparece parte de una clase ya realizada. En ella debe completar el mtodo man, Tambin
puede eliminar todo lo que no va a necesitar para su aplicacin. Una vez terminada de escribir la clase puede compi-
larla y ejecutarla en un paso pulsando sobre la flecha verde hacia la derecha de la barra de herramientas de la parte
supenor.
En la parte inferior se mostrar tanto el proceso de compi lacin y los errores que pueda tener el programa C0l1l0 el
resultado de la ejecucin del mismo.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Steps Name and Location

1. cnoose proJe:t Project Mam2: Natas


2. Nameand t.ocetion
Projact bocation: 1::\Oocu.-.3nts aro Setiing>\)3,us\)"lis do, Bro.vSE...
Project Fol;!.e"

ElSet as rv.ain Project


D !je.e MainClass nom,r..,tas
'-'="---

Ehim 1I Cancel 1I ttolp

Figura 0.2. Ventana de configuracin de proyecto de NetBeans.

N1lt18un~tOE4.0 NotaJ
flo: E<h '(Io:w ~J R<n
Rd,,;o."";-:;;;;;;;Qi;:-;;m:;:;-;;;:--------------''''
p
"'_ '" 'Ifrc.
:r "';111.1',

101;1
~C, f"'.' ...
- , M:a;.
Stlt. '~
..
t..:.J renpi'agH t:J
13
e at
,,1SIJ...tc Ht>t.lu.! I
t. ..stlCO<ll r t...
L 1

",
~ v"1-I... ~..,-...' '_",i,1 _ ... f.'-I. ..."'tl ..~"'.. J
~r"l
t/'ft. nu~ . IU'! ,. t In, "1:..".,., , i'1' n.11'"1'1"",.. t <'In~I ;
:J:r,:o(.=: .,1JI;..I""'\ ,-ti '\20 .... 1 ;~u. ~..,.,.~
..I -t.
S1... e..I,II/.t,.. I}" ulLl.n,i. $);
_.n"~.'..,.... -J ......

l
tI.,l'".. t ~,.". 1.....~..l' ..,.

:J'P.!It_. o~t .1~1lf,U.l\r/.!>':


Jtr' _. , .,:. ..

l111
OV...,oII .. "' .... (",i"..,<>~It)"I!
,:0 ..

o("UO.n' (l1t 1I.,f'fllt"" ..... '\II M'U....r
(".... e ., ,It~ r' \t....
Cc~,lU14 1 'o.I"~.
"1. ,. C. w.ewM.l"'. _ S~"lIl41 .1.".\I!, "C'IIai.";'
< ,

Figura 0.3. Ventana principal de trabajo de NetBeans.

0.4.2 Eclipse (www.eclipse.org)


Eclipse es un proyecto de creacin de un entorno genrico de desarrolJo patrocinado principalmente por IBM. Su
objetivo es cremoun marco de trabajo para distintas tareas y lenguajes de programacin. Se puede encontrar una
versin preparada para trabajar con Java en www.eclipse.org/downloads/. Tras iniciar el programa para empezar un
nuevo proyecto seleccione File -> New -> Project. Aparece la ventana de la Figura 0.4. En ella seleccione Java Project.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Qu es Java?

A conti nuacin, en la ventana siguiente introduzca en el campo de texto Project N ame el nombre del proyecto, por
ejemplo Notas. Tras generar el proyecto pulse Finish para terminar.

;.New Project EJ
Selee! a wizard --- ,,'
Cre6te a Jeve project

~Izords'
"'(1" Ja'/a Pro ea
'" ,-~ Plug-in Project
!",ca CYS

G:i'~ Plug-in Development


Ir 10 Simple

.,

Nexl> Cencel

Figura 0.4. Ventana de seleccin de un nuevo proyecto en Eclipse.

Una vez generado el proyecto aparece en la parte derecha del entorno de desarrollo la informacin del proyecto.
Para crear la clase inicial del programa seleccione, pulsando con el botn derecho del ratn sobre el nombre del
proyecto, la opcin New -> Class, y en la ventana que aparece rellene los campos Name, con el nombre de la clase, por
ejemplo Notas y marque la casilla de verificacin para crear el mtodo public static void maint), tal como aparece en
la Figura 0.5.
~ NQW Java cteee Ei
JavaClass
! The use onne defsul package ls discoutaged

SoulceFolgel: Notes BrQwse"

PocJioge: (defo.ul1) Bro!JJse,

r Enc:!osingI:!pe: Uro_se

Neme: Notes
I>.lodifis,s: (.' llublic e: defauh. r, ~I(I e P'Cj'!(fl)d
r obsyo.a r tinoJ. r s C'\IC
upelcloss' liovo.lang Object
lnlerfeces; lldd"

Which memod sltJbsWOlJld)l\"lU Ijke 10Cte61,e?


w p'~i~!~~:i~.~"~l.~:~.~.ii(~i~li:isj[i.~i";i~
r CoosrtUClots eom supefcles$
~ Intlelrted l:Ibslract methods
Do youwa.ntto adCt cornmenis as configuted in Ihe propf'!rte!'tofthe OJrtent prject?
r Generala comments

Einish canee I

Figura 0.5. Ventana de creacin de la clase principal en Eclipse.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Una vez aparezca el cdigo fuente generado compltelo como aparece en el Figura 0.6. Para ejecutarlo seleccione
el icono verde con una flecha hacia la derecha. Le aparecer una ventana de configuracin de la ejecucin la primera
vez. En eUa seleccione en la parte derecha Java Aplication, seleccione en el modo Run la opcin Java y haga doble clic
en Java Aplication para, por ltimo hacer doble clic en Notas.java. Las siguientes veces ya guarda esta configuracin
y basta con hacer clic en el icono verde de ejecucin .

.... JIlVQ ~ Na. IIlVQ


Edl Sil Plntfom 119El
t.!!'! [:"" $nI",'" IlA'tlt'l~~~* Spt\rrh.~n elft ~d.,.., tI"'lp
f)u .... ISo"'" .t'

., ..... "'-,; 't....-


ko 1'10'11" "publlC class ::OT.'l~ I \:l. t;ol!l~
tf (H<wlP,...:j <l.,,,) 'JltI,.(SI:;n-1m,
_._I!J Noh,s java
o" ~l:i'fso,ern Ltbtat'o

pw,ll.C tJ.':: YQ,1,d


:l~...
.ly-.tpm.t""nf.rrlntlnC"--
;;1l1fl:Sl.tlngIJ
:1
cJ(9:':)
,',;'}
t
;'1- .,.
S!rJlf!ltl...IV(.r:tlllt(' JL 1,-,_ 't.l!I_t f t , "
lT'lT;;Itl nY.~rlntln({.~);
jy:.1ll.!lll.(_:,u!.;.t~!ll( r~nt<.lIc , '_'Junur ~ t L.l
...y!It::;I!I. ent.rrtnr ln (' .51 :
.syjt!o!m.uut.~cil!t('r; '1.,J lJ tJl' ",;
!y"tt:"'''' . "'" rl"lnrln 1".:

~"""",,,,,odl I'Jo!6I lJo.....


' Appl~oCv..w...,. d. PI'II9I.!tI'IIlI,J
.'5 "
\...JO OI\bJ>\ .......... ~ I eh< ~OOt 12.,0' 11
~I('-.\ I P ,', i
:1'_ " J L J. UII "' 4,
r .- 1"1 6.jlni. r rrl 1,"
tI. 11110,1.(1

..!.L__ J_~.!.l.!.l

Figura 0.6. Ventana de trabajo de Eclipse.

0.4.3 BlueJ (www.bluej.org)


BlueJ es un entorno desarroUado en la Universidad de Kent. Antes de instalar el entorno debe descargar de la pgina
de Sun el paquete J2SE e instalarlo. Como podr observar en las siguientes figuras, su aspecto es mucho ms senciUo
que los entornos anteriores.
Al iniciarse debe elegir Project -> New Project y elegir un nombre para el proyecto, por ejemplo Notas. A conti nua-
cin, aparece la pantalla de la Figura 0.7. Escriba en ella el nombre de la clase y seleccione Class. Se crear un recuadro
rayado (significa que no est compilada la clase). Si hace doble clic en el recuadro rayado podr editar la clase.

~,
2IO]atl l:f'.Ll 100ls ~Iew

Nw;CIO~S
I ZlOlueJ Cteata Ch:II;'O; El
---;,.
I ~
N'9W

--;,. I
CartAh?
I CI~$.~
Tj~t
IJ' tl~"s
r- Ab~!llIC'Cja~l

e Un, T$$I
r: En,ufl'l

...

Figura 0.7. Pantalla de creacin de una nueva clase, interface, enumerado, etc.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Qu es Java?

Por defecto se crea una clase con muchos elementos predefi nidos. Puede borrar prcticamente todo dejando slo el
nombre de la clase y las llaves de apertura y cierre de la misma Escriba el mtodo main y el resto de la clase COIUO en
el ejemplo de la Figura 0.8. Para compilar, pulse el botn Compile de la ventana de edicin o de la ventana de clases.
Una vez compilado el programa, si compila correctamente, el recuadro que representa la clase aparecer sin rayar.
Para ejecutar el programa pulse con el botn derecho sobre l y seleccione el mtodo main, Pulse OK. Aparecer una
nueva ventana con el resultado de la ejecucin.

l' ,

,,,,,,.,,1
__o> 1
I J~ I___...J
-p.1
COfl)lll~ )
DNDta~ fII{i)EJ
eh;$. E"dltToos 0l'hon-:

cf'<'IDI1<l1Vndo I~ Con)' I Pol1;1(!.1 ~ nnd I.l$YlI Dose I


In
t ,,!r~:V: 4 &.-JCCl.;>t:on O:: el~, Ne.t.lJ ne ee,

~ '3=-uthll< (\,lIl>t nOll>e)


, (lVt:l!'!fOO(11V.. IJIOII n~1' Ol '" d"t~)
'1
;)\!t)J le ('1$);1 :t~~ r

S'I:<ta.01.1.".pc\r.t.ln(' !I~",)"rJ" I>r~~,<u ~\,..t.'):


S.,a~"",.o"l..pc.n'_II.:.,.,1~1l' .... , 1". , 1: "1;
Sl.lU!o.cI:t.prlntln(4. S):
= - = S,=te:t,o:ut.p:lntl lIot.: d:l ~~.;ru:.;!~p~!nll_: 1;
:':.::0:-'::'. ec,... ptllltJn (i :'):
S,-3Q-... Oltt-rotll'lt.1 ; ,T. .~,,: ");
5'1'''=' Ql.lt.pcl)'t.ln(;;'):

Figura 0.8. Ventana general y de edicin de clases de BLueJ.

0.4.4 JCreator LE (www.jcreator.com)


La versin LE es una versin de uso gratuito. Tras indicar su nombre y direccin de correo se le enviar un URL de
donde descargarse el programa. Tras instalarlo puede seleccionar File -> New -> New project. Aparece la ventana de
la Figura 0.9 donde puede dar un nombre al proyecto. En este caso se le ha dado el nombre Notas.

ProJBclWIlSrfJ EJ

Project Path.
se~t Ita l:cabon pstns ror u-e grciect

:roj:!rt Tetrplate
(-.) Frotgct Path~ Neme: I-Jolas

sroject CassP..,1I1
, Lcceacn: Iplogremo.\XJnoxSotbYOfe\Ja-eajorVJlE""/t_"'Ploects~oto.s ~
:Yo~ct Tools
!
SOUr03 Path tograma\)'jnox Soft,\lare\JOeetor'v1lE't,t>,lyProjeas\Notas\sl'C ~
!
i OU!put Poih : je,\>:rlOX SotI:,Ve/ II\JCre&10fv3lE'tJ'..lyPrOj9cts\NotM\d8,SSSS ~

(.> Creale tle\'f'Ol1)(kspa,ce


rA ,:1 1.-?1l

........................................... ,
_ ~. "H o o~o o~. o o~o 0"'0
., .. " ,., " "0 "0' ,., , , , .. , ... , .. ,.""


B.ack finish .c:encel t!e!p

Figura 0.9. Ventana de creacin del proyecto en JCreator.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Aparece entonces la ventana principal como la de la Figura 0.9. Haga doble clic en el nombre del programa
Notas.java y borre .10que no necesite del cdigo que aparece en la ventana de trabajo. Pulse el botn de compilar y
despus el de ejecutar (como se ha marcado en la Figura 0.10). Al ejecutar el programa aparece una ventana con el
resultado de la ejecucin.

~ Notas - JCro8tO( - [Notas.itlVB. j I!!I~Ei


_ !i' x

J U 'd.jI :'3
"l _

uxJ
.l'l . ~ ~):' .@t V)_

[File ve.- Notas.java "1 -, I xl


~ WOlkspoce 'Notos'; 1Prcject J - .4
~I -J Nnren /!.1/Tr S~mpi.e .::oppi.ic':)'::1cn ~
AOSfC
l .[)Notos.!o.vc. -.J ~
~ t;.l.:!.uLhc-r- Eje~utar
: l) NotssFt'sme.java -
o
E -
.. @~'Gro':'()ll
"/
1.00 ~Pilar
,e
...- pub) ac c tcee bTo1:oS {
pllbl te st;":t,l'~~
vc rd mean(Strlng [J orgs) {
System. out. println ("bloto.s I:ll?Progxo.rno.c:l.n.'!;
-
IPa(~gQVi:l,\, "1
10
.--
d
Syst.em.out.print("t~oto.
Sys,.m.ou,.prin'ln(4.5);
de I pr-nner- pecrcaed :

Sys-cem.out..print.("liJota del segundo parela): " ) :


tO ) ;

8::J Notos Sys-celn. cu-t pr n-cLn (7.5) ;


m

3 Pocko.ge Oe1oult ~ Syatem .out. pr n't ( "teo tc


rl.nol: ");
:s System.out.println(6);
:t - }
17 -)
f
:
~OtaYet,\' ]!;packag3 vew - 11,I I_:J
fi::lnd Rerults:2 .x
.d

.!.I _J
~Get"S"al Culput I AEluI!d OU'lJ:t.1t: ,..ooF.-dRe;ults i ~Flnd Results 21
IFa' HOp.press Fl 1 ".; :,'17 '.1,,- 11~'rIc,,,J ' NUMI

Figura 0.10. PantaUa principal de trabajo de I'Creator.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Introduccin a la programacin

1.1 ESTRUCTURA DE UN PROGRAMA


Un programador debe utilizar los elementos que le ofrece el lenguaje de programacin para, utilizndolos de forma
inteligente y lgica, crear un programa que resuelva un problema,
En el siguiente programa de ejemplo puede ver un programa muy sencillo escrito en Java. Este programa escribe
en Ja pantalla el texto Hola a todos.

/**
* Programa en Java que escrjbe un texto en la pantalla.
*/
public class Hola {
public static void main(String[] args) {
System.out.println("Hola a todos."):
}
}

En este programa se pueden ver algunos de los elementos que se van a utilizar siempre que se escribe un programa
en Java:

Comentario. El programa empieza con un comentarte. El comentario del programa empieza con /** y acaba
con */.
Definicin de clase. La primera linea del programa despus del comentario define una clase que se llama
Ho 1a. La defi nicin de la clase empieza en el carcter abre llave { y termi na en el carcter cierra llave l. Todo
lo encerrado entre las llaves defi ne el bloque de la clase.
Definicin de mtodo. A continuacin, se escribe el mtodo mai n(). Todos los programas en Java deben tener
un mtodo main(), que se escribe de la misma forma que el del ejemplo,
Sentencias. Dentro del mtodo main(), en el bloque delimitado por abre llave y cierra llave, existe una nica
sentencia o instruccin que escribe Ull texto por pantaJla.

Para ver el resultado de ejecutar este programa, utilice el entorno de programacin que haya elegido de la forma
descrita en la documentacin del mismo. Tenga en cuenta que en Java las letras maysculas y las letras minsculas
son letras distintas, por lo que debe escribirlas tal como aparecen en el ejemplo dado.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

La estructura general de una clase pri ncipal en Java suele ser la siguiente:

1**
* Estructura de una clase en Java
*/
public class NombreDeClase {
/1 Declaracin de los atributos de la clase

/ I Declaracin de los mtodos de la clase

/1 El mtodo main. que indica donde empieza la ejecucin


public static void main(String[] argsl {
/1 Declaracin de las variables del mtodo
aqui hace referencia al metodo main
/ I Sentencias de ejecucin del mtodo

}
}

En el caso de ser una clase distinta de la clase principal, el mtodo main() no suele aparecer.
Se han puesto corno comentarios (que empiezan por dos barras) los elementos que suelen componer una clase, que
son los siguientes:

Atributos de la clase. Son las variables que definen el estado de los objetos. Se tratarn con detalle en el
Captulo 2. Puede pensar en eUos como variables definidas en el bloque de la clase.
Declaracin de mtodos. Son fragmentos de cdigo que hacen una determinada funcin. Se tratarn con
detalle en el Captulo 2.
El mtodo principal main). Ya se ha visto en el primer ejemplo. Dentro de este mtodo se escribe lo que se
desea que ejecute el programa, ya que siempre se empieza a ejecutar este mtodo.
Declaracin de variables. Se vern en las siguientes secciones.
Sentencias. Es la parte que se ejecuta en el programa Ya se ha visto en el primer ejemplo un programa con
una sentencia para escribir un texto en la pantaUa. Las sentencias se ejecutan siempre en el orden en el que se
escriben y, siempre, una detrs de otra, hasta que se acaba el mtodo mai n( ).

~ Sobre programa~ bsicos de escritura de datos consulte los Ejercicios 1.1 a 1.3.

1.2 IDENTIFICADORES
Un identificador es un nombre. Los nombres permiten identificar los elementos que se estn manejando en un
programa. Existen reglas estrictas sobre cmo se pueden escribir los nombres de las clases, las variables, mtodos,
etc. Cualquiera de estos nombres debe ser un iaemificador. Un identificador debe empezar con una letra y debe
seguir una sucesin de letras y dgitos.
Una letra es cualquier carcter que se considera una letra en Java. Como en Java se utiliza Unicode para los
caracteres, un identificador se puede escribir con caracteres hebreos, cirlicos, armenios, katakana, etc. Para formar
un identificador tambin se consideran letras los caracteres subrayado '_' y dlar '$', aunque el carcter '$' prctica-
mente no se suele utilizar, salvo en algn tipo de nombrado automtico. Se considera un dgito a cualquier carcter
entre los caracteres 'O' a '9'. De esta forma son vlidos los siguientes identificadores:

ejemp lo. Ejemp 1oDe Ident ificador. <PI11tAO. otroEjemp 1012. un02tres4oMs. Ao~1s.
_v_L5Qeo_No_3303459345

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Introduccin a la programacin

Aunque de acuerdo con la regla anterior seran vlidos, sin embargo, no lo son los identificadores que coincidan
con una palabra reservada del lenguaje (tenga cuidado porque fi na1 es uua palabra reservada).
Cuando elija un identificador, siga las siguientes recomendaciones:

Debe uti lizar nombres que sean significativos, de forma que cuando lo vea escrito sepa para qu sirve y de qu
tipo va a ser sin necesidad de acudir a su declaracin.
Los nombres de variables y mtodos empiezan con minscula. Si se trata de un nombre compuesto, cada
palabra empieza con mayscula. No se utiliza el carcter subrayado para separar unas de otras. Ejemplos de
nombres de variables o mtodos: n, nmeroEl ementos, ponValor, escri beTtu lo.
Los nombres de clases empiezan con mayscula. Si se trata de un nombre compuesto, cada palabra empieza
con mayscula. No se utiliza el carcter subrayado para separar unas de otras. Ejemplos de nombres de clases:
VolumenCilindro,Alumno,ProgramaDePrueba.
Los nombres de constantes se escriben en maysculas, Si el nombre es un nombre compuesto utilice el carcter
subrayado para separar unos de otros. Ejemplos de nombres de constantes: PI, TAMAO MXIMO.

~ Sobre identificadores consulte Jos Ejercicios 1.4 y 1.5.

1.3 TIPOS, VARIABLES Y VALORES


Un programa maneja valores, maneja datos de forma apropiada para cambiarlos, hacer clculos, presentarlos, solici-
tarlos al usuario, escribirlos en un disco, enviarlos por una red, etc.
Para poder manejar los valores en un programa se guardan en variables, Una variable guarda un nico valor. Una
variable queda determinada por:

Un nombre, Este nombre debe de ser como se ha indicado en la seccin de identificadores.


Un tipo. Permite conocer qu valores se pueden guardar en dicha variable.
Un rango de valores que puede admitir. Viene determinado por el tipo de la variable,

Por ejemplo, si se tiene una variable de nombre nmeroElementos, donde el tipo de valores que se pueden guardar
SOIl nmeros enteros, nmeroEl ementos puede contener el nmero 34, o el nmero -234 (aunque no tenga sentido
contar elementos negativos, la variable podra contener ese valor). Pero nunca puede contener el valor 3.45 ni un
texto como "ejemplo de texto", ni un valor mayor que el admitido por la variable, como por ejemplo
239-849695287398274832749. Para declarar una variable de un tipo, se indica de la siguiente forma:

double radio:

Con ello se declara que va a existir en el programa una variable con el nombre radio y que esa variable va a
guardar un valor del tipo doub1e. Una vez declarada se puede utilizar en cualquier lugar del programa poniendo su
nombre, Siempre que se utilice el nombre de una variable es como si pusiese el valor que tiene.
Si se quiere guardar un valor en una variable, se utiliza el operador de asignacin de valor de la siguiente forma:

radio = 23.4:

Donde se indica el nombre de la vanabe, el carcter igual (=), y cualquier expresin o clculo que se desee. El
smbolo igual significa lo siguiente: haz el clculo de la expresin que se encuentra a la derecha del igual y, despus,
guarda el valor calculado en la variable que haya la izquierda. Si despus se ejecuta:

radio = 44.56:

la variable radio guarda el valor 44.56. El valor anterior se pierde en esa variable.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Se puede declarar una constante poniendo el modificador final:

final double PI = 3.1415926536:

El valor de una constante no se puede modificar en el progrruna, por eso hay que darle un valor a la vez que se
declara,
Los tipos pri mitivos que se pueden utilizar para dec1arar variables, y los intervalos de valores de cada uno de ellos,
se pueden ver en la Tabla 1.1.

Tabla 1.1. Tipos primitivos en Java 2.

Tipo Descripcin Valor min.!max.

byte Entero con signo -128a127 F ' 'j 11' ,7 "(

short Entero con signo -32768 a 32767


int Entero con signo -2147483648 a 2147483647
long Entero con signo -922117036854775808 a 922117036854775807
float Real de simple precisin +3.40282347e+38 a + 1.40239846e-45
double Real de doble precisin + 1.7976931348 6231570e+ 308 a +4.94065645 841246544e- 324
char Caracteres Unicode \uOOOOa \uFFFF
boolean Verdadero o falso true o false

Los tipos pri rnitivos se pueden clasificar en:

Nmeros enteros. Permiten representar nmeros enteros positivos y negativos con distintos intervalos de valores.
Nmeros reales. Permiten guardar valores con decimales con distinta precisin.
Caracteres. Existe un tipo carcter (char) que permite representar cualquier carcter Unicode.
Booleano. Es un tipo que indica un valor lgico. Slo tiene dos valores, verdadero (true) y falso (fa 1se).

Otro tipo muy utilizado es para los textos o cadenas de caracteres. En realidad se trata de objetos, que se vern con
detenimiento en los Captulos 2 y 3, pero se pueden utilizar de forma sencilla COlllO si fueran variables de tipos
primitivos.

Stri ng texto:
texto = "En un lugar de la mancha de cuyo nombre., .":

c:> Sobre el uso bsico de variables consulte los Ejercicios 1.11 a 1,13,

Literales

Nmeros enteros
Los nmeros enteros se pueden escribir de tres formas:

En decimal: 21. Es la forma habitual.


En octal: 025. En octal un nmero siempre empieza por cero, seguido de dgitos octales (del O al 7).
En hexadecimal: Ox15. En hexadeci mal un nmero siempre empieza por Ox seguido de dgitos hexadecimales:
del O al 9, de la 'a' a la 'f' y de la 'A' a la 'F'.

Si se escribe un valor del tipo long se le debe aadir detrs el carcter '1' o 'L' (una letra ele rninscula o
mayscula).

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Introduccin a la programacin

Nmeros reales
Para escribir valores reales en Java, se puede hacer de las siguientes formas: le2, 2., .54,0.45,3.14, 56.34E-45. Es
decir, un nmero real en Java siempre tiene que tener un punto decimal o un exponente indicado por la letra e
mi nscula o la letra E mayscula.
Si no se indica nada se supone que pertenecen al tipo doub 1e. Si se desea que se interpreten corno del tipo float se
debe aadir un carcter 'f' o 'F' detrs del valor de la siguiente forma: le2f, 2.f, .54f, 0.45f, 3.14f. Se puede aadir el
carcter 'd' o el carcter 'D' para indicar explcitamente que el valor es del tipo doub 1e, de la siguiente forma: 4.56d,
78.34e-4d.

Booleanos
Los valores del tipo boo 1ean slo pueden ser dos, true y fa 1se, y se escriben siempre en minsculas.

Caracteres
Los valores del tipo carcter representan un carcter Unicode. Un carcter siempre se escribe entre comillas simples.
Un valor carcter se escribe como 'a', 'Z', 'N', ';', 'n', etc., o por su cdigo de la tabla Unicode, en octal o en-
hexadecimal, Por ejemplo: '\uOOA3', en hexadecimal o '\102' en octal.
Existen algunos caracteres especiales corno los que se indican en la Tabla 1.2.

Tabla 1.2. Caracteres especiales en Java.

Carcter Significado

\b Retroceso
\t Tabulador
\n Salto de lnea
\r Cambio de lnea
\" Carcter comi lIas dobles
\' Carcter comi llas simples
\\ Carcter barra hacia atrs

1.4 EXPRESIONES
Sobre cada uno de los tipos de valores se pueden utilizar un conjunto de operadores para formar expresiones o
clculos.

Nmeros enteros
Al realizar una operacin entre dos nmeros enteros el resultado siempre es un entero.

Unarias: poner un signo ms o un signo menos delante. Por ejemplo: +44, -56.
Multiplicativas: * multiplica dos valores, / divide el primer valor entre el segundo, y % calcula el resto de la
divisin entera. Ejemplos: 4 * 5, 8/2, 5 % 2.
Aditivas (+, -): La suma y la resta de la forma usual. Ejemplo: 4 + 5
Incremento y decremento (++, - -): Incrementa el valor en uno y decrementa el valor en uno de una variable.
Los operadores de incremento y decremento se pueden poner antes o despus de la variable que se desea
incrementar o decrementar,
Relacin (>, >=, <, <=): Permiten comparar valores. El resultado de una operacin con los operadores de
relacin es un valor boolean indicando si es cierta o falsa la relacin.
Operadores de igualdad (==, !=): Comparan si dos valores son iguales o son distintos. El resultado es un valor
del tipo boo 1ean, indicando si es cierta o no la igualdad o desigualdad.
Operadores de asignacin (=, +=, -=, *=, /=, %=): El primero es el operador de asignacin ya descrito y el resto
son operadores que permiten simplificar la escritura de expresiones muy comunes,

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Nmeros reales
Con los nmeros reales se pueden realizar las mismas operaciones que con nmeros enteros. En el caso de las
operaciones unarias, aditivas o multiplicativas el resultado de la operacin con nmeros reales es un nmero real.
Tambin se pueden utilizar los operadores de relacin e igualdad cuyo resultado es un valor del tipo boolean.

Booleanos
Los operadores sobre booleanos son los siguientes:

Negacin (1): Devuelve true si el operando vale fa 1se y viceversa.


y lgico (&&): Devuelve fa 1se si el primer operando vale fa 1se. En otro caso, devuelve lo que valga el segundo
operando. Tambin existe la versin con un solo ampersaud (&) en cuyo caso siempre se evalan los dos operandos.
O lgico (11):Devuelve true si el primer operando vale true. En otro caso, devuelve lo que valga el segundo
operando. Tambin existe la versin con una sola barra vertical (1) en cuyo caso siempre se evalan los dos
operandos.

Precedencia de operadores
Toda expresin se evala a un valor de una forma estricta. El cmo se evala una expresin depende del orden de
prioridad de los operadores que contenga dicha expresin. De forma simplificada el orden de prioridad y la forma de
evaluacin es:

l. Operadores unarios.
2. Operadores multiplicativos, de izquierda a derecha.
3. Operadores aditivos, de izquierda a derecha.
4. Operadores de relacin.
5. Operadores de asignacin.

Teniendo en cuenta el orden de evaluacin, la siguiente sentencia:

a = -3 + 5 + 2 * 4 - 6 / 4 * 3 - 5 % 2:
0 0 G) Q)
evala la expresin de acuerdo al orden indicado debajo de la misma, De esta forma primero se aplica el operador
unario a 3 para obtener el valor -3. A continuacin se van evaluando los operadores multiplicativos de izquierda a
derecha, 2 * 4 se evala a 8, 6 74 se evala a 1 que multiplicado por 3 se evala a 3 y 5 % 2 se evala a 1. En este
momento la expresin queda:

a = -3 + 5 + 8 - 3 - 1:

Por ltimo, se evalan los operadores aditivos de izquierda a derecha, siendo el resultado final de 6. Este es el
valor que se guarda en la variable a.
Si se desea que la evaluacin se realice en un orden especfico, se deben utilizar parntesis. En una expresin
siempre se empieza a evaluar por los parntesis ms internos.

q Sobre la evaluacin de expresiones aritnltica~ consulte los Ejercicios 1.9 y 1.10.

Expresiones aritmtico-lgicas
Una expresin aritmtco-lgica es una expresin que devuelve un valor booleano donde se utilizan operadores
aritmticos y operadores relacionales y de igualdad. U na expresin aritmtico-lgica podra ser la que sigue y su valor
es true, pues es cierto que 8 es menor que 10:

(3 + 5) < (5 * 2)

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Introduccin a la programacin

En una expresin aritmtico-lgica se pueden combinar varias expresiones senciUas de las anteriores mediante
los operadores lgicos. La precedencia de los operadores booleanos es menor que la de los operadores relacionales,
por lo que primero se evalan las desigualdades y despus los operadores booleanos. El orden de prioridad entre los
operadores booleanos es: la negacin, despus el Y lgico y, por ltimo, el O lgico. La prioridad de los operadores de
asignacin es la menor de todas. Por tanto, en la expresin:

3+5 < 5*2 I I 3 > 8 && 7 > 6

se evala primero las expresiones aritmticas y despus las relacionales, quedando la expresin

true II false && true

En realidad se evala en primer lugar la primera expresin a true, para, como el operador es 11,evaluar la
expresin completa a true.

~ Sobre la evaluacin de expresiones aritmtico-lgicas consulte los Ejercicios 1.14 y 1.15.

1.5 CONVERSIONES DE TIPO


En muchas ocasiones resulta necesario realizar algunas conversiones de tipos, de forma que el resultado sea del tipo
esperado. Para convertir valores entre tipos existen dos formas:

Conversin automtica de tipos. Cuando el tipo al que se asigna un valor es "mayor", la conversin se realiza
automticamente. As un valor de tipo doub1e se puede multiplicar por otro del tipo int. Antes de hacer la
multiplicacin se convierte el valor int a doub1e y luego se hace la multipicacin entre reales.
Conversin explcita. Se pone delante del valor a convertir, entre parntesis, el tipo al que se desea convertir.
Corno esta conversin suele implicar una prdida de valor, hay que tener mucho cuidado. Por ejemplo (i nt )34.45,
hace una conversin a un tipo i nt, trunca el valor y se pierden los decimales.

En la conversin de tipos existe un tipo especial de expresiones que involucra a los valores del tipo charo Un
tipo char siempre se puede utilizar en una expresin junto con nmeros enteros como si fuese un nmero entero
,
Inas:

char e = .A' :
int n:
n = e + 2:

1.6 ENUMERADOS AVERIGUAR COMO FUNCIONAN LOS ENUMERADOS

Los enumerados son conjuntos de valores constantes para los que no existe un tipo predefinido. Por ejemplo, no existe
ningn tipo predefinido pru'arepresentar los das de la semana, las estaciones del ao, los meses del ao, los turnos de
clases, etc.
Para definir un tipo enumerado con sus valores se hara de la siguiente forma:

enum O aSemana {LUNES. ~IARTES. t~1RCOLES. JUEVES. VI ERNES. SABADO. DOMINGO}


enum TurnoDeClase {t-1AANA.TARDE}
enum TipoDeClase {TEORIA. LABORATORIO. SE~1INARIO. CHARLA. EXPERIMENTO}

En el siguiente ejemplo se manejan los valores de los das de la semana.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

public class Dias {


publ ic enum DaSemana {LUNES. MARTES. MIRCOLES. JUEVES. VI ERNES. SABADO. DO~lINGO}

public static void main(String[] args) {


DiaSemana hoy = DaSemana.JUEVES:
DiaSemana ltimo = DaSemana.DOMINGO:

System.out.println("Hoyes " + hoy):


System.out. printl n( "El ultimo da es " + ltimo):
}
}

q Sobre el uso de enumerados consulte los Ejercicios 1.18 a 1.20.

1.7 PETICION DE VALORES PRIMITIVOS AL USUARIO


Corno ya habr imaginado lo habitual en un programa es que solicite datos al usuario para realizar los clculos del
programa. En el siguiente ejemplo se presenta un programa para el clculo del volumen de un cilindro en el que se
piden al usuario los datos del radio y la altura.

1**
* Programa en Java que pide a1 usuario los datos
* del radio y la altura de un cilindro y calcula su volumen
*1
import java.util.Scanner:
public class PedirDatos {
public static void main(String[] args) {
/1 El valor del numero pi
final double PI = 3.1415926536:
double radio:
double altura;

Scanner teclado = new Scanner(System.in);

System.out.println("Introduzca los datos del cilindro:"):


System.out.print("Radio: "):
radio - teclado.nextDouble():
System. out. print ("A 1tura: ");
altur - teclado.nextDouble();
System.out.print("El rea del cilindro es "):
System.out.println(PI * radio * radio * altura):
}
}

En la primera lnea marcada se declara un objeto de la clase Scanner. Ya ver en el Captulo 2 qu es un objeto y
cmo se utiliza. De momento, piense que la variable teclado va a ser un objeto que nos va a permitir leer los datos que
se escriben por el teclado. En la segunda lnea Inarcada, cuando el programa la ejecuta se queda esperando a que el
usuario escriba algo en el teclado y pulse la tecla de retorno. En ese momento convierte lo ledo en un valor del tipo
doub 1e y lo guarda en la variable radio. Igual ocurre con la tercera lnea marcada para leer un valor para la altura. Si
lo que desea es leer otro tipo de datos hgalo corno se indica en la Tabla 1.3.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Introduccin a la programacin

Tabla 1.3. Mtodos para la lectura de distintos tipos de datos.

Tipo Mtodo a invocar

byte teclado.nextByte():
short teclado.nextShort():
nt teclado.nextlnt():
long teclado.nextLong():
float teclado.nextFloat();
double teclado.nextOouble();
boo1ean teclado.nextBoolean():

~ Sobre la peticin de datos al usuario consulte los Ejercicios 1.21 a 1.24.

-

PROGRAMAS DE ESCRITURA DE DATOS

Ejercicio 1.1:
Escriba un programa que escriba en la pantalla su nombre completo en una lnea y en la lnea siguiente su
fecha de nacimiento.

Planteamiento: Para escribir este programa se va a utilizar el esquema bsico donde la clase tiene el nombre
MisDatosPersona 1es (fjese en las maysculas y minsculas), Dentro del bloque del main () se utilizarn dos
sentencias para escribir en pantaUa, una para el nombre y otra para la fecha de nacimiento. Ambos datos se
escribirn COIUO textos entre comillas dobles.

Solucin:
public class MisOatosPersonales {
public static void main(String[] args) {
System.out.println("Jos Juan Jurez Jurez"); Para escribir un texto se pone entre
oomillas dobles.
System.out.println("12/12/1977");
}
}

Comentarios: Se utiliza System. out. pri nt 1n() para escribir un texto y pasar a la lnea siguiente.

Ejercicio 1.2:
Escriba un programa que imprima en la pantalla su nornbre completo en una linea y en la lnea siguiente su
fecha de nacimiento. Para ello escriba una sentencia para escribir el nombre, otra sentencia para escribir su
primer apellido y otra para escribir su segundo apellido.

Planteamiento: Se va a escribir un programa de nombre MisDatosPersona 1es2 que escriba el nombre, que se
har sin cambiar de lnea, a continuacin escriba el primer apeUido sin cambiar de linea y, despus, el segundo
apellido y cambie de lnea. Para terminar escribe la fecha de nacimiento.

Solucin:
public class MisOatosPersonales2 {

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

publie statie void main(String[] args) {


$ystem. out. pri nt (" Jos Juan "): Hay que escribir un espacio para
que el apellido aparezca separado.
$ystem out. pri nt (" Ju rez "):
System. out. pri nt 1n(" Jurez" l :
$ystem out.println("12/12/1977"):
}
}

Ejercicio 1.3:
Escriba un programa que escriba en pantalla las notas de la asignatura de "Programacin". En la primera
lnea se escribir el nombre de la asignatura. En las siguientes lneas se escribirn las notas de los dos
parciales realizados poniendo la nota de cada uno en lneas distintas. En la ltima lnea escribir la nota
final de la asignatura. Escriba lo que sea texto como un texto entre comillas dobles y lo que sea un nmero
como un nmero.

Planteamiento: Se va a escribir un programa de nombre t-li sNotas que escriba los textos tal y como se ha
hecho en los ejercicios anteriores. Para escribir las notas se utilizar la rnisma sentencia pero poniendo entre
parntesis el nmero de la nota. Hay que tener cuidado porque en Java los nmeros con decimales utilizan el
punto deci mal.

Solucin:
publie elass Notas {
publie statie void main(String[] args) {
$ystem. out. pri nt 1n(" Notas de Programacin" l :
System.out.print("Nota del primer parcial: "):
$ystem.out.println(4.5l: ------------11 Para los decimales hay que utilizar
el punto decimal.
$ystem. out. pri nt( "Nota del segundo parei al: "):
$ystem.out.println(7.5l:
System.out.print("Nota final: "):
$ystem.out.println(6l:
}
}

IDENTIFICADORES

Ejercicio 1.4:
Dados los siguientes idennficadores que se van a utilizar en un programa escrito en Java, diga cules de ellos
son correctos y cules no. Justifique su respuesta.

a) mi carta
b) unacarta
c) mis2escritos
d) 4cientos
e) esiun.rnensaje
f) no_vale nada
g) ejemplo _
h) mi-programa
i) cuantos?
j) el%Descontado
k) a150PORHORA
1) TengoMUCHOS$$$

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Introduccin a la programacin

m LOS400GOLPES
n) quieroUNAsolucin

Planteamiento: Hay que tener en cuenta que un identificador slo puede estar formado por letras y dgitos y
que debe comenzar exclusivamente por una letra.
En Java tambin se consideran letras los caracteres subrayado y $, aunque este ltimo se utiliza slo de forma
especiaJ.

Solucin:
a) No es correcto. pues tiene un espacio en medio.
b) Es correcto. pues est formado slo por 1etras.
c) Es correcto. pues est formado por letras y tiene un dgito en medio.
d) No es correcto, pues comienza por un dgito yeso no es vlido.
e) Es correcto. pues est formado slo por letras. ya que el carcter subrayado se considera
tambin como una letra.
~ No es correcto. pues tiene un espacio en medio.
g) Es correcto. pues el carcter subrayado se considera una letra. Por tanto, el identificador
est formado slo por letras.
h) No es correcto. pues el carcter guin no se considera una letra ni un dgito.
i) No es correcto. pues los caracteres de abre interrogacin y cierra interrogacin no se
consideran letras ni dgitos.
j) No es correcto. pues el carcter tanto por ciento no se considera una letra ni un dgito.
k) Es correcto. pues est formado por letras y tiene dgitos en medio.
1) Es correcto. pues el smbolo $ se considera tambin una letra.
In) Es correcto. pues est formado por letras y tiene dgitos en medio.
n) Es correcto. pues est formado slo por 1etras.

Ejercicio 1.5:
Dados los siguientes identificaitores que se van a utilizar en un programa escrito en Java, diga cules de ellos
son correctos y cules no. Justifique su respuesta.

a) descarta2
b) cuntoeQuerrs
c) CarrsMesas
d) raVaBienAvec$$
A

e) Egresa
f) osterreicb
g) Nosyevan
h) EsaCflAA a:/EoooilyO "L0

Solucin:
a) Es correcto. pues est formado slo por letras y acaba en un dgito.
b) Es correcto. pues est formado slo por letras.
c) Es correcto. pues est formado slo por letras y un dgito en medio.
d) Es correcto. pues est formado slo por letras, ya que la c con cedilla es una letra y el
carcter $ se considera una letra.
e) Es correcto. pues est formado slo por letras, ya que la E tal como est acentuada es una letra.
~ Es correcto. pues est formado slo por letras. ya que la o con diresis es una letra.
g) Es correcto. pues est formado slo por letras. ya que la y con diresis es una letra.
h) Es correcto. pues est formado slo por letras.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

VARIABLES Y EXPRESIONES ARITlVlTICAS

Ejercicio 1.6:
Escriba un programa que escriba en la pantalla cunto le costar comprar unas deportivas cuyo precio de
catlogo es de 85,00 , si sabe que puede conseguir una rebaja del J 50/0.

Planteamiento: Hay que realizar el clculo de 85,00 menos el 15%, para ello se utiliza la frmula (85*(1-
0,15)). Hay que tener cuidado, pues en Java los nmeros con decimales utilizan el punto decimal, Se llamar
al programa CompraZapati llas.

Solucin:
public class CompraZapatillas {
public static void main(String[] args) {
System.out.print(85.00 * (1 - 0.15; Se utiliza
elpunto decimalpara los
nmeros reales.
}
}

Comentario: Al ejecutar el programa en la pantalla aparece 72.25, cuyo valor tambin se puede calcular como
(85 * 0.85).

Ejercicio 1.7:
Escriba un programa que escriba en la pantalla cunto le dar su banco despus de seis meses si pone 2000 en una
cuenta a plazo fijo al 2, 750/0anual. Recuerde que al pagarle los intereses el banco le retendr el 180/0para hacienda.

Planteamiento: Hay que realizar el clculo de 2ooo al 2,75%, es decir, los intereses son 2000*2,75/100/2, ya
que seis meses es Y2 del ao. De esos intereses le retienen el 18%, por lo que realmente el banco le pagar
2000*2,75/100/2 * (1-0,18).

Solucin:
public class Calculolntereses {
public static void main(String[] args) {
System.out.print(2000*2.75/100/2 * (1-018: --1 Se utiliza
elpunto decimalpara los
nmeros reales.
}
}

Comentario: Al ejecutar el programa en la pantalla aparece 22.55.

Aviso: En la expresin se han mezclado nmeros reales y nmeros enteros. Por tanto, se est haciendo una conver-
sin automtica de tipos, convirtiendo todos los valores a reales y haciendo las operaciones entre nmeros reales.

Ejercicio 1.8:
Escriba un programa que escriba en la pantalla cunto le dar su banco despus de seis meses si pone 2000
en una cuenta a plazo fijo a12, 750/0anual. Recuerde que al pagarle los intereses el banco le retendr el 180/0
para hacienda. Escriba los mensajes apropiados para entender todos los clculos.

Planteamiento: Hay que realizar el clculo de 2ooo al 2,75%, es decir, los intereses son 2000*2,75/100/2, ya
que seis meses es Y2 del ao. De esos intereses le retienen el 18%, por lo que realmente el banco le pagar
2000*2,75/100/2 * (1-0,18).

Solucin:
public class Calculolntereses {

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Introduccin a la programacin

public static void main(String[] args) {


System.out.println("Clculo de intereses. "): Se han puesto los clculos entre
parntesis por claridad.
System. out. pri nt 1n( "Dinero ingresado: 2000."):
System. out. pri nt 1n(" Inters anua 1: 2.75%"):
System.out.println("Intereses a los seis meses: " + (2000*2.75/100/2)): ----'
System. out. pri nt 1n( "Retenci ones real izadas: " + (2000*2.75/100/2 * 18/100)):
System. out. pri nt 1n "Intereses cobrados: " + (2000*2.75/100/2 * (1 - O 18))):
}
}

Aviso: Hay que tener cuidado al realizar clculos e impri mirlos. Si se hubiese realizado una suma en lugar de
un producto y se hubiese escrito:

System.out.println("La suma de 2 + 2 vale: " + 2+2):

se hubiese impreso en la pantaUa:

la suma de 2 + 2 vale: 22

Es decir, los operadores + se evalan de izquierda a derecha, por lo que se concatena el texto con el primer 2,
y el resultado es un texto. A conti nuacin se concatena el texto con el segundo 2, pues hay otra operacin +,
dando como resultado La suma de 2 + 2 vale: 22. Sin embargo, si se escribe:

System. out. pri nt 1n( "El producto de 2 * 2 vale: " + 2 * 2);

como el operador * tiene mayor precedencia que el operador +, en primer lugar se evala el operador *, por lo que
2*2 se evala a 4. A continuacin, se evala la concatenacin del texto con el 4, escribiendo, por tanto, en pantalla:

El producto de 2 + 2 vale: 4

Para escribir correctamente la suma de 2 + 2 hay que escribir la expresin aritmtica entre parntesis:

System out.pr-tnt lnc't,e suma de 2 + 2 vale: " + (2 + 2)):

Ejercicio 1.9:
Dadas las siguientes expresiones aritmncas, calcule cul es el resultado de evaluarlas.

a) 25 + 20- 15
b) 20'" 10 + 15 * 10
e) 20'" 10/2-20/5 *3
d) 15I 10 * 2 + 3 14 '"8

Planteamiento: Para cada una de las expresiones anteriores hay que tener en cuenta la precedencia de los
operadores. Corno slo constan de operadores aditivos y multiplicativos se harn primero los multiplicativos
de izquierda a derecha y luego los aditivos de izquierda a derecha. Hay que tener en cuenta tambin que como
todos los nmeros son nmeros enteros el resultado de todas las operaciones sern nmeros enteros.

Solucin:
a) 25 + 20 - 15
Se realizan las operaciones de izquierda a derecha, pues son todas aditivas:
25 + 20 - 15 45 - 15 30 = =

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

b) 20 * 10 + 15 * 10
Se realizan primero las operaciones multiplicativas de izquierda a derecha:
20* 10+15* 10=200+15* 10=200+150
Despus se realiza la operacin de suma
200 + 150 = 350
e) 20 * 10/2 - 20 / 5 * 3
Se realizan primero las operaciones multiplicativas de izquierda a derecha:
20* 10/2-20/5'" 3=200/2-20/5'" 3= 100-20/5 * 3= 100-4* 3= 100-12
Despus se realiza la operacin de sustraccin
100 - 12= 88
d) 15/10 * 2 + 3 /4* 8
Se realizan primero las operaciones multiplicativas de izquierda a derecha:
15/10 ", 2 + 3 / 4 * 8 = 1 * 2 + 3 / 4 * 8 = 2 + 3 / 4 * 8 = 2 + O'" 8 = 2 + O
Despus se realiza la operacin de suma
2+0=2

Comentarios: Hay que recordar que las operaciones entre valores enteros siempre son enteros. Por ello, en el
aprutado d) 15/10 se evala a 1 y, de la misma forma, 3/4 se evala a O.

Ejercicio 1.10:
Dadas las siguientes expresiones aritmticas, calcule cul es el resultado de evaluarlas. Suponga que las
variables a y b que aparecen son del tipo int ya tiene el valor 2 y b tiene el valor 4.

a) -(1+ 5 % b - a '" a
b) 5+3%7*b*a-b%a
e) (a+/)*(b+l)-b/a

Planteamiento: En cada una de las expresiones anteriores, cuando sea necesario el valor sustituye la variable
por su valor. En el clculo hay que tener en cuenta la precedencia de los operadores. Hay que tener en cuenta
tambin que como todos los nmeros son nmeros enteros el resultado de todas las operaciones sern nmeros
enteros.

Solucin:
a) -a + 5 % b - a * a
Antes de operar se va realizando la sustitucin de valores
Primero se evala la operacin unaria del signo - delante de la variable a. El- 2 se evala al valor -2 (se
representa por Ull signo menos ms pequeo)
-2+5%4-2*2=~+5%b-a*a
Despus se evalan las operaciones multiplicativas de izquierda a derecha
-2 + 5 % b - a * a = -2 + 5 % 4 - a * a = -2 + 1 - a * a = -2 + 1 - 2 * 2 = -2 + 1 - 4
Por ltimo se evalan las operaciones aditivas de izquierda a derecha
-2+1-4=-1-4=-5
b) 5 + 3 % 7 ,~b * a - b % a
Se evalan las operaciones multiplicativas de izquierda a derecha
5 + 3 % 7 * b * a - b % a = 5 + 3'" b * a - b % a = 5 + 3 * 4'~ a - b % a =5 + 12 * a - b % a =5 + 12 *
2 - b % a = 5 + 24 - b % a = 5 + 24 - 4 % 2 = 5 + 24 - O
Por ltimo se evalan las operaciones aditivas de izquierda a derecha
5 + 24 - O = 29 - O =29
e) (a + 1) * (b + 1) - b / a
En primer lugar se evalan las expresiones entre parntesis
(2 + 1) ,~(b + 1) - b / a = 3 ~,(b + 1) - b / a = 3 * (4 + 1) - b / a = 3 * 5 - b / a

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Introduccin a la programacin

Despus se evalan las operaciones multiplicativas de izquierda a derecha


3 * 5-b/a= 15-b/a= 15-4/2= 15-2
Por Jtimo se evala la operacin de sustraccin
15- 2 = 13

Comentarios: Cuando en una expresin hay expresiones entre parntesis, en primer lugar se evalan los
parntesis ms internos.

Ejercicio 1.11:
Escriba un programa que defina dos variables enteras para describir las longitudes de los lados de un
rectngulo. El programa debe calcular y escribir en la pantalla las longitudes de los lados, el perimetro y el
rea del rectngulo. (Suponga que el rectngulo mide l Scm de alto y 25cnl de ancho.)

Planteamiento: Se necesita declarar dos variables para guardar los valores de los lados. Como se dice que Jos
lados son nmeros enteros, las variables se declaran del tipo int. Para realizar los clculos se van a declarar
dos variables ms, una para el clculo del permetro y otra para el clculo del rea. Finalmente, se imprimirn
por pantalla todos los datos y resultados de los clculos.

Solucin:
public class Rectangulo (
public static void main(String[] args) (
int alto 15; Q

int ancho = 25:

int permetro = 2 * alto + 2 * ancho: Concatenacin de textos y valores


int rea ancho * alto: Q de forma mezclada.

System.out.print("El rectngulo mide" + alto + " de alto ");


System.out.println("y" + ancho +" de ancho."):
System.out.println( "El permetro del rectngulo es " + permetro):
System.out.println( "El rea del rectngulo es " + rea);
}
}

Comentarios: Fjese en los nombres elegidos para las variables, Es importante que se entienda bien para qu sirve
cada valor. Fjese tambin en la estructura del progrruna: primero la declaracin de variables y valores iniciales, un
segundo bloque de clculos a partir de las variables y un tercer bloque de presentacin de resultados. Tanto la elecci n
de nombres como la estructura utilizada facilitan seguir el programa y entender lo que hace fcilmente, Imagnese la
diferencia si las variables se hubiesen llrunado a, b, c y d. Sera casi imposible saber para qu sirve el programa

Ejercicio 1.12:
Escriba un programa para calcular el rea y el volumen de un cilindro. Para ello declare una constante que
guarde el valor de tt: Declare, tambin, variables para el dimetro y la altura del cilindro. Suponga para el
ejemplo que el cilindro tiene un dimetro de 15,5cm y una altura de 42,4cm.

Planteamiento: Se necesita declarar dos variables prua guardar Losvalores del dimetro y la altura del cilin-
dro, que debe ser del tipo double. Adems, hay que declarar una constante para el valor de 1t. El clculo del
rea y el volumen se realiza con las frmulas clsicas para elJo.

Solucin:
public class AreaVolumenCilindro {

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

public static void main(String[] args) {


final double PI e 3.14159265: Se declara PI como una constante.

double dimetro = 15.5: 1/ en cm.


double altura = 42.4: 1/ en cm.

double radio = dimetro 1 2:


double rea = 2 * PI * radio * radio + 2 * PI * radio * altura:
double volumen = PI * radio * radio * altura:

System.out.print("Para un cilindro de radio" + radio):


System.out.println(" y altura" + altura):
System.out.println("El rea es: " + rea):
System.out.println("El volumen es: " + volumen):
}
}

Comentario: Para utilizar el nmero PI podra haberse utilizado el que ya est definido en la biblioteca
matemtica, Para ello basta sustituir PI en las frmulas por Math. PI (consulte en el Captulo 2 cmo hacerlo).
Quiz el nmero de decimales que resulta al escribir los valores no sea el ms apropiado. Puede dar un formato
ms apropiado, con slo dos decimales, utilizando el siguiente fragmento de cdigo:

System.out.print("Para un cilindro de radio" + radio):


System.out.println(" y altura" + altura):
System.out.printf("El rea es: %.2f\n", rea):
System.out. printft "El vol umen es: %. 2f\n", volumen):

Adems printf() realiza una localizacin de los datos de forma que los nmeros reales aparecen escritos con
coma decimal como se hace habitualmente, El % significa que a continuacin aparecer una definicin de
formato, La expresin %.2f significa escribe un nmero real con dos dgitos despus de la coma. En el mismo
punto del texto donde se escribe esa definicin de formato se escribir el valor de la variable que aparece a
continuacin. El carcter \n al final del texto en el mtodo printf() es el carcter de fin de linea.

Ejercicio 1.13:
Escriba un programa que escriba en la pantalla cunto le dar su banco despus de seis meses si pone 2000
en una cuenta a plazo fijo al 2,75% anual. Recuerde que al pagarle los intereses el banco le retendr el 180/0
para hacienda. Utilice variables para manejar las cantidades y realizar los clculos. Escriba los mensajes
apropiados para entender todos los clculos.

Planteamiento: Para el clculo se necesitarn variables para guardar el dinero a invertir (doub1e), el tipo de
inters anual (double) y el nmero de meses de la inversin (i nt). Corno el tipo de retencin que se aplica es
fijo se declarar corno una constante de tipo doub1e (pues pudiera ser un nmero no entero). Tambin se
utilizar una constante que guarde el nmero de meses que tiene el ao.

Solucin:
public class CalculoIntereses {
public static void main(String[] args) {
final double RETENCIN= 18:
final int mesesAo = 12:

double capital Invertido = 2000: l/en euros

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Introduccin a la programacin

double intersAnual = 2.75:


int mesesInversin = 6:

double interesesObtenidos = capital Invertido *


intersAnual / 100 *
mesesInversin / mesesAo:
double retencin = interesesObtenidos * RETENCIN/ 100: ---11 Se hace conversinautomtica
de tipode inta double,
double interesesCobrados = interesesObtenidos - retencin:

System.out.println("Clculo de intereses."):
System.out.printf("Dinero ingresado: %.2f.\n", capital Invertido):
System.out. printf(" Inters anual: %.2f%%. vn". intersAnual): It===========~
System. out. pri ntf(" Intereses a 1os %d meses: %. 2f. \n" , Se imprimendos valores en orden
de-aparicin.
meseslnversin. interesesObtenidos):
System.out.printf("Retencin realizada: %.2f. \n". retencin):
System.out.printf("Intereses cobrados: %.2f. \n". interesesCobrados):
}
}

Comentario: Para escribir valores monetarios resulta muy apropiado el uso de printf() (impresin con
formato) pues permite decidir que se desean imprimir slo dos decimales. El formato %d indica escribir
un nmero entero y %f, un nmero real, Si aparece una definicin de formato (siempre empieza con %),
se sustituye cada una de ellas por las variables que se pongan a continuacin separadas por comas en el
mismo orden de aparicin, Los tipos de los valores deben coincidir con el formato indicado para ellos,
COIIlO % indica el principio de definicin de formato, si se desea escribir el signo % hay que ponerlo dos
veces,
, ,
EXPRESIONES ARITl\IIETICO-LOGICAS

Ejercicio 1.14:
Dadas las siguientes expresiones aritmtico-Igicas calcule cul es el resultado de evaluarlas,

a) 25 > 20 && 13 > 5


b) 10+4<15-3112*5+1>14-2*2
e) 4 * 2 <= 8 112 * 2 < 5 && 4 > 3 + 1
d) 10 <= 2 * 5 && 3 < 4 11/(8 > 7) && 3 * 2 <= 4 * 2-1
Planteamiento: Para cada una de las expresiones anteriores hay que tener en cuenta que se trata de expresio-
nes ari tmticas junto con operaciones de comparacin y operaci ones relaci onales, De acuerdo con la preceden-
cia de las operaciones habr que realizar las operaciones en el siguiente orden: operaciones aritmticas, opera-
ciones relacionales y, por ltimo, operaciones booleanas, Las operaciones booleanas tienen la siguiente
precedencia: primero la negacin, despus el y-lgico (&&) y, por ltimo, el o-lgico (11),

Solucin:
a) 25 > 20 && 13 > 5
Se realizan las operaciones de relacin
25 > 20 && 13 > 5 true && 13 > 5 =
Corno la parte izquierda del y-lgico (&&) vale true hay que evaluar la parte de la derecha:
true && 13 > 5 true && true =
Ahora se evala el &&
true && true = true

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

b) 10 + 4 < 15 - 3 112 * 5 + 1 > 14 - 2 * 2


Se evala la parte izquierda del operador o-lgico (11).Para ello se evala la relacin <, y para hacerlo hay
que evaluar las expresiones aritmticas a su izquierda y a su derecha
10 + 4 < 15 - 3112 * 5 + 1> 14 - 2 * 2 = 14 < 15 - 3112 '" 5 + 1 > 14 - 2 * 2 = 14 < 12112 *' 5 + 1 > 14
-2*2
Se evala el operador <
14 < 12112 * 5 + 1 > 14 - 2 * 2 = false 112 * 5 + 1 > 14 - 2 ,~2
Corno la parte izquierda del operador 11vale false hay que evaluar su parte derecha
false 112* 5 + 1 > 14-2 * 2=false 1110+ 1> 14- 2 * 2 =false 1111> 14-2 * 2=false 1111> 14-8=false
1111 > 6 = false 11true
Por ltimo se evala el operador 11
false 11true = true
e) 4 * 2 <= 8 112 * 2 < 5 && 4 > 3 + 1
Esta expresin se evala de izquierda a derecha. Corno tiene mayor prioridad el operador && que el
operador 11se evala corno si estuviese escrito (el 11(e2 && e3)), por tanto se evala el y si su valor es
false se evala la parte derecha del operador 11,por ello:
4 * 2 <= 8 112 * 2 < 5 && 4 > 3 + 1 = 8 <= 8 112 * 2 < 5 && 4 > 3 + 1 = true 112 * 2 < 5 && 4 > 3 + 1
Corno la expresin a la izquierda del operador 11vale true ya no es necesario evaluar la parte a su derecha
true 112 * 2 < 5 && 4 > 3 + 1 = true
d) 10 <= 2 ,~5 && 3 < 411 1(8) 7) && 3 * 2 <= 4 * 2 - 1
Teniendo en cuenta la prioridad de los operadores booleanos la expresin a evaluar tiene la siguiente
estructura: ((el && e2) 11(e3 && e4)). Por ello en primer lugar hay que evaluar la parte izquierda del
operador 11,y para ello en primer lugar la parte izquierda del primer operador &&, es decir, el.
10 <= 2 * 5 && 3 < 411 1(8) 7) && 3 * 2 <= 4 * 2 - 1 = 10 <= 10 && 3 < 411 1(8) 7) && 3 * 2 <= 4 *
2 - 1 = 10 <= true && 3 < 411 1(8) 7) && 30;02 <= 4 * 2 - 1
Corno la parte izquierda del primer operador && vale true se evala su parte derecha
true && 3 < 411 1(8) 7) && 3 * 2 <= 4 * 2 - 1 = true && true 111(8) 7) && 3 * 2 <= 4 * 2 - 1
Por tanto, el resultado de evaluar el primer operador && es true.
true && true 111(8) 7) && 3 * 2 <= 4 * 2 - 1 = true 111(8 > 7) && 3 * 2 <= 4 * 2 - 1
En este momento como el operador 11tiene a su izquierda el valor true, ya no necesita evaluar la parte a su
derecha, siendo el valor final de la expresin true
true 111(8 > 7) && 3 * 2 <= 4 * 2 - 1 = true

Ejercicio 1.15:
Dadas las siguientes expresiones aritmetico-togicas calcule cul es el resultado de evaluarlas. Suponga que
las variables a y b que aparecen son del tipo int ya tiene el valor 5 y b tiene el valor 3.

a) !(a>b&&2 *a<=b)
b) b++ > 3 11a + b <= 8 && !(a > b)
c) 0++ < 6 && (b += 2) < a
d) 0++ /2 < b && (a++ /2 > b 11(a * 2 < b * 4))
Planteamiento: En cada una de las expresiones anteriores se sustituye la variable por su valor cuando se vaya a
uti tizar. En el clculo hay que tener en cuenta la precedencia de los operadores. Hay que tener en cuenta tambin
que corno todos los nmeros son nmeros enteros el resultado de todas las operaciones sern nmeros enteros.

Solucin:
a) l(a> b && 2 * a <= b)
En primer lugar se evala la parte entre parntesis. Para ello se evala primero la parte izquierda del
operador &&
l(a> b && 2 * a <= b) = 1(5) 3 && 2 * a <= b) = l(true && 2 * a <= b)

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Introduccin a la programacin

Corno la parte izquierda del operador && vale true, hay que evaluar su parte derecha
!(true && 2 ,~a <= b) = (true && 2 * 5 <= 3) = !(true && 10 <= 3) = !(true && false)
De donde evaluando los operadores booleanos
!(true && false) = !(false) = true
b) b++ > 3 11a + b <= 8 && !(a > b)
Esta expresin se evala de izquierda a derecha, Corno tiene mayor prioridad el operador && que el
operador 11se evala como si estuviese escrito (el 11(e2 && e3, por tanto se evala el y si su valor es
false se evala la parte derecha del operador 11,por ello
b++ > 311 a + b <= 8 && !(a> b) = 3> 311 a + b <= 8 && !(a > b) =false 11a + b <= 8 && !(a > b)
Adems, al evaluar b++, b se incrementa en 1 pasando a valer 4, Corno la parte izquierda de la expresin
vale false hay que evaluar la parte derecha, Se comienza entonces por la parte izquierda del operador &&
false 11a + b <= 8 && !(a > b) =false 115+4 <= 8 && !(a > b) = false 119<= 8 && !(a > b) = false 119<=
8 && !(a > b) = false 11false && !(a> b)
Corno la parte izquierda del operador && vale false ya no es necesario evaluar la parte derecha
false 11false && !(a> b) = false 11false = false
e) a++ < 6 && (b += 2) < a
Esta expresin slo tiene un operador boolean &&, Por tanto, se evala en primer lugar su parte izquierda
a++ < 6 && (b += 2) < a = 5 < 6 && (b += 2) < a = true && (b += 2) < a
y el valor de la variable a se incrementa en 1 a 6, A continuacin se evala la parte derecha del operador
&&, (b += 2) aade a b el valor 2 y devuelve el valor resultado de la asignacin
true && (b += 2) < a = true && (5) < a = true && 5 < 6 = true && true = true
El resultado final es true y las variables a y b han quedado con los valores a = 6 y b = 5
d) a++ / 2 < b && (a++ / 2> b 11(a ,~2 < b * 4
Esta expresin consta de un operador booleano (&&) entre dos expresiones, por lo que en primer lugar se
evala su parte izquierda
a++ /2< b && (a++ / 2> b 11(a * 2 < b * 4 = 5/2 < b && (a++ / 2 > b 11(a * 2 < b * 4 =2 < 3 && (a++
/2> b 11(a * 2 < b * 4 = true && (a++ / 2 > b 11(a * 2 < b * 4
Tras obtener el valor de la variable a, esta se ha incrementado en 1, valiendo en este momento 6, COJllOla
parte izquierda del operador && vale true hay que evaluar su parte derecha, Para ello se comienza
evaluando la parte izquierda del operador 11
true && (a++ / 2> b 11(a ~,2 < b ", 4) = true && (6 /2> b 11(a * 2 < b * 4 = true && (3 > 3 11(a ,~2 <
b * 4 = true && (false 11(a * 2 < b * 4
Tras obtener el valor de la variable a, esta se incrementa en 1, valiendo en este momento 7, Corno la parte
izquierda del operador 11vale false hay que evaluar su parte derecha
true && (false 11(a * 2 < b * 4 = true && (false 11(14 < 12 = true && (false 11(false) = true && (false)
= false
Evalundose, finalmente, la expresin a falseo

Comentario: Cuando en una expresin hay expresiones entre parntesis, en primer lugar se evalan los
parntesis ms internos,

Ejercicio 1.16:
Dado el siguiente programa, indique qu escribe en pantalla: Justifique su respuesta,
public class OperadoresPrePostlneremento {
public static void main(String[] argsl (
int a=3, b=6, e:
e = a / b:
Systea.out.pr tnt.InEl valor de e es: " + e);
e = a % b:
Systea.out.pr tnt.InEl valor de e es: " + e);
a++:

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

System.out.println("El valor de a es: " + al:


++a:
System.out.println("El valor de a es: " + al:
e = ++a + b++:
System.out.println("El valor de a es: " + al:
System.out.println("El valor de b es: " + b):
System.out.println("El valor de e es: " + el:

e = ++a + ++b:
System.out.println("El valor de a es: " + al:
System.out.println("El valor de bes: " + b):
System.out.println("El valor de e es: " + el:
}
}

Planteamiento: En sentencias donde se utiliza el operador de preincremento y el de postincremento hay que


tener cuidado por que si es de postincrernento primero se observa el valor de la variable y, una vez se ha
utilizado, se incrementa el valor de la misma.

Solucin: Se imprime enpantaJla lo siguiente:

El valor de e es: O
El valor de e es: 3
El valor de a es: 4
El valor de a es: 5
El valor de a es: 6
El valor de bes: 7
El valor de e es: 12
El valor de a es: 7
El valor de bes: 8
El valor de e es: 15

El primer valor de e vale Opues se realiza la divisin entera. El segundo valor que se iruprime de e es 3 pues
se calcula el resto de la divisin entera de 3 con 6. La primera vez que se imprime el valor de a vale 4, pues
antes de imprimiro se incrementa su valor. La segunda vez ocurre lo mismo y vale entonces 5, pues se
incrementa, esta vez en preincrernento antes de imprimir su valor.
Los valores que se imprimen a continuacin de a y b son, efectivamente 6 y 7 respectivamente pues ambas
se han incrementado en la expresin que hay delante. Sin embargo, el valor que se imprime de e es de 12 pues
se realiza la suma de a ya incrementado (6) y b antes de incrementarse (6), ya que se utiliza el operador de
postincremento, lo que suma 12, Los ltimos valores de a, b y e son, respectivamente, 7, 8 Y 15, ya que al
impri mir a y b, ya se han incrementado y al guardar el valor en e se hace con los valores ya incrernentados, ya
que tanto pru'a a como para b se utiliza el operador de preincremento.

Ejercicio 1.17:
Dado el siguiente programa, indique qu escribe en pantalla: Justifique su respuesta.
publie elass ExpresionesConlncrementos {
publie statie void main(String[] argsl {
boolean expresin:
int a = 7:

expresin = 2 * 5 < 5 * 2 II a + 1 < 10 && ++a % 2 == O;

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Introduccin a la programacin

System.out.println("El valor de la expresin es: " + expresin):


expresin = 3 < 2 II ++a > 6:
System.out.println("El valor de la expresin es: " + expresin):

expresin = a++ < 10 && a % 2 == O && a <= 10:


System.out.println("El valor de la expresin es: " + expresin):

expresin = a++ < 10 II a % 3 == 2:


System.out.println("El valor de la expresin es: " + expresin):

System.out.printlnC"El valor de a es " + a):


}
}

Planteamiento: Al evaluar las expresiones aritmtico-lgicas, como ya se ha visto en los Ejercicios 1.14 y
1.15, la dificultad adicional es que hay que llevar cuenta de cmo se realiza el incrernento, bien preincremento
o bien postincremento, de la variable a.

Solucin: Se imprime enpantaJla lo siguiente:

,
El valor de la expreslon es: true
,
El valor de la expreslon es: true
,
El valor de la expreslon es: true
,
El valor de la expreslon es: true
El valor de a es: 11

En la primera expresin aritmtico lgica tanto la parte a la izquierda del operador && corno la de su derecha
valen true, ya que en la parte de la derecha al hacerse el incremento en preincrernento a valdr 8 y por tanto
8 % 2 vale, ciertamente, O. En la segunda expresin aritmtico lgica el valor de a se incrementa a 9, y este
valor s es mayor que 6 por lo que la expresin vale true. En la tercera expresin aritmtico lgica en la
primera comparacin del valor de a, esta variable vale 9 y, por tanto, s es menor que 10. Cuando pasa a
evaluar a en la siguiente comparacin a vale 10, por lo que al hacer 10 % 2, el valor es, efectivamente, O. En
Ia ltima comparacin tambin es cierto que 10 <= 10, por lo que la expresin completa vale true.
En la cuarta expresin aritmtico lgica en la primera comparacin del valor de a, esta variable vale lO y,
por tanto, es falso que sea menor que 10. Si n embargo, cuando se evala la parte derecha del operador 11a ya se
ha i ncrernentado al valor 11, por lo que s es cierto que 11 % 3 es igual a 2 y, por tanto, la ex presi n vale true.
Para terminar se imprime el valor de a, que COlllO se puede observar se ha incrementado en cuatro veces,
por lo que su valor final es de 1L

ENUMERADOS

Ejercicio 1.18:
Escriba un programa que defina un enumerado para los das de la semana. En el programa defina una
variable del enumerado y asgnele el valor del da que corresponde al martes. A continuacin, escriba por
pantalla dicha variable y escriba el valor del enumerado correspondiente al domingo.

Planteamiento: Los valores del enumerado se escriben, como indica el convenio, todos en maysculas. Para
declarar una vari able para este tipo de dato se utiliza el nombre dado al enumerado. Para asignarle el valor del
martes hay que poner delante el nombre del enumerado, un punto y el nombre del valor que corresponde al
Inrutes. Para escribir el valor del domingo se pone, de la misma forma, el nombre del enumerado, un punto y
el nombre del valor que corresponde al domingo.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Solucin:
public class Enumerados {

public enum DasSemana {LUNES. MARTES. MIERCOLES. JUEVES. VIERNES. SABADO. DOMINGO}

public static void main(String[] argsl (


DasSemana unD a = DasSemana .MARTES:

System.out.println("El da elegido es: " + unDa):


System.out.println("El ltimo da de la semana es: " + DasSemana.DO~lINGO):
}
}

Ejercicio 1.19:
Escriba en Java los siguientes tipos enumerados:

a) Los dias laborables


b) Los tres primeros meses del ao
c) Los calificaciones de un alumno
d) Los colores primarios
e) Los notas musicales
f) Los colores del arco iris
g) Los colores de sntesis de televisin

Planteamiento: Los valores del enumerado se escriben, como indica el convenio, todos en maysculas. Para
declarar los valores de cada uno de los enumerados se utilizarn los nombres que son de aplicacin para cada
uno de ellos.

Solucin:
a) Los das laborables
enum DasLaborab 1es {LUNES. MARTES. t1IRCOLES. JUEVES. VI ERNES}
b) Los tres primeros meses del ao
enum TresPrimerosHeses {ENERO. FEBRERO. HARZO}
e) Las calificaciones de un alumno
enum Calificaciones {NO_PRESENTADO. SUSPENSO. APROBADO.
NOTABLE. SOBRESALIENTE. MATRCULA_DE_HONOR}
d) Los colores primarios
enum ColoresPrimarios {ROJO. AMARILLO. AZUL}
e) Las notas musicales
enum NotasMusicales {DO. RE. MI. FA. SOL. LA. SI}
h) Los colores del arco iris
enum ColoresArcoIris {AMARILLO. ROJO. ANARANJADO. AZUL. VERDE. AIL. VIOLETA}
i) Los colores de sntesis de la televisin
enum ColoresTelevisin {ROJO. VERDE. AZUL}
O tambin en ingls, por ejemplo:
enum RGB {RED. GREEN. BLUE}

Ejercicio 1.20:
Escriba un enumerado para los tipos de lavado de un tnel de lavado que guarde la informacion de los
tiempos. Los tipos de lavado son bsico, normal y super y el tiempo que se tarda en cada uno es de 3, 5 Y 8
minutos, respectivamente. Escriba un programa que muestre su funcionamienio.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Introduccin a la programacin

Planteamiento: Se escribe el enumerado con los valores correspondientes. Hay que declarar un atributo para
el tiempo y un mtodo para obtenerlo. Para probarlo en una clase se declara una variable y se usa para ella el
mtodo que obtiene el tiempo.

Solucin:
enum TipoLavado{BASICO(3). NORMAL(5). SUPER(8):
private int tiempo:
TipoLavado(int tiempo){
this.tiempo = tiempo:
}

public int tiempo(){


return tiempo:
}
}

public class TunelLavado{


public static void main(String[] args){
TipoLavado lavadoSuper = TipoLavado.SUPER:

System.out.println("El lavado" + lavadoSuper +" tarda" + lavadoSuper. tiempo(;


}
}

ENTRADA DE DATOS DE USUARIO

Ejercicio 1.21:
Escriba un programa que solicite al usuario una cantidad en segundos y la convierta a das, horas, minutos
y segundos.

Planteamiento: Tras solicitar el nmero de segundos, el programa debe dividir sucesvamente el dato entre 60
para obtener los minutos, entre 60 para obtener las horas y entre 24 para obtener los das.

Solucin:
import java.util.*:

public class Segundos {


public static void mainCString[] args) {
int segundoslniciales. segundos. minutos. horas. das;

Scanner teclado = new Scanner(System.in):

System. out.printC "Introduzca un nmero de segundos: "):


segundosIniciales = teclado.nextlnt():

II se calculan los minutos y los segundos que restan


minutos = segundosIniciales I 60;
segundos = segundosIniciales % 60:

II se calculan las horas y los minutos que restan


horas = minutos / 60;

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

minutos = minutos % 60:

II se calculan los das y las horas que restan


das = horas I 24:
horas = horas % 24:

System.out.println(segundosIniciales + " segundos son" + das +


" das. " + horas + " horas. "+ minutos +
" minutos y " + segundos + " segundos."):
}
}

Ejercicio 1.22:
Escriba un programa que solicite al usuario el tan/ao del lado de un tringulo equiltero y. calcule su
perimetro y su rea.

Planteamiento: Tras solicitar el tamao del lado, que ha de ser un nmero real, pues es una medida que
seguramente no sea un nmero de metros o de centmetros exactos, se calcula el permetro como tres veces el
lado. Para calcular el rea se necesita la base, que es un lado, y la altura, que se obtiene utilizando el teorema
de Pitgoras entre un lado y la mitad de la base.

Solucin:
import java.util.Scanner:

public class TrianguloEquilatero {


public static void main(String[] args) throws Exception{
double lado:
double permetro. rea:

ji Se pide al usuario que introduzca por teclado el valor del lado


Scanner teclado = new Scanner(System.in):
System. out. print(" Introduzca un valor para el 1ado: "):
lado = teclado.nextDouble():

permetro = 3 * lado:
double altura = Math.sqrt(lado * lado - (lado/2.0) * (lado/2.0:
rea = lado * altura I 2:

System.out.print("El rea del tringulo de lado" + lado):


System. out. pri nt 1n(" es: " + rea):

System.out.print("El permetro del tringulo de lado" + lado);


System.out.println(" es: " + permetro):
}
}

Ejercicio 1.23:
Escriba un programa para calcular el consumo medio de un automvil. Para ello el programa debe solicitar
informacin sobre las tres ltimas veces que se repost combustible. De la primera solicitar el precio del
litro del combustible, el total pagado en llenar el depsito y el nmero de kilometros que marcaba el cuenta-
kilmetros. De la segunda vez slo solicitar el precio del litro del combustible y el total pagado en llenar el

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Introduccin a la programacin

depsito, y de la tercera vez, solicitar el valor que indicaba el cuenrakilmetros. Con estos datos debe
calcular el consumo por cada 100 km y el coste por kilmetro.

Planteamiento: Para calcular el consumo medio hay que tener en cuenta cuntos ki lmetros se han hecho
con el automvil y cuntos litros de combustible se han consumido, El total de litros de combustible
consumidos es la suma de litros de los dos repostajes realizados, ya que de lo que se reposte en el ltimo
no se puede conocer cuntos kilmetros se van a hacer hasta que se consuma el combustible que se ha
echado. A partir del precio por litro y el total pagado se puede obtener el nmero de litros que se han
echado en el depsito. Se har la suma de los litros segn se vayan introduciendo los datos. El consumo
por cada 100 km se calcula como el consumo total dividido por el nmero de kilmetros multiplicado por
100. El coste por kilmetro se calcula como lo que se ha pagado en los repostajes dividido por el total de
kilrnetros realizados.

Solucin:
import java.util.*:

public class Main (


public static void main(String[] args) (
double precioLitro. litros = O:
double pagado. coste = O:
int kmlnicial. kmFinal. kilmetros:

Scanner teclado = new Scanner(System.in):

System.out.print("Introduzca el precio por litro del primer repostaje "):


preci ol i tro = teclado. nextDoub 1e( ) :
System. out. pri nt(" Introduzca el coste total del primer repostaje: "):
pagado = teclado.nextDouble();
System. out. pri nt(" Introduzca el valor del cuentaki 1metros en el primer repostaje: "):
kmInicial = teclado.nextlnt();
litros = pagado/preciolitro:
coste = pagado:

System.out.println():
System.out.print("Introduzca el precio por litro del segundo repostaje: "):
preci ol i tro = teclado. nextDoub 1e( ) :
System. out. pri nt(" Introduzca el coste total del segundo repostaje: "):
pagado = teclado.nextDouble();
litros += pagado/preciolitro:
coste += pagado:

System.out.println();
System. out. pri nt(" Introduzca el valor del cuentaki 1metros en el tercer repostaje: "):
kmFinal = teclado.nextlnt();
kilmetros = kmFinal - kmInicial:

System.out.println("El consumo medio del automvil es de " +


(litros/kilmetros*lOO) + " litros por cada 100 Km."):
System.out.println("El gasto medio es de " + coste/kilmetros + " por kilmetro. "):
}
}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Aviso: Al utilizar la clase Scanner para leer los datos, stos se leen localizados. Esto significa que para
introducir un nmero real, por ejemplo el coste por litro, hay que escribirlo con coma decimal, no con punto
decimal. Si se hace con punto decimal dar un error al intentar convertirlo a un nmero vlido. Adems, si en
un momento que se esperaba un nmero entero, se introduce otro tipo de dato, el sistema termina abruptamente.

Ejercicio 1.24:
Escriba un programa que calcule cunto le dar su banco despus de realizar una imposicin a plazo fijo.
Para ello el programa debe pedir la cantidad que desea invertir en el banco, el tipo de inters anual que le
paga el banco por el (linero y el plazo que se mantiene la in.versin. El programa debe calcular el dinero que
se obtiene despus de dicho plazo. Recuerde que al pagarle los intereses el banco le retendr el 180/0para
hacienda. Escriba los mensajes apropiados para que el usuario pueda seguir el proceso de clculo realizado.

Planteamiento: Hay que realizar un programa que utilice variables donde se vayan recogiendo los valores que se
piden al usuario, que sern el capital a invertir (capital Invertido), el tipo de inters anual (intersAnual) y los
meses que se mantiene la inversin (meses Invers in). El dato de la retencin que se aplica sobre los intereses es fija
del 18%, por lo que se definir como una constante (RETENCION). Se declarar un objeto de la clase Scanner para
solicitar al usuario los valores y leerlos. Despus se realizarn los clculos y se imprimirn por pantalla los resultados.

Solucin:
import java.util.*:
pub 1ice 1ass Ca1cu lo 1nteresesUsua ri o {
public static void main(String[] args) {
final double RETENCION 18: Q

final int MESESAO= 12:


Scanner teclado = new Scanner(System.in);
System.out.print(" Introduzca 1a cantidad que desea invertir: "):
double capital Invertido = teclado.nextOouble():
System. out. pri ntt " Introduzca el inters anua 1 que 1e ofrece el banco: "):
double intersAnual = teclado.nextOouble():
System.out.print(" Introduzca el nmero de meses de la inversin: ");
int meseslnversin = teclado.nextlnt():

double interesesObtenidos = capital Invertido *


intersAnual / 100 *
meseslnversin / MESESAO:
double retencin = interesesObtenidos * RETENCION/ 100:
doub1e i nteresesCobrados = i nteresesObteni dos - retencin:

System.out.println():
System. out. pri nt 1n( "C1cu lo de intereses."):
System. out. pri ntf'( "Dinero a i nvert ir: %.2f. vn": capita 1Invert ido) :
System. out. pri ntf'( "Inters anual: %.2f%%.\ n". i ntersAnua 1) ;
System. out. pri ntf'(" Intereses a 1os %d meses: %.2f. vn" .
meseslnversi n. i nteresesObteni dos) :
System. out. pri ntf'( "Retencin que se rea 1iza: %.2f. vn", retencin):
System. out. pri ntf'(" Intereses a cobrar: %.2f. vn". i nteresesCobrados) :
}
}

Aviso: Recuerde que al utilizar la clase Scanner los datos se leen localizados, por lo que se debe introducir los
valores no enteros con coma decimal,

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

2.1 ESTRUCTURA DE UNA CLASE


Corno ya se ha comentado en el Captulo 1, la estructura de una clase suele seguir el siguiente esquema:

/**
* Estructura de una clase en Java
*1
public class NombreDeClase {
1/ Declaracin de 70S atributos de la c7ase

1/ Dec7aracin de los mtodos de la clase

l/El mtodo mein. que indica donde empieza la ejecucin


public static void main(String[] argsl {
1/ Declaracin de 7as variables del mtodo
AQUI HACE REFERENCIA AL METODO MAIN
l/Sentencias de ejecucin del mtodo

}
}

En el caso de ser una clase distinta de la clase principal, el mtodo main() no suele aparecer, Una clase es la
descripcin (modelo) de un tipo de objetos, Una aplicacin, un programa, se compone de un conjunto de clases, que
crean objetos que interactan entre s, El nombre de la clase se empezar, corno convenio de programacin, en
mayscula. Una vez que la clase est disponible, el programador puede instanciar, crear, objetos de dicha clase, Por
ello, los trminos "objeto" e "instancia de clase" o, simplemente, "instancia" se usan como sinnimos.
Para disponer de un objeto de la clase hace falta declarar una variable y crear el objeto, Suponga que dispone de
una clase Alumno de la siguiente forma, donde se ha supri mido su contenido:
EN JAVA PARA SE USA LA EXPRESION DECLARAR UNA VARIABLE PARA INDICAR QUE
class Alumno { } SE HA DECLARADO UN OBJETO NO OLVIDAR QUE UN OBJETO EN SI ES UN NUEVO TIPO DE
VARIABLE CREADA EN POO
La declaracin de variables es similar a la de una variable, como se ha hecho en el Captulo J.

NO OLVIDAR SE PUEDE DECLARAR UNA CLASE


Y LUEGO SE DECLARA UN OBJETO

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Alumno al umnol: PRIMERO SE DECLARA LOS OBJETOS alumn01 y alumno2 son referencias (identifican a un objeto en
Alumno alumno2: particular de la clase que los define ) de la clase Alumno
Para crear un objeto para cada variable, se utiliza el operador new:

alumnol = new Alumno(): SEGUNDO SE INSTANCIAN O CREAN LOS OBJETOS alumno1 y alumno2 que pertenecen a la
alumno2 = new Alumno(): clase Alumno

Referencia nu11 AVERIGUAR PARA QUE SIRVE LA REFERENCIA NULL


Una referencia a un objeto puede no tener asignada ninguna instancia Existe un valor especial, llamado nu 11, que indica
cundo una referencia no tiene asignada ninguna instancia. Corno ejemplo, se declara un nuevo al umno3 de la clase A1umno:

Alumno alumno3: II vale "nul l' por defecto

Se puede poner explcitamente una referencia a nu 11:

alumno2 = null: II vale "nul l " por asignacin explicita

Cuando una referencia a un objeto vale nu 11, no se puede utilizar como objeto, pues no existe como tal.

Referencias compartidas: alias


Es posible que se disponga de varias referencias a un mismo objeto. Si sobre las declaraciones anteriores de a1umnol
y a 1 umno2 se hace:

alumnol = alumno2: II asignacin de referencias

en este momento, las variables alumno] y alumnoz hacen referencia al mismo objeto de la clase alumno, Ello implica
que cualquier modificacin del objeto a1umnol modifica tambin el objeto al que hace referencia ahunno2, ya que
realmente es el mismo.

2.2 ATRIBUTOS
Los atributos permiten guardar la informacin de un objeto. Por ejemplo, para un alumno se necesita saber la siguien-
te informacin: el nombre, los apellidos, el curso en que est matriculado, si su horario es de maana o de tarde, etc.
Estos datos se almacenan en campos o atributos que se declaran como variables en el mbito de la clase. La declara-
cin de atributos se hace de la siguiente forma:

enum Horario { MAANA.


TARDE} II posibles horarios

class Alumno {
String nombre:
String apellidos:
int aoDeNacimiento:
int nmeroPersonal: II NmeroPersonal: identificativo nico
Stri ng grupo:
Horario horario e Horario MAANA:
}

En este ejemplo, se ha declarado que la clase A1umno contiene seis atributos, nombre, ape 11 idos, aoDeNaci miento,
nmeroPersona 1, grupo y horari o. El Horari o se ha definido corno un enumerado con dos posibles turnos, MAANA y

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

TARDE. Como puede observar se puede dar un valor inicial a los atributos en la declaracin. De esta forma se ha
indicado que el horario predeterminado para un alumno es el de maana.
Si los atributos no se declaran como privados I protegidos (consulte el Captulo 3), se puede acceder a sus valores
con la notacin objeto. atributo. Por ejemplo, para imprimir por pantalla el nombre del al umnol, se puede escribir:

System.out.println("El nombre es: "+ alumnol.nombre):

Aunque es posible acceder a un atributo de la forma indicada, suele ser preferible acceder a los mismos mediante
un mtodo, llamado en este caso mtodo de acceso.

e> Sobre los atributos consulte los Ejercicios 2.1 y 2.2.

,
2.3 METODOS
Los mtodos sirven para definir el comportamiento del objeto en sus interacciones con otros objetos. Siguiendo el
ejemplo de objetos de la clase Alumno se puede pedir su nombre, asignarle grupo, etc.

enum Horario { MAANA.TARDE} // posibles horarios

class Alumno {
String nombre:
String apellidos:
int aoDeNacimiento:
int nmeroPersonal: // NmeroPersonal: identificativo nico
Stri ng grupo:
Horario horario e Horario MAANA;

public String dameGrupo() { ... }


public void ponGrupo(String nuevoGrupo) { ... }

Se han aadido dos mtodos a la clase Al umno, uno llamado dameGrupo( ) para pedir a un objeto de la clase Alumno
el grupo al que asiste a clase y otro ponGrupo() para poder asignar un nuevo grupo a un Alumno. Se ha omitido por
claridad el cuerpo con el cdigo de los mtodos.
Para utilizar un mtodo de la clase se utiliza la notacin objeto. metodo(), pasando entre los parntesis los argu-
mentes que necesite el mtodo al que se llama. Por ejemplo, para dar al al umnol el grupo" 1NF- 01" Y luego imprimir
por pantalla el grupo que tiene asignado, solicitndoselo mediante su mtodo dameGrupo(), se puede escribir:

alumnol.ponGrupo("INF-Ol"):
System. out. pri nt 1n( "El alumno est en el grupo: " + al umnol. dameGrupo( :

Adems de utilizar los nombres ponXxxO para los mtodos que asignan un valor a un atributo y dalneXXXX()
para los mtodos que devuelven el valor del atributo, suele ser comn utilizar la forma inglesa setXXXX() y getXXXXO,
respectivamente. En los ejemplos de los distintos captulos, se usar una u otra indistintamente, prefirindose la
versin inglesa en los captulos avanzados.

Valor de retomo
Los mtodos pueden realizar una funcin y no devolver un valor, lo que se indica con la clusula votd, o pueden
comportarse como una funcin y devolver un valor primitivo o una referencia a un objeto. En este caso, se pone

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

delante del nombre del mtodo el tipo o clase del valor devuelto. En el caso del mtodo dameGrupo( J, el mtodo
devuelve una referencia a un objeto de la clase Stri ng. Para devolver un valor dentro del mtodo, se utiliza la
sentencia return. El mtodo dameGrupo( J se puede escribir:

public String dameGrupo(){


return grupo:
}

Autoreferencia thi s
Para referirse a los atributos del objeto desde un mtodo del mismo, se puede hacer directamente con su nombre o
utilizando thi s. Esta palabra del lenguaje se utiliza, sobre todo, cuando existe ambigedad entre nombres de parmetros
de un mtodo y atributos del objeto (otros usos se explican ms adelante). Por ejemplo, en el siguiente mtodo

publ ic void ponGrupo(String grupo. Horario horario) {


this.grupo = grupo:
this.horario = horario:
}

thi s funciona una referencia especial, de forma que thi s. grupo se refiere al atributo grupo declarado en la
COIUO
clase, para diferenciarlo de la variable grupo declarado como parmetro del mtodo,

Sobrecarga
La nica limitacin en la eleccin del nombre de un mtodo es que, en una clase, todos los mtodos deben tener
diferente signatura (bsicamente distinto nombre y parmetros). Esto permite que existan varios mtodos con el
luismo nombre pero con diferentes parmetros. Por ejemplo, se podran tener dos mtodos de nombre ponGrupo().

public void ponGrupo(String grupo. Horario horario){


this.grupo = grupo:
this.horario = horario:
}

public void ponGrupo(String grupo){


this.grupo = grupo:
}

Dependiendo de los valores de los argumentos con que se llame al mtodo ponGrupo , se ejecutara uno u otro de los
definidos.

Sobre la definicin y uso de mtodos consulte los Ejercicios a partir del 2.2.
Sobre la sobrecarga de mtodos consulte los Ejercicios 2.17, 2.18.

2.4 CONSTRUCTORES
Al principio del captulo se ha visto que para crear un objeto se usa la instruccin new seguida del nombre de la clase
y una pareja abre parntesis - cierra parntesis:

Alumno alumnol= new Alumno();

Esta operacin invoca al constructor por defecto, que se proporciona automticamente y tiene el mismo nombre
que la clase.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

Lo habitual es que al escribir una clase se desee construir los objetos de la clase de una determinada forma. Para
ello se escribe uno o ms constructores. Para definir uu constructor, se pone el tipo de acceso, el nombre de la clase,
los parmetros que acepta, si lanza excepciones (opcional) y un cuerpo o bloque de cdigo, de la forma:

acceso nombreel ase (parmetros) throws excepci ones { cuerpo }

AS.,para la clase Alumno, se pueden proporcionar dos constructores: uno que recibe el nombre, los apellidos y el
ao de nacimiento; y otro que, adems, aceptase el grupo y el horario. El cdigo sera el siguiente:

c1ass Alumno {
Alumno(String nombre. String apellidos. int ao) {
this.nombre = nombre:
this.apellidos = apellidos:
this.aoDeNacimiento = ao:
}

Alumno(String nombre. String apellidos. int aoDeNacimiento.


String grupo. Horario horario) {
this.nombre = nombre:
this.apellidos = apellidos:
this.aoDeNacimiento= aoDeNacimiento:
thi s. grupo e grupo;

thi s. hora ri o e horari o;


}

II resto de la clase. igual


}

Los constructores declarados sustituyen al proporcionado por defecto. Por tanto, el constructor por defecto ya no
se puede utilizar. Ahora, para construir cualquier alumno es necesario proporcionar los valores apropiados de acuerdo
con el constructor que se utilice:

Al umno al umol= new Al umno( "Juan". "Garc a". 1980):


Alumno alunnoz= new Alumno("Hara", "Lpez". 1981, "INF-01". Horario TARDE):

Ahora sera ilegal el siguiente cdigo:

Alumno alumn02= new Alumno(): II error: no hay constructor sin parmetros

El uso de los constructores permite comprobar que los objetos se construyen apropiadamente con valores correc-
tos. Si los valores pasados al constructor no son apropiados, se puede lanzar una excepcin para no crear el objeto.
Para conocer ms sobre el uso y manejo de excepciones, consulte el Captulo 4.

c1ass Alumno {
Alumno(String nombre. String apellidos. int ao) throws Exception {
II Si el nombre o los apellidos son cadenas null
II se lanza una excepcin y el objeto no se crea
i f (nombre ce nu11 11 ape 11idos c= nu 11 )
throw new Except ion ( "Argumentos no v 1idos" ) :

II Si el ao es negativo

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

II se 7anza una excepcin y e7 objeto no se crea


if (ao < O)
throw new Exception( "Ao incorrecto"):

this.nombre= nombre:
this.apellidos apellidos: Q

this.aoDeNacimiento= ao:
}
II resto de la clase. igua7
}

~ Sobre la defLnicin de constructores consulte los Ejercicios 2.8, 2.10 Y 2.18.

Autoreferencia thi s
En la construccin de objetos se puede utilizar un constructor ya definido desde otro constructor. Para ello se utiliza
la referencia this() seguida de los parmetros del constructor que se desea invocar. Esta llamada slo se puede
realizar como primera sentencia de un mtodo. De esta forma, los constructores de la clase se pueden escribir:

c1ass Alumno {
Alumno(String nombre. String apellidos. int ao) throws Exception {
II Si el nombre o los ape71idos son cadenas nu71
II se 7anza una excepcin y el objeto no se crea
if (nombre =c nu11 1I ape 11idos c= nu 11 )
throw new Except ion ("Argumentos no v 1idos" ):

II Si e7 ao es negativo
II se 7anza una excepcin y el objeto no se crea
if (ao < O)
throw new Exception( "Ao incorrecto"):

this.nombre= nombre:
this.apellidos= apellidos:
this.aoDeNacimientoc ao:
}

II constructor de 7a clase a7umno con grupo y horario


II Se invoca al constructor anterior para comprobar y poner
II e 7 nombre, ape 17idos y ao de nacimiento
Alumno(String nombre. String apellidos. int aoDeNacimiento,
String grupo. Horario horario) throws Exception {
this(nombre. apellidos. aoDeNacimiento):

if (grupo == nu11)
throw new Exception( "Grupo no especi ficado"):

this.grupoc grupo:
this.horario= horario:
}

II resto de la clase. igua7


}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

ATRIBUTOS

Ejercicio 2.1:
Definir una clase que represente a un coche. En la definicin se debe incluir:

el modelo,
el color,
si la pintura es metalizada o no,
la matricula,
el tipo de coche, que puede ser MINI, UTILITARIO, FAMILIAR o DEPORTIVO
el ao de fabricacin
la modalidad del seguro, que puede ser a terceros o a todo riesgo

Planteamiento: Al disear una clase, hay que prestar especial atencin a los atributos que se incluyen y sus
tipos. Para los atributos hay que elegir nombres significativos, por ejemplo, "modelo" es un buen nombre para
el atributo que representa el modelo del coche. Al elegir el tipo de un atributo, se debe pensar tanto en los
valores que puede tomar, como en las operaciones que se van a aplicar.
Para el modelo, el color y la matrcula, se elige el tipo String. Para determinar condiciones que se satisfa-
cen o no, se debe elegir un boo 1ean, como es el caso de si la pintura es metalizada o no.
Cuando un atributo puede tomar una serie de valores, lo ms adecuado es utilizar un tipo enumerado,
eligiendo los nombres adecuados para los diferentes valores. De esta forma, para el tipo de coche se usa un
enumerado con los valores que sugiere el enunciado.
Para el ao de fabricacin, se usa un nmero entero. Evidentemente, valores negativos o muy grandes
podran no ser legales, pero queda a cargo del programador comprobarlo.
Por lti Ino, para la modalidad de seguro, de nuevo es adecuado un enumerado, con los valores { A TERCEROS,
A_TODO_RIESGO}.

Solucin:
enum TipoDeCoche { MINI. UTILITARIO.FAMILIAR.DEPORTIVO
}:

enum TipoDeSeguro { A_TERCEROS.


A_TODO_RIESGO
}:

public class Coche {

String modelo:
String color: Los nombres de los atributos han de
boolean esMetalizado: ser lo ms significativos posible, pero
String matricula: no han de ser demasiado largos.
TipoDeCoche tipo:
int aoDeFabricacin:
TipoDeSeguro seguro: Escoger adecuadamente los tipos de
los atributos no siempre es tarea fcil.

Comentario: Se podra pensar en uti Iizar un valor de tipo boo 1ean para la modalidad de seguro, por ejemplo,
bool ean seguroATerceros. Se usara el valor true cuando se disponga de un seguro a terceros, y fa 1se cuando
el seguro sea a todo riesgo. En general, no es una buena decisin usar los booleanos para atributos que toman

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

dos valores. Por un lado, no queda claro el significado del valor fa 1se. Por otro, se pueden aplicar operaciones
que quiz no tengan sentido. Lo peor es que compromete la extensibilidad del programa: si se necesitara otra
modalidad de seguro habr que modificar muchas lineas de cdigo, mientras que aadir un valor nuevo a un
enumerado es sumamente sencillo.

Aviso: En este problema se ha abordado la eleccin de los atributos y sus tipos, sin tener en cuenta el tipo de
acceso de los mismos; esto se tratar en posteriores ejercicios.

Ejercicio 2.2:
Se desea imprimir el modelo y el color de un coche dado. Para ello, se pide escribir un mtodo, que acepte un
objeto de la clase Coche. Si dicha referencia no es null, el mtodo deber imprimir el modelo y el color. Si es
null, el mtodo no har nada.

Planteamiento: No se dice el nombre del mtodo, por lo que se elige uno significativo del problema, por
ejemplo, i mpri meCoche. Este mtodo acepta una referenci a de la clase Coche. Se usa una sentencia i f para
comprobar si la referencia es null o contiene un objeto, en cuyo caso se imprime el modelo y el color.

Parmetros: La referencia a un objeto de la clase Coche.

Valor de retorno: El mtodo no necesita devolver ningn valor de retorno por lo que se utiliza la clusula void.

Solucin:
public void imprimeCoche (Coche coche) {

if (coche != null) { Paraaccederalvalorde losatributos,


System.out.println("El coche" + coche.modelo + se poneelnombredelobjeto,un
" es de color" + coche.color): puntoy elnombredelatributo.
}
}

Comentario: En el ejercicio siguiente se ver una forma ms conveniente de escribir mtodos que aaden
comportamiento a una clase.

Aviso: ES un error comn que en ejecucin se use un mtodo o atributo de una referencia que est a null. Esto
provoca un error en tiempo de ejecucin (RunTimeError) denominado Null Poi nterExcepti on, que normalmen-
te terminar la ejecucin del programa, Es una buena prctica asegurarse de que al usar una referencia, no
contendr el valor especial nu 11.

MTODOS

Ejercicio 2.3:
Aadir a la clase Coche del Ejercicio 2.1 un mtodo de nombre imprimetloche que imprima el modeto y el
color del coche.

Planteamiento: Cuando se invoca un mtodo de un objeto, desde el mismo se puede acceder directamente a los
atributos de la clase. Por tanto, simplemente se han de imprimir los atributos modelo y color.

Parmetros: Ninguno. Al ser un mtodo de la clase Coche, no necesita ningn valor como parmetro ya que se
dispone del modelo y color del coche como atributos.

Valor de retorno: El mtodo no necesita devolver ningn valor de retorno por lo que se utiliza la clusula void.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

Solucin:
enum TipoDeCoche { MINI. UTILITARIO. FAMILIAR. DEPORTIVO }:

enum TipoDeSeguro { A_TERCEROS. A_TODO_RIESGO }:

class Coche {

String modelo:
String color:
boolean esMetalizado:
String matricula:
TipoDeCoche tipo: Elcomportamientode laclase
Coche se recoge en su definicin.
int aoDeFabricacin:
TipoDeSeguro seguro:

public void imprimeCoche () { Los atributosdelobjetodentrode la


System.out.println( "El coche" + modelo + misma clasese usan directamente,
" es de co lo r " + color): sincualificacin.
}
}

Comentario: Este ejercicio es similar al anterior en cuanto a funcionalidad. Sin embargo, el comportamiento
de los objetos ha de recogerse siempre en la definicin de la clase y no depender de funciones externas en la
medida de lo posible.

Ejercicio 2.4:
Escribir un programa que tenga una instancia de mi coche, que es un Rolls Royce de color dorado. El
programa ha de imprimir un mensaje que diga de qu modelo y color es mi coche.

Planteamiento: Los objetos han de usarse por medio de referencias. Por tanto, habr que declarar una referen-
cia a la clase Coche. Adems, hay que elegir un nombre significativo para la referencia. COJlIO en este caso, se
guarda la informacin de mi coche, el nombre miCoche (u otro si mil m')puede ser adecuado. Luego se inicializan
los atributos modelo y color. Para ello, se escribe el nombre de la referencia, un punto, y el nombre del atributo,
de la forma mi Coche. modelo. y con el operador de asignacin ("=") se le asigna el valor "Ro 11s Royce". Lo
luismo aplica al atributo color. Por ltimo, se impri men esos valores; como la clase Coche ya dispone del
mtodo imprimeCoche() (del ejercicio anterior), se puede invocar dicho mtodo de la forma
miCoche. impri meCoche( ).

Solucin:
enum TipoDeCoche { MINI. UTILITARIO, FAMILIAR. DEPORTIVO }:

enum TipoDeSeguro { A_TERCEROS. A_TODO_RIESGO };

class Coche {

String modelo:
String color:
boolean esMetalizado:
String matricula:
TipoDeCoche tipo:
int aoDeFabricacin:

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

TipoDeSeguro seguro:

public void imprimeCoche () {


System.out.println("El coche" + modelo +
" es de color" + color):
}
}

class pruebaCoche {
public static void main (String args[J) {
Coche miCoche= new Coche():

miCoche.modelo= "Rolls Royce":


miCoche.color= "dorado":

miCoche.imprimeCoche(): Se invocaa ciertocomportamiento


de losobjetosde tipoCoche.
}
}

Comentario: La salida por pantalla que produce el programa es:

El coche Rolls Royce es de color dorado

Ejercicio 2.5:
Escriba una clase que represente un Semforo, que podr estar rojo, mbar o verde. La clase tendr un
atributo llamado color; inicialmente a rojo. Tambin dispondr de un atributo que determine si el semaforo
est parpadeando. Inicialmente, el semforo no est parpadeando.

Planteamiento: Para describir el color del semforo, se usa un tipo enumerado con los tres posibles colores
denominado CoIorSerforo. Despus, se escribe la clase Semforo, que tendr dos atributos: el primero ser el
color, de tipo Ca 1 orSem foro; el segundo representar si el semforo est parpadeando, para lo que se usa un
boa 1 ean.

Solucin:
enum ColorSemforo { ROJO. MBAR.VERDE}: ----~I Este enumeradorepresentael color
que puede tomarun semforo.
public class Semforo {
Se puedeninicializarlosatributosde
ColorSemforo color = ColorSemforo. ROJO: unobjetoen la mismalneaquese
boolean est Parpadeando e false: declaran.

Comentario: Los atributos de los objetos pueden tomar un valor iniciaJ en la misma lnea que se decla-
ran. No obstante, lo normal es que cada objeto tenga vaJores distintos, en cuyo caso se proporcionar
uno o ms constructores para el valor inicial de los atributos de un objeto, corno se ver en siguientes
ejercrci os.

Aviso: Para los atributos que especifican condiciones que se cumplen o no, es Inuy habitual utilizar el tipo
boa 1ean. Los nombres de dichos atributos suelen ser adjetivos o, como en el ejemplo, una palabra formada por
el verbo "estar" y la condici 6n.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

Ejercicio 2.6:
Escriba un programa que instancie un semforo de la clase Semforo del. ejercicio anterior. El. programa
escribir por pantalla el color del semforo. Luego poneIr el. semforo en mbar y volver a imprimir el
color.

Planteamiento: Se define una clase para el mtodo mai n(), que se llamar PruebaSemforo. En dicho mtodo
maine), se declara un semforo, llamado si, por ejemplo. Se instancia mediante new un objeto de la clase
Semforo y se asigna a s l. Ahora se puede imprimir su color, luego se cambia a mbar y se vuelve a imprimir,

Solucin:
enum ColorSemforo { ROJO. MBAR. VERDE }:

class Semforo {

ColorSemforo color = ColorSemforo.ROJO:


boolean est Parpadeando = false;
}

class PruebaSemforo {

public static void main (String args[]) {


Semforo sl:

sI = new Semforo(): Se crea el objeto semforo con la


instruccin ne'N,

System.out.println("SI est" + sl.color):


Para poner un valor de un tipo
sl.color = ColorSemforo.MBAR: enumerado, se escribe el nombre
System.out.println("SI est" + sl.color): del tipo, un punto y el valor deseado.
}
}

Comentario: Hasta que no se genera el objeto con new, la referencia si contiene el valor null (inicializacin
por defecto de Java). Es muy comn hacer ambas cosas en la misma lnea, como se presenta a continuacin:

Semforo sI = new Semforo();

Aviso: La forma utilizada en la solucin para acceder a Losatributos no se considera la ms adecuada. Ya se


ver en otros ejercicios los mtodos accesores y Losderechos de acceso. En el siguiente captulo se har hinca-
pi en el terna,

Ejercicio 2.7:
Escriba un programa que disponga de una clase para representar las asignaturas de una carrera. Una asig-
natura tiene un nombre, un cdigo numrico y el curso en el cual se imparte. Los valores iniciales han de
proporcionarse en el. constructor. La clase ha de tener mtodos para obtener los valores de los atributos. El
programa ha de construir un objeto con los siguientes valores: nombre" Matemticas ", cdigo 1017, curso'.
A continuacin, el programa ha de imprimir los valores del objeto por pantalla.

Planteamiento: Se proporcionarn dos clases, una que representa a las asignaturas, llamada Asi gnatura, y
otra para el programa, llamada EjercicioAsignatura. La clase Asignatura dispondr de un constructor que
acepta los valores para representar una asignatura: el nombre, el cdigo y el curso. El nombre del constructor

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

es el mismo de la clase, Asignatura en este caso. Los atributos sern privados y se disponen de mtodos para
acceder a sus valores. Normalmente, estos mtodos denominados accesores, se suelen Uamar como el atributo,
anteponiendo el verbo dame o get. En Ia clase EjercicioAsi gnatura, habr un mtodo main(), en el que se crea
la asignatura de matemticas de primero y luego una sentencia para imprimir sus datos.

Solucin:
class Asignatura {

private String nombre: Conviene que los atributos sean


private int cdigo: privados y accesibles con mtodos
private int curso: explcitos.

public Asignatura (String nombre. int cdigo. int curso) {


this.nombre = nombre:
this.cdigo = cdigo;
this.curso = curso:
}
Mtodos accesores a los atributos.
public String dameNombre(){ Tpicamente estos mtodos se llaman
return nombre: dameAtri buto o getAtri buto.
}

public int dameCdigo(){


return cdigo;
}

public int dameCurso(){


return curso:
}
}

class EjercicioAsignatura {

public static void main(String args[]) {


Asignatura a = new Asignatura ("Hatemticas". 1017. 1):

System. out. printl n("Asi gnatura " + a.dameNombre() +


" cdigo " + a.dameCdigo() +
" del curso" + a.dameCurso(;
}
}

Comentario: Se podra haber incluido el mtodo main() en la clase Asignatura, con lo que con una sola clase
se hubiera resuelto el ejercicio. Es Inuy tpico aadir un main() a clases intermedias para probar o ejercitar la
clase, aunque dicho mtodo main() no forme parte del proyecto en el que participa la clase.
Respecto de los mtodos accesores, ntese que no disponen de parmetros, lo que se indica con los parn-
tesis vacos, como en dameNombre().Estos mtodos devuelven el mismo tipo que el atributo al que acceden.

Aviso: La codificacin de los mtodos accesores es tremendamente trivial, lo que suscita la tentacin de elimi-
narlos y poner los atributos como pblicos. Se desaconseja esta prctica, pues el programador ha de responsa-
bilizarse de una clase y no debe permitir que se modifiquen Losatributos de forma arbitraria.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

Ejercicio 2.8:
Definir una clase que represente un punto en un espacio bidimensional. La clase debe disponer de un cons-
tructor con las coordenadas del punto y mtodos acceso res a las coordenadas.

Planteamiento: En un espacio bidimensional, un punto se representa por un par ordenado de nmeros reales.
Se deben elegir nombres representativos para los IllS1UOS, como x e y. El tipo ms adecuado depender del tipo
de aplicacin en que se usen estos objetos. Como el enunciado no dice nada, se usar doub le. Para asegurar la
consistencia de un objeto, es conveniente que los atributos sean privados y existan mtodos pblicos para
averiguar su valor. Estos mtodos se llamarn dameX ( ) y dameY ( ), si IIparmetros, y con tipo de retorno igual al
del atributo que devuelven.

Solucin:
public class Punto (
Los atributosson privados,de forma
private double x. y: queslopuedenmodificarse
mediantemtodosde la clase.
public Punto(double x. double y) { Nteseel uso de thi s pararesolver
this.x = x: la ambigedadentrelosnombresde
this.y = y: los parmetrosy losatributos.
}

public double dameX(){


return x:
}

public double dameY(){ Losmtodosaccesoresproporcionanla


-------11 informacinadecuadasobreelobjeto.
return y:
}
}

Comentario: Fjese que se ha elegido doub 1e como tipo para las coordenadas. No obstante, ciertas aplicacio-
nes (por ejemplo, grficos) podran requerir int, o podra ser suficiente float.

Aviso: Se ha elegido representar el punto en coordenadas cartesianas. Se podra representar en polares, lo que
supondra tener que programar las conversiones entre los diferentes sistemas de representacin.

Ejercicio 2.9:
Escriba un programa que instancie cuatro puntos: el primero situado en el origen, el segundo situado en
(5, 3), el tercero en (2, -1) Y para el cuarto como punto medio entre el segundo y el tercero.

Planteamiento: Los tres primeros puntos se crean con los valores literales que nos proporciona el enunciado.
Para el ltimo, se calculan sus coordenadas como las Inedias entre las respectivas coordenadas del segundo y
tercer puntos.

Solucin:
public static void main (String args[]) {
Punto pI = new Punto (O. O): /1 origen de coordenadas

Ejemplosdecreacinde objetos
Punto p2 = new Punto (5. 3): mediantenew,
Punto p3 = new Punto (2. -1):

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Punto p4 = new Punto p2.dameX() + p3.dameX(/2.


(p2.dameY() + p3 .dameY() )/2):
}

Comentario: Los tres primeros puntos se crean con los valores literales que nos indica el enunciado. Para el
cumto punto, se usan los mtodos accesores de los puntos, obteniendo las coordenadas de los puntos segundo
y tercero, haciendo luego la semisuma,
Para cremoobjetos, se usa la instruccin new seguida del nombre de la clase y despus, entre parntesis, los
parmetros para el constructor de la clase.

Ejercicio 2.10:
Aada a In clase Punto un constructor sin parmetros que permita construir puntos en el origen ele coordenadas.

Planteamiento: Se pide que los valores de las coordenadas sean (O, O). Se pueden inicializar directamente,
pero es ms conveniente invocar al otro constructor con los argumentos a O. De esta forma, se dispone de un
solo constructor que realiza el cdigo de inicializacin, Para invocar a otro constructor, se utiliza el nombre
especial thi s, seguido de los parmetros que espera ese constructor. En este caso, se escribe thi S (O, O). Esta
invocacin ha de aparecer como la primera sentencia del cuerpo del constructor.

Solucin:
ji slo se incluye el constructor. el resto del cdigo como
ji el ejercicio anterior
public Punto () {
this (O. O): -----11 Se invocaal constructoranteriorcon
losvaloresdeseados.
}

Comentario: Es muy adecuado tener diferentes constructores cuando se desea que el objeto tenga valores
iniciales tomados de diferente forma.

Aviso: Cuando los diferentes constructores tienen cdigo comn, es conveniente que linos se Uamen a otros, si
es posi ble, en lugar de repetir cdigo.

Ejercicio 2.11:
Aada un mtodo a la clase Punto que calcule la distancia a otro punto.

Planteamiento: El mtodo debe recibir como parmetro el punto al cual se calcula la distancia. Se aplica la
frmula de la distancia eucldea entre dos puntos con ayuda de la clase Math. En dos variables auxiliares se
almacenan las diferencias entre las coordenadas de los puntos.

Parmetros: El punto al cual se calcula la distancia, es decir, un objeto de la clase Punto.

Devuelve: Un double con el valor de la distancia al punto pasado como parmetro,

Solucin:
ji s670 el mtodo distancia
public double distancia (Punto p) {
double diffX = x - p.x:
double diffY = y - p.y:

}
return Math.sqrt (diffX * diffX + diffY * diffY): ]

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

Comentario: Para elevar uu nmero al cuadrado, se podra haber optado por la funcin pow, escribiendo
alternati v amente:

return Math.sqrt (Math.pow (diffX. 2) + Math.pow (diffY. 2:

Aviso: El mtodo distancia puede fallar si se le pasa uu punto a nu 11. En efecto, si p es nul l , no se puede
acceder a los atri butos.

Ejercicio 2.12:
Modificar el mtodo distancia del ejercicio anterior para que lance una excepcin. si el punto que se le pasa
es nu 11. La excepcin deber contener un mensaje descriptivo del problema.

Planteamiento: Se debe modificar la cabecera del mtodo distancia para declarar que ahora va a lanzar
excepciones. Para ello, despus de los parmetros se aade la palabra reservada throws seguida del tipo d
excepcin que se va a lanzar. En este caso, se usa Exception. Con un if se comprueba si la referencia p
contiene el valor nul l, en cuyo caso se lanza una excepcin. En caso contrario, p contiene un objeto y puede
accederse a sus atri butos,

Parmetros: El punto al cual se calcula la distancia, es decir, un objeto de la clase Punto.

Devuelve: Un double con la distancia al punto pasado como parmetro,

Solucin:
/ / s670 e7 mtodo distancia
public double distancia (Punto p) throws Exception (
tf'(p == nul l )
Elmtodo distancia comprueba
------------------11 que su(s)argumento(s)son correctos.
throw new Exception("p no puede valer null"):

double diffX = x - p.x:


double diffY = y - p.y:

return Math.sqrt(diffX * diffX + diffY * diffY):


}

Comentario: Es muy recomendable que los mtodos comprueben primero los valores que se les pasan y, si no
estn en un rango aceptable, se lance una excepcin, indicando la naturaleza del problema A la larga, esto facilita
tauto el descubrimiento y diagnosis de errores en programas grandes, como el mantenimiento del programa.

Ejercicio 2.13:
Escriba un programa que cree un punto en (4, 3) e imprima la distancia del punto al origen de coordenadas.

Planteamiento: Para calcular la distancia de un punto al origen, se aplica el teorema de Pitgoras, resultando
d = JX2 - y2. No obstante, dado que se dispone del mtodo distancia a otro punto, se puede calcular la distan-
cia al punto origen de coordenadas.

Escribe: Se escribe el mensaje "Di stanci a de p al ori gen" seguido del valor.

Solucin:
public class distanciaA10rigen {

public static void main (String args[]) {

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

/ / origen de coordenadas
Punto origen Q new Punto (O, O): Seutilizael mtododistanciaa otro
r- puntoparahacerelclculo,

Punto p = new Punto (4, 3):

System,out,println("Distancia de p al origen" + p,distancia(origen:


}
}

Aviso: Es conveniente estudiar el API de Java y las bibliotecas disponibles para evitar escribir varias veces el
mismo cdigo,

Ejercicio 2.14:
Escriba un mtodo llamado suma Tota 7 que, dada una lista arbitraria de nmeros enteros, devuelva la suma
de todos ellos, Adems, escriba un programa que pruebe dicho mtodo, calculando la suma de las secuencias
{3, 5, 2, 4, 6}, la secuencia {2, 10, -1, 2}, la secuencia {lO} Y la secuencia {}. El programa imprimir el valor
de dichas sumas.

Planteamiento: El mtodo sumaTotal deber aceptar un nmero variable de parmetros, Loque se indica con
la notacin ". ..". Entonces, deber ir recorriendo todos los parmetros e ir acumulando la suma de cada uno de
ellos, Para ello, se guarda en una variable llamada suma el resultado parcial.
El valor inicial de la variable suma ser O, Para sumar los valores que se reciben corno parmetro, se usa un
bucle for sobre la lista de valores recibidos en el mtodo. Por lti ,no, el mtodo devolver el valor almacenado
en suma,

Parmetros: La lista de nmeros enteros, denotado CO'IlO ; nt '" nmeros.

Valor de retomo: El valor de la suma acumulada, Como la suma de enteros es un entero, el valor de retorno
ser del tipo ; nt.

Solucin:
public class suma {

Lanotacin", significaquese esperaun


public static int sumaTotal (int ,., nmeros) { nmeroarbitrario(Oo ms)deparmetros,
int suma = O:

Conunbuclefor se recorrenlos
for (int num: nmeros) {------------II parmetrosconlosquese llamaal mtodo,
suma += num:
}

return suma:
}

public static void main (String args[]) {


int x:

x = sumaTotal (3, 5, 2, 4. 6):


System,out.println("Primera suma = " + x):

x = sumaTotal (2, 10. -1, 2):


System,out.println("Segunda suma = " + x):

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

x e sumaTotal (10):
System.out.println("Tercera suma e " + xi:

x = sumaTotal ():
System.out.println("Cuarta suma - " + xi:
}
}

Comentario: Este programa imprimir por pantalla lo siguiente:

Primera suma = 20
Segunda suma = 13
Tercera suma = 10
Cuarta suma = O

Hay que resaltar la cuarta suma: cuando se llama aJ mtodo sumaTota 1, se pasa una lista (array, vase Captulo 6)
vaca, con O elementos, El cuerpo del bucle for, por tanto, no se llega a ejecutar ninguna vez, con lo que la
variable suma no se modifica.

Aviso: Hay que tener especiaJ cuidado con los mtodos con un nmero variable de argumentos cuando la lista
est vaca. Por otro lado, si se desea disponer de un nmero variable de argumentos, la variable para ellos debe
ser la ltima de los parmetros que acepta el mtodo,

Ejercicio 2.15:
Escriba un mtodo de nombre mediaAritmetica que, dada una Lista de nmeros reales, caLcule y devuelva su
media aritmtica: Escriba tambin un programa que, utilizando dicho mtodo, determine la media de los
nmeros -JO, 5, 0, 7,20. n

Planteamiento: La media aritmtica de una serie de nmeros se calcula como


.Lx;
..:.;=....:.'_
n

Por tanto, hay que calcular la suma de todos los nmeros, de forma similar al ejercicio anterior: para ello se
recorre la lista de los nmeros y se determina su suma. Posteriormente, se divide entre el nmero de valores en
la lista', informacin que se puede obtener del atributo 1ength de la secuencia,

Parmetros: La lista de valores, denotado como doub 1e ... nmeros.

Valor de retomo: La media aritmtica de valores double ser un valor del tipo double.

Solucin:
public class mediaAritmetica {

public static double mediaAritmetica (double ... nmeros) {


double suma = 0.0:

for (double num: nmeros) {


suma += num:
}
Elatributonmeros. 1engtll contienela
return suma / nmeros.length: cantidadde parmetrosrecibidosen nmeros.
}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

public static void main (String args[]) {


double media:

media = mediaAritmetica (-10. 5. O. 7. 20):


System.out.println("La media es = " + media):
}
}

Comentario: El mtodo mediaAritmetica divide la suma de todos los valores por nmeros.length. Qu
ocurre cuando se pasa una lista de parmetros vaca? En este caso, se divide por O. Ahora bien, como el
resultado es un doub 1e, en Java se asigna el valor NaN (Not a Number). Esto es porque suma contiene el valor
0.0 de la inicializacin. El bucle for no se ejecuta, pues la lista es vaca, resultando en la divisin 0.0/0 que es
indeterrni nada. (Nota: al dividir por 0.0 con reales en Java, tambin se puede obtener +00, -00 o NaN, segn el
numerador sea positivo, negativo o cero, respectivamente.)

Ejercicio 2.16:
Se desea calcular la distancia recorrida por un mvil. Se sabe que el mvil sigue movimientos rectilneos
entre una serie de puntos. Se pide escribir un mtodo que reciba una serie de puntos y determine la distancia
recorrida por el mvil. Para probar el mtodo, escriba un programa que calcule la distancia recorrida entre
los puntos (0,0), (2,4), (4,5), (4, 6), (3,4) Y (0,0) (vuelta al origen). Pruebe tambin qu ocurre cuando se llama
al mtodo con un solo punto.

Planteamiento: Para el prograrna, se define una clase llamada Trayectori a, que contendr elrntodo pedido
en el enunciado, que se llamar recorri do. La clase Trayectori a contendr un mtodo mai n () donde se
generan primero los puntos que pide el enunciado y luego se llama al mtodo recorrido() con dichos puntos,
posteriormente con un solo punto y, por ltirno, sin ningn punto.
Cuando un mtodo recibe un nrnero arbitrario de argumentos del mismo tipo se puede especificar con la
notacin" ... ", que significa que se espera un nmero variable de argumentos. Con un bucle for se pueden
recorrer todos los puntos de la secuencia (la secuencia se puede tratar como si fuera un array, consulte el
Captulo 6). Para calcular el recorrido, se considera un punto cada vez. Entonces se calcula la distancia de un
punto al anterior, aadiendo el resultado a una variable que acumula el recorrido total.

Parmetros: Una secuencia arbitraria de puntos, denotado corno Punto ... puntos.

Valor de retomo: La suma de las distancias entre los puntos considerados en orden, como la distancia ser un
valor real, el valor devuelto ser del tipo double.

Solucin:
class Trayectoria {

public static double recorrido (Punto ... puntos) {


double dist = 0.0:

Punto ante ri 01' = puntos [O] : -------~IComo primerpunto se pone elque


est en laposicinO.
for (Punto actual : puntos) {
dist += actual.distancia(anterior):
anterior e actual: Se calculaladistanciadesde elpunto
} actualalanteriory se acumula en
di sto Luego se actualizaelanterior
punto con elvalordelactual.
return dist:

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

public static void main (String args[]) {


Punto pI. p2. p3. p4. p5:

pI = new Punto (O. O):


p2 = new Punto (2. 4):
p3 = new Punto (4. 5):
p4 = new Punto (4. 6):
p5 = new Punto (3. 4):

System.out.println("Se ha recorrido" +
recorrido (pI. p2. p3. p4. p5. pI:

System.out.println("Se ha recorrido" + recorrido (pl i):

System.out.println("Se ha recorrido" + recorrido O):


}
}

Comentario: Hay varios puntos que resaltar en este ejercicio; ntese en primer lugar el uso de recorrido en el
primer caso: el punto pi se pasados veces, corno origen y final de la trayectoria. Por otro lado, al ejecutar este
programa, se imprime lo siguiente:

Se ha recorrido 14.94427190999916
Se ha recorrido 0.0
Exception in thread "matn" java.lang.ArraylndexOutOfBoundsException: O
at Trayectoria.recorrido(Trayectoria.java:7)
at Trayectoria.main(Trayectoria.java:30)

La primera lnea corresponde al recorrido entre los puntos. La segunda, corresponde a la llamada a recorri do
con un solo punto. Es conveniente considerar si es correcto que al "recorrer" un solo punto se devuelva un
cero, pues con un solo punto no ha habido trayectoria real. La tercera lnea es inaceptable en la mayora de los
casos: se lanza una excepcin (ArraylndexOutOfBoundsException) por intentar acceder al primer elemento de
la secuencia en la inicializacin de (Punto anterior = puntos[O]:) cuando en realidad no hay ningn punto.
Se podra haber protegido el mtodo comprobando el nmero de parmetros pasados (puntos. si ze), C0J110 en
el siguiente cdigo:

class Trayectoria {

public static double recorrido2 (Punto ... puntos) throws Exception {


double dist = 0.0:

if (puntos.length == O) -----------11 Enelmtodorecorr do2 comprueba


quese lepasanparmetros.
throw new Exception(" No hay trayectori a") :

Punto anterior = puntos[O]:

for (Punto actual : puntos) {


dist += actual.distancia (anterior);
anterior = actual:

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

return dist:
}

pub1ic static void main (String args[]) throws Exception {


Punto pI. p2. p3. p4. p5:
Elmtodomain delegaexcepciones,
pI = new Punto (O. O): dadoquese invocaalmtodo
p2 = new Punto (2. 4): recorrido2 quelaslanza.
p3 = new Punto (4. 5): ConsulteelCaptulo4.
p4 = new Punto (4. 6):
p5 = new Punto (3. 4):

System.out.print1n("Se ha recorrido" + recorrido2 (pI. p2. p3. p4. p5. pI:

System. out. pri nt1 n( "Se ha recorri do " + recorrido2 (pI:

System.out.print1n("Se ha recorrido" + recorrido2 (:


}

De esta forma, se sigue lanzando la excepcin en el mtodo main(), pero la responsabilidad ahora recae en el
uso del mtodo, no en la codificacin del mismo, Esta diferencia es sutil, pero MUY importante, pues cada
programador debe responsabilizarse de su cdigo. En efecto, ahora al ejecutar el programa con este nuevo
mtodo,

Se ha recorrido 14.94427190999916
Se ha recorrido 0.0
Except ion in thread "main" java. 1anq. Except ion: No hay trayectori a
at Trayectoria.recorrid02(Trayectoria.java:21)
at Trayectoria.main(Trayectoria.java:46)

la excepcin que se lanza es de tipo Exception, con el mensaje "No hay trayectori a", en contraposicin del
caso anterior que se lanzaba la excepcin ArrayIndexOutOfBoundsException. En el primer caso, hay un error
de uso, en el segundo un error de codificacin: la responsabilidad est clara.

Aviso: En el mtodo recorrido no se comprueba que no se pasen ningn punto al mtodo o que alguno sea
nu 11. Tampoco se comprueba que no se pase ni ngn punto al mtodo, Adicionalmente, si se pasa un solo
punto, devuelve O, lo que podra no tener mucho sentido. El caso de que un punto fuese nu 11, se podra
codificar el bucle for para detectar el caso y lanzar la correspondiente excepcin, como se muestra a
continuacin:

for (Punto actual : puntos) {


i f (actua 1 = nu11)
throw new Exception ("Hay un punto nulo"):

dist += actual.distancia(anterior):
anterior = actual;
}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

Por otra parte, aunque se ha puesto en el mtodo main() que este delega Exception, esto nunca debera ocunir,
slo se pone para si mplificar el ejercicio, ya que no se tratan excepciones con todo detaUe. Sobre el tratamiento
de excepciones de forma apropiada consulte el Captulo 4.

Ejercicio 2.17:
Escriba la clase Punto con dos mtodos llamados di stancia. Uno de ellos calcula la distancia a otro punto y
el otro calcula la distancia al origen.

Planteamiento: La clase Punto, como en ejercici os anteri ores, tendr dos atri bUlOSpara las coordenadas x e y.
Para los mtodos di stancia, se proporciona uuo que admite COIDOparmetro un Punto y devuelve un doub le
con la distancia a dicho punto; asimismo, se escribir otro mtodo tambin llamado di stanci a, pero sin
parmetros, que calcule la distancia al origen.

Parmetros: Uno de los mtodos distancia aceptar una referencia a la clase Punto y el otro no dispone d
parmetros,

Valor de retomo: Como la distancia entre dos puntos ser un nmero real, ambos mtodos devolvern un
vaJor del tipo doub 1e.

Solucin:
import java.lang.Math:

public class Punto {

private double x, y:

public Punto (double x. double y) {


this.x = x:
this.y = y:
}

public double dameX(){


return x:
}

public double dameY(){


return y:
}

public double distancia() (


return Math.sqrt(x * x + y * y):
}

public double distancia(Punto p) ( ----;1 Sobrecargadelmtodo distanci a.


double diffX = x - p.x;
double diffY = y - p.y;

return Math.sqrt(diffX * diffX + diffY * diffY):


}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Comentario: Cuando se encuentran varios mtodos con el mismo nornbre, pero que aceptan diferentes
parmetros, bien por diferente cantidad de parmetros o bien por tener los parmetros diferente tipo, se dice
que el mtodo est sobrecargado. Para la sobrecarga no se tienen en cuenta ni las diferencias de acceso, ni el
tipo devuelto ni las excepciones lanzadas. La sobrecarga de mtodos es til cuando se desean hacer cosas
similares con diferentes parmetros.

Aviso: Usar la sobrecarga en exceso dificulta la legibilidad del programa y puede comprometer, por tanto, su
mantenimiento.

Ejercicio 2.18:
Escriba una clase que represente un reloj que seale la hora, el minuto y el segundo. La clase dispondr de
dos constructores, uno sin parmetros que pone el reloj a 0:0:0 y otro al que se le pasa la hora, los minutos
y los segundos.
Se proporcionarn los siguientes mtodos:

Uno que da la hora, los minutos y los segundos, separados por el carcter ": ", en una cadena.
Otro que tambin da la hora pero en formato 24 horas (como el anterior) o en formato 12, en cuyo caso
debe distinguir entre "am' (para las horas de O al 1) o "pm'' (para las horas de 12 a 23), tambin en.una
cadena.
Un mtodo para poner el reloj en hora. Se le pasa la hora y los minutos, poniendo los segundos a O.
Un mtodo para poner el reloj en hora al que, adems, se le pasan los segundos.

Planteamiento: Existen muchos problemas en los que la representacin de la informacin admite diversos
formatos (por ejemplo, coordenadas polares o cartesianas en el ejercicio de la clase Punto). En general, lo ms
adecuado es trabajar en un formato interno, que sea cmodo y fcil de programar y slo las funciones que
tornan datos o los devuelven se preocupan del formato, En este caso, hay que elegir entre representar un reloj
con las horas de O a 23 o bien de O a 12 y seleccionar "am" o "pm", El formato de O a 23 es ms cmodo, pues
no hay que guardar otro atributo con el uso horario.
Los atributos sern, por tanto, tres enteros, para la hora, los minutos y los segundos. No obstante habr que
comprobar que los valores son correctos, tanto en el constructor corno en los mtodos que ponen la hora. Si son
incorrectos, se lanza una excepcin descriptiva del problema. Corno hay que hacer la comprobacin en varios
sitios, es conveniente escribir un mtodo que lo haga. A este mtodo se le llamar comprueba Hora.
Existirn dos mtodos que dan la hora, que se llamarn dameHora ( ); el primero, si n parmetros, la devol-
ver como un objeto String. El segundo necesita un parmetro prn'a determinar el formato de la hora. Para
ello, se proporciona un enumerado con los dos posibles formatos, el de 24 horas y el de 12. En el caso de que
el formato sea de 12 horas y la hora sea de tarde (entre 12 y 23) habr que restar 12 al valor de la hora y aadir
la cadena "pm", En el mismo formato, pero con la hora entre O y 11 habr que poner "am",
Por lnrno, existen dos mtodos para poner la hora, uno que toma dos parmetros, para la hora y los
mi nutos, y otro que toma tres parmetros, la hora, los mi nutos y los segundos.

Parmetros: La hora, los minutos y los segundos sern representados en todos los casos con valores del tipo
int. No obstante, se comprobarn los rangos adecuados. Se proporciona un enumerado para distinguir los
formatos de 24 horas y el de 12 horas.

Valor de retorno: El valor devuelto por los mtodos dameHora () ser un objeto de la clase Stri ng con la hora
en el formato adecuado.

Solucin:
enum TipoHorario { H24. H12 }: -----11 Enumeradoadicionalparadeterminar
el formatode la hora.

class Reloj {

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

private int hora. minutos. segundos:

private void compruebaHora (int hora. int minutos. int segundos)


throws Exception {
if ( hora < O II hora> 23 )
throw new Exception ("Error en hora"): Mtodo auxiliar
que comprueba que
losvaloresde hora,minutosy
if ( minutos < O II minutos> 59 ) segundos son correctos,o lanzauna
throw new Exception ("Error en minutos"): excepcin.
if ( segundos < O II segundos> 59 )
throw new Exception ("Error en segundos"):
}

publ ic Reloj() {
hora = minutos = segundos = O:
}

public Reloj(int hora. int minutos. int segundos) throws Exception { SicompruebaHor a encuentra
compruebaHora(hora. minutos. segundos): algnvalorincorrecto,
lanzaruna
excepcinyel objetono se
construir.
this.hora = hora'
this.minutos = minutos:
this.segundos = segundos:
}

public Reloj(int hora. int minutos) throws Exception {


this(hora. minutos. O);
}

String dameHora() {
OO."
return hora + " " + minutos + + segundos:
}

String dameHora(TipoHorario tipo) {


String res:

if ( tipo == TipoHorario.H12 && hora >= 12 )


res = "" + (hora-12):
else
res = "" + hora:

res += '";" + mi nutos + " ." + segundo + ( (hora < 12) ? "am" "pm" ):

return res:

void ponHora(int hora. int minutos) throws Exception {


ponHora(hora. minutos. O): ----------------11 Estemtodo sobrecargadodelegaen
su homnimo, sinrepetircdigo.
}

void ponHora (int hora. int minutos. int segundos) throws Exception {

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

compruebaHora(hora, minutos, segundos):

thi s.hora = hora:


this.minutos = minutos: De nuevo se invocaa
this,segundos = segundos: compruebaHora para determinarsi
} losvaloresson correctos.Sino lo
son lahora no se modifica,
}

Comentario: En este enunciado, existen muchos puntos abiertos, Por ejemplo, los nombres de los mtodos, el
tipo de representacin de la informacin, etc. Generalmente, el punto ms delicado es elegir un buen modelo
de datos, que permita programar de forma cmoda, sencilla y legible,
Respecto del enumerado TipoHorario, los valores que contienen no pueden ser { 24H. 12H l, como podra
parecer natural, puesto que los identificadores de Java no pueden empezar por un dgito. Por ello, se antepone
la hache delante.

Aviso: Ntese que el constructor sin parmetros NO delega en el otro constructor mediante thtst. O. O).
Esto es as para evitar lanzar excepciones (o capturarlas como se ver en ejercicios posteriores del Captulo 4).
En este caso, se justifica el evitar usar el thi s por la sencillez del cdigo que resulta. Hay que tener en cuenta
que no tiene sentido que el constructor si n parmetros se declare que lanza excepciones, pues siempre debe ser
correcto o no existir.
Por otro lado, el mtodo compruebaHora es privado. Aunque los derechos de acceso se tratan en el siguiente
captulo, baste decir que de esta forma la clase Re1oj contiene los mtodos tal como indica el enunciado, pues
comprueba Hora no puede invocarse desde fuera de la clase,

Ejercicio 2.19:
Aada al ejercicio anterior un mtodo para poner la hora especificando si es A 1\1 o es PM.

Planteamiento: Una vez ms se sobrecarga el mtodo ponHora(), en este caso se le aade un parmetro para
determinar si la hora es AM o PM. En principio, se podra pensar en pasar una String, con los valores "am" o
"pm", Pero ello implicara comprobar que no se ponga otra cadena o un nu 11, Es mucho mejor aadir un
enumerado con los valores { AM, PM }, llamado Turnotorar-to.
Al aadir el turno horario quiere decir que las horas se pasan en formato de 12 horas. Hay que comprobar,
entonces, que el rango de la hora es de O a 11, Se puede optar por modificar compruebaHora, que comprobaba
la hora en formato 24 horas o bien en aadir una lnea de comprobacin adicional. La solucin mejor depen-
der del uso posterior que se quiera dar a comprueba Hora. En este caso, se aade una linea adicional.

Parmetros: Adems de la hora, los minutos y los segundos como int, el turno de horario, de tipo tumouorer io.

Valor de retorno: El mtodo no necesita devolver ningn valor de retorno por lo que se utiliza la clusula void.

Solucin:
ji S610 se incluye el enumerado con el turno y e7 nuevo mtodo ponHora
enum TurnoHorari o { AI'I,PM };

void ponHora(int hora. int minutos, int segundos. TurnoHorario t) throws Exception {

compruebaHora (hora, minutos, segundos):

if ( hora> 11 ){
throw new Exception ("Hora incorrecta en horario de 12 horas"):
}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

if ( t == TurnoHorario.PM ){
hora += 12: ---------------1[1 Se pasa a formatode 24 horas. J
}

this.hora = hora:
this.minutos = minutos:
thi s. segundos = segundos:
}

Comentario: La hora se almacena en formato 24 horas, como se explic en el ejercicio anterior. Por ello, si la
hora es PM, se suman 12 horas al valor de hora recibido.
Tambin se podra haber modificado el mtodo compruebaHora ( ), quedando un cdigo algo ms limpio. El
nuevo compruebaHora() y ponHora() quedaran de la siguiente forma:

private void compruebaHora


(int hora. int minutos. int segundos, TipoHorario t)
throws Exception {
if ( t == TipoHorario.H24){
if ( hora < O II hora> 23 ){
throw new Exception ("Error en hora formato 24H");
}
}

if ( t = Ti poHora ri o. H12) { Comprobacindel rango de la hora


--------il segn el tipode horario.
if ( hora < O II hora> 11 ){
throw new Excepti on (" Error en hora formato 12H");
}
}

if ( minutos < O II minutos> 59 ){


throw new Excepti on ("Error en minutos") :
}

if ( segundos < O II segundos> 59 ){


throw new Exception ("Error en segundos"):
}
}

void ponHora (int hora. int minutos. int segundos, TurnoHorario t)


throws Exception {
compruebaHora (hora, minutos. segundos. TipoHorario.H12):

if ( t == TurnoHorario.PM ){ --------11 Sigue siendo necesario pasar al


formatointernodel relojde 24 horas.
hora += 12:
}

thi s. hora = hora:


this.minutos = minutos:
this.segundos = segundos:
}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Aviso: Evidentemente, si se introduce esta segunda codificacin en la clase Reloj, habr que modificar todas
las invocaciones del mtodo compruebaHora, especificndose si el formato de reloj es de 24 horas o 12 horas,
segn corresponda.

Ejercicio 2.20:
Se define la serie de Fibonacci como 1, 1,2,3,5,8, 13,21,... donde los dos primeros trminos son 1 y cada
trmino restante es la suma de los dos anteriores. Formalmente, considerando el O como ndice del primer
elemento, el trmino a se calcula conzo:

1 i=O, i=1
(1, =
, { 01_1 + ai-2 i> 1

Se pide escribir dos mtodos que calculen el trmino i-simo de In.serie de Fibonacci, uno de ellos de forma
recursiva y otro de forma iterativa.

Planteamiento: Se llamar fi bR al mtodo recursivo y fi bI al mtodo iterativo. Ambos tomarn corno parmetro
el ndice del trmino que se desea calcular, Fjese que el primer elemento se denota como ao' empezando con el
ndice O. Tambin ambos lanzarn una excepcin cuando el ndice sea negativo (fuera de rango),
Para la versin recursiva, se escribe la funcin prctcamente corno se define formalmente: con un i f se deter-
mina si el ndice es Oo 1,en cuyo caso se devuelve 1;en caso contrari o, se devuelve la suma computando recursi vmnente
(esto es, llamando a fi bR) el vaJor de los anteriores trminos, Esto se escribe corno fi bR( i -1) + fi bR( i -2).
Para la versin iterativa, hay que idear alguna forma de ir computando los trminos hasta llegar al deseado,
Para ello, se almacenarn los valores inmediatamente anteriores en dos variables, llamadas l timo y penl ti-
mo' La suma de estos vaJores se almacenar en otra variable, llamada res. Con un bucle for se calculan los
trmi nos hasta el i-si mo, de forma que en cada iteracin, res se computa corno 1timo + pen 1timo y luego
se actualizan sus valores. Las tres variables se inicializan a 1 y el bucle no se ejecutar para los dos primeros
trminos,

Parmetros: El ndice del trmino a calcular, como un valor del tipo int.

Valor de retomo: El cmputo de la funcin de Fibonacci, corno int. Podra tambin devolverse un valor 10n9
si se desea poder calcular mayores valores de la funcin de Fibonacci.

Solucin:
public int fibR(int i) throws Exception {
if(i<O){
,
throw new Exception ("Indice negativo");
}

if ( i Q= O II i==l ){ Condicinde convergencia:las llamadas


recursivas terminanalguna vez,
return 1:
}else{
return fibR(i - 1) + fibR(i - 2):
Llamada recursiva. Hay que asegurarse de que los valores
que se pasan convergen a la condicin de parada.
}
}

public int fibI(int i) throws Exception {


if(i<O){
,
throw new Exception ("Indice negativo");
}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

int ltimo = l. penltimo = l. res = 1:

for (int n = 1: n < i: n++) { -----11 Elbucleno se ejecutapara


lostrminosO y 1.
res = ltimo + penltimo:

penltimo = ltimo:
1timo = res: -11 Hay que tenercuidadoen elorden
de actualizacin.
}

return res:
}

Comentario: No siempre ser fcil encontrar una versin iterativa de un algoritmo o funcin definido
recursivamente. Si es posible, como en este caso de Fibonacci, el algoritmo se denornina recursivo primitivo.

Aviso: Las funciones recursivas tienen una codificacin mucho ms legible y elegante de forma recursiva que
iterativa. Por tanto, la versin recursiva es mucho ms fcil de mantener y de depurar que la iterativa. No
obstante, la implementacin recursiva consume ms recursos y generalmente tarda ms en ejecutarse que la
versin iterativa. Cul debe elegirse depender sobrernanera de los requisitos de ejecucin de nuestro prograrna.

Ejercicio 2.21:
La funciri de Ackerman se define para valores enteros no negativos 1'1 y m corno:

1'1+1 In = O
A(II1,Il) = A(111
-1,1) n=O,'I1>O
A(II1-1,A(In,n-l)) n>O,m>O

Se pide codificar un mtodo que calcule la funcin de Ackerman y un programa que imprima los valores de
Ackerman (0,0), AckerI11a.n(2,2)y Ackerman (6,6).

Planteamiento: La definicin de la funcin de Ackerman es recursiva, por lo que se irnplernenta un mtodo


recursivo, que se llamar Ackerman, que acepte dos enteros y calcule la funcin. Corno Ackerrnan se define
para nmeros no negativos, se lanzar una excepcin si alguno de los dos parmetros es menor que O. Luego,
segn los valores de m y n, se calcula el valor segn la definicin.
Para obtener los valores de Ackerrnan que pide el enunciado, se escribe un mai n() en la misma clase, que
calcula e impri me por pantalla los resultados.

Parmetros: Dos variables para los valores de my n de tipo int.

Valor de retorno: Un entero (i nt) con el valor de la funcin de Ackerrnan. Podra tambin devolverse un valor
long si se desea poder calcular mayores valores de la funcin de Ackerrnan.

Solucin:
public class Ackerman {

public static int Ackerman (int m. int n) throws Exception {


if ( n < O 11m < O ){
throw new Exception ("Parmetros no vlidos. "):
}

if(m-O){

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

return n + 1:
}
Cuandoel cuerpodel i f contiene
if(n=O){ un return, muchasvecesnose
return Ackerman (m - l. 1): poneel se paralosotroscasos.
}

return Ackerman (m - l. Ackerman (m. n - 1:


}

public static void main(String[] args) throws Exception {


System.out.println("Ackerman(O.O)= " + Ackernant.+):
System.out.println("Ackerman(2.2)= " + Ackerman(2.2:
System.out.println("Ackerman(3.3)= " + Ackerman(3.3:
System.out.println("Ackerman(6.6)= " + Ackerman(6.6:
}
}

Comentario: La funcin de Ackerrnan es una funcin recursiva no primitiva, esto es, no es posible codificar
un mtodo iterativo que la implemente. El inconveniente que tiene Ackerman es que consume muchos recur-
sos, aunque el valor de la funcin no sea muy elevado. Como ejercicio, se podra calcular el nmero de veces
que se llama al mtodo Ackerman. De hecho, la salida de este programa es:

Ackerman(O.O)= 1
Ackerman(2.2)= 7
Ackerman(3.3)= 61
Exception in thread "main" java.lang.StackOverflowError
at Ackerman.Ackerman(Ackerman.java:20)
at Ackerman.Ackerman(Ackerman.java:21)
at Ackerman.Ackerman(Ackerman.java:21)
at Ackerman.Ackerman(Ackerman.java:21)
at Ackerman.Ackerman(Ackerman.java:21)
at Ackerman.Ackerman(Ackerman.java:21)
at Ackerman.Ackerman(Ackerman.java:21)

donde la ltima lnea se repite un nmero muy grande de veces, que depende de la configuracin del sistema,
la cantidad de memoria instalada, etc.

Aviso: Existen algunos mecanismos, como la Programacin Dinmica, para tratar algunos de estos problemas,
pero el tratamiento de los mismos y su justificacin excede del propsito de este libro. En el caso de la funcin
de Ackerman, una Implementacin mediante Programacin Dinmica es una solucin muy adecuada. De
todas formas, incluso para valores no muy grandes de IU y n, el resultado de Ackerrnan es demasiado grande
para almacenarlo en un entero.

Ejercicio 2.22:
Escriba un programa que permita modelar el movimiento rectilneo uniforme de un mvil en un plano. El
mvil puede seguir una trayectoria en cualquier recta del plano. Se conoce la posicin inicial del mvil, as
como su velocidad lineal. Escriba, asimismo, un programa que ejercite dichas clases, de forma que se instancie
un mvil que se mueve a una velocidad de 2.4 metros/segundo, que parte de la posicin (2.1, 5.2) Y se mueve
sobre la recta y = 2x + 1. E/ mvil se ir moviendo en incrementos de tiempo arbitrarios. El programa ha de
determinar las posiciones en las que se encuentra el mvil tras el paso de 3.5, 4, Y 6.2 unidades de tiempo

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

respectivamente y las imprimir por pantalla. (Nota: Evidentemente, el punto de partida del mvil ha de
pertenecer a la recta que define el movimiento.)

Planteamiento: Este ejercicio tiene como objeto el identificar las clases ms adecuadas para representar el
problema, as como los atributos que contienen cada una de ellas y su interrelacin (vase la seccin "Comen-
tarios", al final del ejercicio).
Lo primero es idear la solucin al problema. Luego se modelan los conceptos encontrados en el problema
y en la solucin. Por ltimo, se escribe un programa (main()) como pide el enunciado. La siguiente figura
representa el problema:
Segundo avance tras
t2 unidadesde tiempo.

Primer avance tras ---tI Posicin tras t,


t, unidadesde tiempo.

-------I[ Posicin tras tI' ~

'-------11 Posicininicial.

El mvil comienza en una posicin. Para saber cul es la posicin tras t unidades de tiempo, se calcula el
recorrido en esas t unidades de tiempo a una velocidad v (d= v * t). Como el recorrido es lineal, el punto
alcanzado dentro de la trayectoria se calcula sumando al origen los incrementos en abcisas y ordenadas,
respectivamente d*coseno(a) y d*seno(a), siendo a la pendiente de la recta.
Por tanto, partiendo de un punto, se calcula primero la distancia recorrida. Despus se determinan los
incrementos en abcisas y ordenadas. Luego se suman al punto en el que est situado el mvil, para obtener el
punto destino. Tras cada uno de estos avances habr de conservarse el punto anterior, para calcular el siguiente
punto en la trayectoria.
Del enunciado y de la solucin se deduce que el programa ha de manejar objetos que representen puntos,
movimientos uniformes, rectas y mviles.
Primero se modela un punto, de forma si mi lar a ejercicios anteriores en este mismo captulo. Adems, se le
aade un mtodo que devuelve una cadena con la representacin del punto de forma "(x, y)".
Despus se modela el movimiento uniforme, con una clase llamada MovUniforme, con un nico atributo, la
velocidad lineal del movimiento. Tambin dispondr de un constructor en el que se inicializa su atributo y un
mtodo que, dado un intervalo de tiempo (en unidades de tiempo), calcula el recorrido que se hace a dicha velocidad.
Tambin hay que modelar lo que es una trayectoria rectilnea en un plano, es decir, una recta. Existen
multitud de representaciones matemticas de una recta, as que se elige una que sea cmoda. Por ejemplo, se
usa la representacin de una recta corno y = ax + b, como propone el enunciado. En el constructor de la clase
Recta, se le pasarn los valores de a y b. De la recta es necesario conocer el ngulo de la pendiente, por lo que
se proporciona un mtodo que la calcule, llamado pendiente, que devolver un double.
Con estas tres clases, ahora se puede modelar un mvil, que ser una clase lJamada Mvi 1, que tendr COlllO
parmetros la posicin inicial del mvil, la posicin actual del mismo, la posicin anterior a la ltima vez que
avanz el mvil, el movimiento que ejecuta y la trayectoria que sigue. Dispondr de un mtodo que devuelva
la posicin actual y un mtodo que permita avanzar f unidades de tiempo.
Con todo ello, el programa principal queda relativamente sencillo: Primero se crea un punto en la posicin
i nici al del rnvi 1(2.1, 5.2). Luego se crea una recta que representa la trayectori a del mvil (y= 2x +1). Tambin
se crea un movimiento uniforme con velocidad 2.4. El orden de creacin de estos tres objetos es irrelevante.
Pero con los tres, ya se puede crear un objeto de la clase t'lvi 1, al que se llamar m. Entonces, alternativamente,
se imprime la posicin actual del mvil, y el mvil avanza segn indica el enunciado: 3.2,4.0 Y 6.2 segundos.
Entre cada avance, se imprime la posicin actual.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Solucin:
class Punto {
prvate double x. y:

PuntoCdouble x. double y) {
ths.X s x:
ths.y s y:
}

double dameXC){
return x:
}

double dameYC){
return y:
}

Strng poscn() {
return "C" + x + ..... + y + ")":
}
}

class MovUnforme {
prvate double vel:

MovUnforme(double vel) {
ths.vel a vel:
}

double recorrdo(double t) {
return vel * t:
}

class Recta {
prvate double a. b:

Recta(double a. double b){


ths.a e a:
thS.b e b:
}

double pendiente(){
return Math.atan(a):
}
}

class Mvil {

prvate Punto poslnicial:

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Clases y objetos

prvate Punto posAnterior:


private Punto posActual:

prvate Recta trayectoria:


private MovUniforme mov:

Mvil(Punto origen. Recta trayectoria. MovUniforme mov) {


this.posAnterior this.posActual= Q

this.poslnicial = origen:

this.trayectoria = trayectoria:
ths.mov = mov: avanza calculalanueva posicinpasados tsegundos.
}

void avanza(double t) { --I

Punto intermedio = new Punto (pOsActual.dameX().


posActual.dameY(:
Punto intermedioparaactualizar
elpunto
double dist e mov.recorrido (t): anteriorcuando acaben losclculos.

double alfa Q trayectoria.pendiente():

double incrX = dist * Math.cos(alfa):


double incrY = dist * Math.sin(alfa):

posActual = new Punto(posAnterior.dameX() + incrX,


posAnterior.dameY() + incrY):

posAnterior = intermedio:
}

Punto posActual(){
return posActual:
}
}

pub 1ie e1ass prob 1emal~vi 1{

publC static vod man(String[] args) {


Punto inicial new Punto (2.1. 5.2): Q
Avanza e imprime laposicinactual.
Sielmodelo de datos de nuestro
problema es adecuado, elcdigo
Recta trayectoria = new Recta (2. 1): resultamucho ms simple.

1'lovUniforme miMov = new MovUnforme (2.4):

Hvi 1 m = new Mvi 1(ini ci al. trayectoria. mi Mov) :

System. out. pri ntl n( "Me encuentro en " + m. posActua 1().posi ci n() ):

m.avanza(32):
System. out. pri ntl n( "Me encuentro en " + m. posActua 1().posi ci n() ): -------'

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

m.avanza(4) :
$ystem. out. printl n("Me encuentro en " + m.posActual ().posi ci nt ) :

m.avanza(62):
$ystem. out. printl n("Me encuentro en " + m.posActual ().posi ci nt ) :
}
}

Comentario: La salida de este programa es:

Me encuentro en (2.1.5 2)
Me encuentro en (5.534600413439678.12.069200826879353)
Me encuentro en (6.393250516799597,13.78650103359919)
Me encuentro en (12.189138714479054,25.3782774289581)

El mtodo avanza calcula la nueva posicin pasados t segundos. Primero determina el recorrido lineal en ese
plazo. Luego, segn la pendiente de la recta que representa la trayectoria, calcula los incrementos en x e y. Por
ltimo, calcula la nueva posicin actual a partir de la anterior. Y actualiza la anterior.

Aviso: Otra posibilidad es crear una nica clase que tenga un montn de atributos pru'atodos los valores que se
han de almacenar o calcular, Esto, en general, es una mala idea.
Siempre hay que entender el problema antes de ponerse a codificar una posi ble solucin. Luego, para cada
concepto del problema o de la solucin, se propone una clase que lo modela.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Ampliacin de clases

3.1 ELEMENTOS DE CLASE (STATIC)


Los atributos y mtodos de una clase precedidos por la palabra stat i e se denominan elementos de clase. Los elemen-
tos de clase se comparten entre todas las instancias de la clase. Si se modifica un atributo de clase, todas las instancias
de la clase ven dicha modificacin.
Como ejemplo, si se declara un atributo de clase llamado numA 1umnos y un mtodo de clase llamado
imprimeTotalAlumnos, el cdigo quedara aS:

class Alumno {
II Cuenta de alumnos matriculados.
II inicialmente a O
static int numAlumnos = O:

II Resto de los atributos que se han omitido por simplificacin

II Se omiten las excepciones por claridad


Alumno(String nombre. String apellidos. int ao) {
II Se Incrementa el nm. de alumnos matriculados
numAlumnos++:

II Resto del cdigo del constructor que se ha omitido por simplificacin


}

static void imprimeTotalAlumnos() {


System. out. pri nt 1n( "Nmero tota 1 de matri cu 1ados " + nurnA1umnos) :
}
}

Dado que tanto el atributo nurnA1umnos como el mtodo impri meTota lA 1umnos existen aunque no haya objetos se
les llamar desde el programa principal de la siguiente forma:

public static void main(String args[]) {

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Alumno,imprimeTotalAlumnos():
}

Es decir, con el nombre de la clase y el nombre del mtodo,

3.1.1 Valor inicial de atributos de clase


Como los atributos y mtodos estticos se pueden utilizar aunque no exista ningn objeto de la clase, deben tener
siempre un valor correcto, Los atributos se pueden declarar e inicializar de la misma forma que las variables normales,
Si los valores iniciales de los atJibutos de clase requieren clculos adicionales iniciales, se usa un bloque de
inicializacin de atributos estticos, de la siguiente forma:

class Alumno {
static int numAlumnos:

static {
numAlumnos= O:
}

. ' ,

~ Sobre el uso de elementos de clase, consulte los Ejercicios del 3.1 al 3.8.

3.2 DERECHOS DE ACCESO


El estado de un objeto es el conjunto de los valores de sus atributos. Una modificacin arbitraria, intencionada o por
error, de este estado puede dar lugar a inconsistencias o comportamientos indeseados del objeto, Seria deseable poder
controlar el acceso a los atributos de los objetos,
Java proporciona mecanismos de acceso a los componentes de una clase, de forma que es posible ajustarlo a las
necesidades de los objetos. Para ello, se antepone a la declaracin el modificador de acceso que se requiere:

Acceso privado (pr vate): Los elementos privados slo se pueden usar dentro de la clase que los define, nunca

desde ni nguna otra clase,


Acceso de paquete: No se pone nada, El acceso a estos componentes es libre dentro del paquete en el que se
defi ne la clase,
Acceso protegido (protected): Los elementos protegidos slo se pueden usar dentro de la clase que los define,
aquellas clases que la extiendan y cualquier clase en el mismo paquete.
Acceso pblico (publ te): Dicho elemento se puede usar libremente,

As, para li mitar el acceso a los atributos nombre, ape 11 i dos y aoDeNacimiento de un objeto alumno se declara-
,
flan como:

enum Horario { HAANA,


TARDE}

class Alumno {
private String nombre:
prvate String apellidos:
prvate nt aoDeNacimiento:

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Ampliacin de clases

private int NP: /1 NmeroPersonal: identificativo nico


private String grupo:
private Horario horario:

1/ Resto de la clase Alumno


}

De esta forma, el intento de cambiar cualquier atributo privado dar lugar a un error de compilacin, y slo se
podr acceder a la parte pblca de la clase. Slo se pueden modificar los valores de los atributos desde los propios
mtodos de la clase. De esta forma, aunque se puedan modifcarIos atributos a travs de uu mtodo ponsrupor), ste
puede verificar que la modificacin es segura y en caso contrario lanzar una excepciu.

3.3 PAQUETES
Los paquetes son agrupaciones de clases, interfaces y otros paquetes (subpaquetes), normalmente relacionados entre s.
Los paquetes proporcionan un mecanismo de encapsulacin de mayor nivel que las clases. Los paquetes permiten unifi-
car un conjunto de clases e interfaces relacionados funcionalmente. Por ejemplo, el paquete java engloba una serie de
paquetes con uti Iidades de soporte al desarrollo y ejecucin de la aplicacin. Contiene, a su vez, Lossubpaquetes ut i1 o
1ang. Para indicar que la clase que se est escribiendo pertenece a un paquete, la primera sentencia debe tener la sintaxis:

package nombrePaquete:

Todos los elementos contenidos en el fichero en el que aparece tal declaracin formarn parte del paquete
nombrePaquete.

3.3.1 Uso
Cuando en una clase se quieren utilizar componentes que estn en otro paquete diferente, se aade una declaracin de
importacin, que puede tener las siguientes formas:

l/Importacin de la clase "Alumno"


l/del paquete "Matricula"
import Matricula.Alumno: /1 importacin de la clase "Alumno" del paquete "Matricula"
import Matricula.*: 1/ importacin del paquete "Matricula". incluye la clase Alumno

3.3.2 Nombres
El nombre del paquete, como todos los identificadores, debe ser representativo de la agrupacin que contiene. El nombre
puede contener la declaracin de subpaquete. Incluso se puede recomendar incluir el dominio de la ernpresa para que
quede identificado de forma nica respecto a otros paquetes que pudieran existir o comprarse a otros proveedores.

package com.empresa.Matricula:

Los derechos de paquete no se modifican porque estn contenidos en otro paquete. Un paquete que contenga dos
subpaquetes no impiica permisos de acceso entre ellos. Es decir, agrupar paquetes es conveniente para el posterior
desarrollo de cdigo, pero no para modificar los derechos de acceso.

c> Sobre los paquetes consulte el Ejercicio 3.9.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

3.4 CLASES INTERNAS


Una clase interna es una clase cuya definicin est dentro de otra clase. Una clase exterior se denomina clase externa
o clase contenedora. Las clases internas permiten evitar la proliferacin de clases muy pequeas que en muchos casos
slo se usan dentro de una sola clase. El uso ms comn es la creacin de adaptadores y manejadores de eventos, como
se ver en los ltimos captulos, as como en la implementacin de interfaces tipo Iterator. Otros usos quedan fuera
del mbito de este Libro.
Hay distintos tipos de clases internas pero, por simplicidad, slo se presentan las clases internas que se definen
como miembros normales no estticos de una clase contenedora. Como son miembros de la clase contenedora slo
puede existir un objeto de la clase interna cuando exista un objeto de la clase contenedora.
Las clases internas pueden acceder directamente a todos los miembros de la clase contenedora. Y ello es indepen-
diente de los modificadores de control de acceso que tengan los miembros de modo que, por ejemplo, puede utilizar
directamente una variable miembro aunque est declarada como privada.
Las clases internas no estticas tienen algunas limitaciones: los nombres de los miembros de la clase contenedora
tienen que ser diferentes de los de la clase interna, una clase interna no puede contener ningn miembro esttico y no
es posible crear un objeto de la clase interna sin tener un objeto de la clase contenedora.
En el siguiente ejemplo se aade una clase interna a la clase Alumno previamente definida para poder tener los
datos sobre la direccin del alumno, Se ha simplificado la direccin a slo la calle y el nmero, Se han aadido los
mtodos toStri ng( ) tanto en Alumno como en Direcci n que devuelve el contenido del objeto en forma de cadena y
permite la escritura directa por pantalla de un objeto utilizando el mtodo System. out. pri nt 1n ().

public class Alumno {

private String nombre:


private String apellidos:
private int aoNacimiento:
private Horario horario:
private Direccion direccion:

public Alumno(String nombre.


String apellidos.
int ao.
Horario horario.
String calle.
int num) {
this.nombre = nombre:
this.apellidos = apellidos:
aoNacimiento = ao:
this.horario = horario:
direccion = new Oireccion(calle, num):
}

public void ponOireccion(Direccion dir) {


direccione dir:
}

/ / devuelve 70S datos de7 objeto en formato cadena


public String toString(){
return nombre + " " + apellidos + " "
+ aoNaci miento + " "
+ horari o + " " + di reccion:

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Ampliacin de clases

e 1ass Direcci on (
String calle:
int numero:

Direccion(String calle. int nunero l]


this.calle = calle:
this.numero = numero:
}

public String toString() {


return calle + " " + numero:
}
}

public static void main(String args[]) (


Alumno alumno = new Alumno("Ba1ta". "Fernndez". 1991.
Horario.MAANA. "Zamora". 23):
System.out.println("Datos alumno: " + alumno):
Alumno.Direceion direceion = alumno.new Direeeion("Figueruela". 28):
alumno. ponDi reeei on (d i recei on) :
System.out.println("Datos alumno: " + alumno):
}
}

Con las clases internas se introduce una nueva sintaxis en el nombrado de las clases, en el operador new, de
creacin de una instancia yen la autorreferencia thi s. Corno se puede ver en el ejemplo, si se quiere utilizar directa-
mente la clase interna, por ejemplo, para crear un nuevo objeto, hay que hacerlo NombreC 1aseContenedora .
NombreClaseInterna. Si la clase interna no se ha declarado privada se puede crear un objeto de esa clase interna
mediante referenci aObjetoCl aseContenedora .new NombreCl ase Interna ( ).
Si dentro de la clase interna se desea hacer una referencia al objeto actual de la clase contenedora se hace mediante
NombreClaseContenedora.this.
Java tambin permite crear clases locales. Las clases locales son aquellas que se definen dentro de un mtodo y
que, por tanto, slo son visibles y utilizables en dicho mtodo, As mismo, permite crear clases annimas que son
clases locales sin nombre. Las clases locales y las clases annimas se usan de forma habitual en el trabajo con archivos
yen la creacin de interfaces grficas de usuario de las que se vern ejemplos en el Captulo 10.

~ Sobre la declaracin y uso de clases internas consulte los ejercicios del CaptuJo 10.

, ,
3.5 IMPORTACION ESTATICA DE CLASES
Para acceder a los miembros estticos de una clase hay que escribir el nombre de la clase, un punto y el nombre del
atributo o mtodo, Esta sintaxis puede comprometer la legibilidad de un programa, sobre todo cuando aparecen muchos
mtodos y atributos estticos con el nombre de la clase. Java proporciona un mecanismo para la importacin de miem-
bros estticos, anteponiendo el cualificador static tras la importacin. Se permite tanto la importacin individual:

import static java Ianq.Hath PI:

como todos los miembros de la clase:

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

import static java.lang.Math.*:

De esta forma, se puede escribir un programa para el clculo genrico de un logaritmo como:

import static java.lang.Math.*:

class LogGenerico {
static double x = II poner valor double
static double a = II poner valor double

/1 calcula logaritmo de "x" en base "a"


public static void main (String args[J) {
double res:
res = log(x) / log(a): II uso de lag sin cualificar
System. out. print 1 nt" res= " + res):
}
}

En este ejemplo el mtodo log() pertenece a la clase Math.

~ Sobre Ja importacin esttica de clases consulte el Ejercicio 3.21.

3.6 CLASESPREDEFINIDAS
Uno de los puntos fuertes de Java es Ja gran cantidad de clases predefinidas que aporta. Abarcan ternas como comu-
nicaciones, web, diseo grfico, utilidades matemtcas, contenedores genricos y muchas ms, En este apartado se
vern aJgunas de las ms utilizadas:

Envoltorios de los tipos simples.


Stri ng, para la manipulaci n de cadenas de texto.
Math, biblioteca de funciones matemtcas.

3.6.1 Envoltorios
Los tipos predefinidos en el lenguaje Java son tipos simples, en el sentido de que no son clases. Por conveniencia,
existen unas clases predefinidas, denominadas envoltorios (wrappers, en ingls), para estos tipos simples. Estas
clases envoltorio proporcionan mtodos de clase, tiles para convertir cadenas de texto al tipo adecuado, imprimir
con varios formatos, constantes estticas con el valor mnimo y mximo del tipo, etc. Adems, estas clases envoltorio
generan automancarnente una instancia cuando se usan tipos simples en contextos en los que se espera un objeto. As
mismo, Jos envoltorios son compatibles con los tipos simples que representan, por Loque pueden usarse en expresio-
nes en que se espera el tipo simple, Los envoltorios definidos en Java pueden verse en la Tabla 3.1.
Los tipos byte y short se incluyen en el lenguaje Java por razones de eficiencia, por lo que no tienen envoltorios
predefi nidos, utilizndose Ja clase I nteger.
Todos los envoltorios disponen, entre otros, de los siguientes constructores y mtodos:

Constructor a partir de un valor del tipo simple,

Character mi Letra = new Cha racter( .H' ):


Integer miEntero = new Integer(1024):

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Ampliacin de clases

Tabla 3.1. Envoltorios definidos en Java.

Envoltorio TIpo predefinido

Boo 1ean boolean


Character char
Integer int
Long long
Float float
Double double

Constructor que toma una cadena y lo traduce al tipo correspondiente,

Float miRealCorto = new Float("12.3E-2"):

Mtodo toStri ng() que transforma el valor en una cadena,

System.out.println("Mi entero es " + miEntero): 1/77amada imp7cita a toString()

Mtodo que devuelve el valor primitivo, El nornbre del rntodo es la concatenacin del tipo sirnple con la
palabra Value, es decir, charVa 1ue() en el envoltorio Character, i ntVa 1ue() en el envoltorio Integer, etc.

int m = miEntero.intValue():

Mtodo equa 1s () para cornparar el valor entre envoltorios,

Integer otroEntero = new Integer(2048):


boolean res = miEntero.equals(otroEntero):

En el siguiente ejernplo se rnuestra la posibilidad de mezclar tipos sirnples y envoltorios en expresiones matem-
ticas realizndose la conversin entre ellos de forma automtica,

public static void main(String args[]) {


lnteger envX e new Integer(7);
int y = 8:
double z:
envX += y: 1/ aade ya envX
envX++: 1/ incrementa en uno e7 valor de envX
z = Math.sqrt(envX): /1 raz cuadrada de envX. z = 4.0
}

Esta conversin autorntica permite utilizar un tipo prirnitivo en el mbito en que se requiere un objeto, por
ejemplo para aadir un entero a una lista de la clase ArrayList, como se ver en ejercicios del Captulo 6.

Boolean
La nica particularidad de Boa1ean es que al convertir una cadena, se traduce la cadena "true" (cualquier combina-
cin de minsculas y maysculas) al valor true. Cualquier otra cadena se traduce al valor fa 1se.

Character
El envoltorio Character proporciona mtodos para determinar si un carcter es una letra o un dgito, espacio en
blanco (' " '\ t ', '\n', '\ f" o '\ r'), pasmode maysculas a mi nsculas, etc. Existen algunas particularidades en estos

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

mtodos dependiendo del alfabeto al que pertenecen los caracteres. Java, como utiliza Unicode para codificar Jos
caracteres, permite otros alfabetos como el cirlico, griego, kanji, etc., cuyo comportamiento con las maysculas y
mi nsculas puede diferir de los alfabetos occidentales derivados del latn. Asi mismo, los dgitos para dichos aJfabetos
tambin son diferentes de 'O', '1', etc. Para estos detalles, consltese un manual de referencia de Java.

Integer
Adems de almacenar un vaJor i nt, se suele usar para Jos tipos predefinidos byte y short, ya que no tienen envoltorios propios.

Float y Double
En Java, los tipos float y doub 1 e pueden contener el valor +00 y el-oo, por ejemplo, en las divisiones por O. Pero tambin
algunas expresiones pueden dar Jugar a valores que no representan un nmero, como por ejemplo Math. sqrt ( -1). Esto
en Java se representa con el valor NaN.Asimismo, existen mtodos para determinar si un nmero es +00, -00 o NaN.

float s= O:
s = ID/s:
Float infinito= new Float(s);

l/Imprimir "infinito es tntinity"


System.out.println("infinito es " + infinito):
Float noNumero= new Float(~1ath.sqrt(-1:
l/Imprimir "noNumeroes NaN"
System. out. pri nt 1n( "noNumero es " + noNumero):

3.6.2 Math
La clase Math contiene constantes y mtodos de uso comn en matemticas. Todas las operaciones que se llevan a
cabo en dicha clase se realizan con tipo doub 1e. Contiene las constantes 1t (Math. PI) y el nmero de Euler, e (Math. E),
ambos de tipo doub 1e. En las funci ones trigonomtricas, los ngulos estn en radi anes y los mtodos devuelven
vaJores doub 1 e.

3.6.3 String
La cJase String se usa para manejar cadenas de caracteres de cualquier longitud finita. Es una clase especial con
soporte especfico incluido en el lenguaje Java. Para crear un objeto String no hace falta llamar al constructor, basta
escribirlo como un valor.

String nombre: /1 crea vsrisble "nombre" de tipo String


String saludo = "hola"; /1 crea un objeto String y lo asigna a 7a variab7e "saludo"
String mensaje = saludo:

La cJase String tiene un tratamiento particular en Java, pues aparte de la construccin de objetos a partir de
literales entre comillas, se pueden aplicar Jos operadores + y += que se usan para concatenar String.

String s = "Hola" + "Pedro.": / / s valdr "H07aPedro. "


s += " Hola " + "Juan.": /1 s va7dr "Ha7a Pedro. Hala Juan. "

Para comparar si Jos valores de dos Stri ng son iguales se uti liza el mtodo equa 1s ( ).

e> Sobre el uso de las cJases predefinidas consulte los Ejercicios 3.10 a13.20.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Ampliacin de clases

ELEMENTOS DE CLASE (STATIC)

Ejercicio 3.1:
Escriba un programa que imprima en la pantalla las constantes de la clase Math.

Planteamiento: Para uti ti zar una constante de clase, se pone el nombre de la clase, un punto y el nombre de la
constante. Las constantes son atributos calificados conlO final, esto es, su valor no puede cambiar. La clase
Math proporciona dos constantes, el valor de 1t y el de la constante de Euler, llamados Math. PI Y Math. E.

Solucin:
import java.lang.Math:

public class PruebaCtesMath {

public static void main(String args[]) {


System.out.println("Pi vale" + Math.PI): ------11 Uso de laconstanten, (Math. PI).
System.out.println("E (cte de Euler) vale" + Math.E):
}
}

Comentario: La salida del programa es:

Pi vale 3.141592653589793
E (cte de Euler) vale 2.718281828459045

Ejercicio 3.2:
Escriba una clase de nombre Constantes que declare las siguientes constantes:

Velocidad de la Luz, e: 2,9979 ir! m/s


Constante Uni versaL de Gravitacin, G: 6,67- l 0'// N rn2/kg2
Constante de Planck, h: 6,6262 . JO3.;l-s

Escribir asimismo un programa llamado pruebaConstantes, que cree un objeto de la clase Constantes y luego
imprime los valores de las constantes y sus dimensiones.

Planteamiento: Una constante es un atributo al que se le ha declarado como fi na 1. Estos atributos slo pueden
tornar valor una vez, normalmente en la misma lnea de la declaracin. Como todos estos valores tienen
rangos muy pequeos o grandes, debern ser doub 1e.
Una constantees un atributofinal,
Solucin: que no se puede modificar.
class Constantes {
public final double C = 2.9979E08: II mIs VELOCIDAD DE LA LUZ
public final double G = 6.67E-11: II N m2/kg2 CONSTANTE GRAVITARORIA UNIVERSAL (O DE NEWTON)
public final double h = 6.6262E-34: II Js CONSTANTE DE PLANK
}

class PruebaConstantes {

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

public static void main (String args[]) {


Constantes ctes e new Constantes ():

System.out.println("La velocidad de la luz es " + ctes.C +


" en metros por segundo"):
System.out.println("La constante de gravitacin universal es " + ctes.G +
" en Newto~lspor metros al cuadrado partido kilogramos al cuadrado"):
System.out.println ("La constante de Plank es " + ctes.h +
" en jul ios por segundo"):
}
}

Comentario: La salida del programa es:

La velocidad de la luz es 2.9979E8 en metros por segundo


La constante de gravitacin universal es 6.67E-11 en Newtowspor metros al cuadrado partido kilogramos
al cuadrado
La masa en reposo del electrn es 9.1096E-31 en kilogramos
La carga del electrn es 1.6022E-19 en culombios
La constante de Plank es 6.6262E-34 en julios por segundo

Aviso: Este programa adolece de un defecto: para acceder a las constantes hay que crear primero un objeto. Es
mejor declararlas como constantes de clase, como se vio en el Ejercicio 3.1, en el que las constantes de la clase
Math estn disponibles sin necesidad de objetos. (Nota: adems, Math est escrito de forma que no se pueden
crear objetos.)

Ejercicio 3.3:
Escriba un programa para representar el consumo de energa de una instalacin elctrica. Para ello, se
dispondr de una clase que representa los aparatos conectados en la instalacin. Cada aparato tiene un
consumo elctrico determinado. Al encender un aparato elctrico, el consumo de energa se incrementa en la
potencia de dicho aparato. Al apagarlo, se decrementa el consumo. Inicialmente, los aparatos estn todos
apagados. Adems, se desea consultar el consumo total de la instalacin.
Hacer un programa que declare tres aparatos elctricos, una bombilla de 100 watios, un radiador de 2000
watios y una plancha de 1200 watios. El programa imprimir el consumo nada ms crear los objetos. Poste-
riormente, se enciende la bombilla y la plancha, y el programa imprime el consumo. Luego se apaga la
plancha y se enciende el radiador y se vuelve a imprimir el COnSUI'/IO.

Planteamiento: Segn el enunciado, la clase que modela a los aparatos elctricos tiene dos datos, su potencia
y si estn encendidos o no. Esta clase se llamar AparatoEl ctri co. Por otro lado, el consumo total debe ser un
atributo accesible a todos los aparatos elctricos, lo que se consigue con un elemento de clase. Para ello, se
declara el atributo eonsumoTotal, de tipo double y se califica como statie. As, todas las instancias de
AparatoEl ctri co comparten el mismo atributo.
Para consultar el consumo total de la instalacin, se proporciona un mtodo que devuelva el valor de
consumoTota 1. Este mtodo ha de ser tambin de clase (calificado corno stat ic) y se llamar consumo().
Cuando un aparato elctrico se enciende puede i ncrernentar el consumoTota 1 con la potenci a que consume,
Esto lo llevar a cabo el mtodo enei ende( ). Correspondientemente, cuando el aparato se apaga, se resta su
potencia al consumo total. Y de nuevo, slo si estaba encendido. Esto se implementa en el mtodo apaga ( ).
Evidentemente, hay que incrementar el consumo slo si el aparato estaba encendido

Solucin:
class AparatoElctrico {

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Ampliacin de clases

static double consumoTotal = o:

static double consumo() { Mtodo de claseparaaccedera un


atributode clase.
return consumoElctrico;
}

private double potencia:


private boolean encendido:

AparatoElctrico (double potencia) {


this.potencia = potencia:
encendido = false:
}

void enciende() {
if ( ! encendido ){ Alencender o apagar,slose
encendido = true: modificaelconsumo Tota 1 si
consumoElctrico += potencia: se cambia de estado.
}
}

void apaga() {
if ( encendido ){
encendido = false:
consumoElctrico -= potencia:
}
}
}

class ConsumoElctrico {

public static void main(String[] args) {


AparatoElctrico bombilla = new AparatoElctrico (100):
AparatoElctrico radiador = new AparatoElctrico (2000):
AparatoEl ctri co plancha = new AparatoEl ctri co (1200):

System.out.println("El consumo elctrico es " +


AparatoElctrico.consumo():

bombilla.enciende():
plancha.enciende();
System.out.println("El consumo elctrico es " +
AparatoElctrico.consumo ();

plancha. apaga() ;
radiador.enciende():
System.out.println("El consumo elctrico es " +
AparatoElctrico.consumo ();
}
}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Comentario: La salida por pantalla que genera este programa es:

El consumo elctrico es 0.0


El consumo elctrico es 1300.0
El consumo elctrico es 2100.0

Aviso: El punto ms delicado es olvidar que si se invoca el mtodo enei ende() dos veces seguidas, la segunda
no debe incrementar el consumo. Podra ser muy incmodo lanzar una excepcin en ese caso. Por ello, el
mtodo eneiende() slo incrementa el consumo si el aparato estaba apagado. Correspondientemente, slo se
decrementa el consumo si el aparato estaba encendido.

Ejercicio 3.4:
Aada a la clase Punto una constante llamada ORiGEN que sea el origen de coordenadas. La constante debe
ser accesible de forma esttica. Escriba un programa, de nombre Pruebaunto, que determine la distancia de
los puntos (3,4), (0,4) Y (2, -1) al origen usando la constante ORIGEN.

Planteamiento: Una constante es un atributo al que no se puede cambiar el valor una vez inicializado. Nor-
malmente, son atributos pblicos de clase. En este caso, el valor constante es un punto situado en (O,O). Para
declarar la constante se pone la palabra fi na 1 delante de un atributo, El atributo no podr cambiar de valor.
Corno se desea que la constante est disponible de forma esttica, se antepone tambin la palabra statie. As,
se podr usar la constante escribiendo Punto. ORIGEN,sin necesidad de tener objetos de la clase Punto.

Escribe: Se escribe el mensaje "Di stanei a de p al ori gen" seguido del valor.

Solucin:
class Punto {

public static final Punto ORIGEN Q new Punto (O. O):

private double x, y: Las constantesslopueden tomar


valoruna vez.Se recomienda
escribir
su nombre en maysculas.
public Punto (double x. double y) {
this.x = x:
this.y = y:
}

public double dameX(){


return x:
}

public double dameY(){


return y:
}

public double distancia (Punto p) {


double diffX = x - p.x;
double diffY = y - p.y;

return Math.sqrt(diffX * diffX + diffY * diffY):


}
}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Ampliacin de clases

elass Prueba Punto {


publie statie void main(String[] args) {
Punto pl = new Punto (3. 4):
Punto p2 = new Punto (O. 4):
Punto p3 = new Punto (2. -1):

System.out.println("Distaneia de pl al ORIGEN= " + pl.distaneia(Punto.ORIGEN)):


System.out.println("Distaneia de p2 al ORIGEN= " + p2.distaneia(Punto.ORIGEN)):
System.out.println("Distaneia de p3 al origen= " + p3.distaneia(Punto.ORIGEN)):
}
}

Comentario: Es muy comn declarar e inicializar las constantes simultneamente, Tambin es posible aadir
una seccin donde se inicializan los miembros estticos de una clase. Algunas clases de utilidad pblica tienen
todos sus atributos y mtodos declarados static, para usarlos directamente sin crear objetos. Un caso de
ejemplo ya visto es la clase Math. La salida del programa es:

Distancia de pI al ORIGEN= 5.0


Distancia de p2 al ORIGEN= 4.0
Distancia de p3 al origen= 2.23606797749979

Aviso: Puntos delicados acerca del problema o de la solucin.

Ejercicio 3.5:
Escriba una clase llamada Elemento, que disponga de un atributo con su nombre. La clase debe contener un
mtodo llamado nmerobelilememos que devuelve el nmero total de elementos que se han instanciado.

Planteamiento: Para determinar el numero total de elementos, se crea un atributo de clase que se incrementa
cada vez que se crea una nueva instancia. Esto se hace en el constructor de Elemento. Adems, se aade el
mtodo de clase nmeroDeEl ementos que lo devuelve.

Solucin:
elass Elemento {
private String nombre:

Elemento(String nombre) {
this.nombre = nombre;
Adems de laconstruccin habitual
numElementos++: de un objetode laclase,se actualiza
} elatributo
de clasenumE 1ementos.

statie private int numElementos = O:

statie int nmeroDeElementos(){


return numElementos:
}
}

publ ie elass PruebaElemento {

publie statie void main(String[] args) {

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Elemento H = new Elemento("Hidrgeno"):


Elemento He = new Elemento("Helio"):
Elemento Li = new Elemento("Litio"):

System. out. printl n( "Creados: " + Elemento. nmeroDeElementos( :


}
}

Comentario: Este programa imprime "Creados: 3" por pantalla.

Ejercicio 3.6: ,
Escriba una clase de nombre Item, que acepta un nombre en su constructor. Cada item debe disponer de un
nmero que servir como identificador nico de cada objeto. La clase tem dispondr de un mtodo para
obtener el identificador y otro para obtener el nombre. Haga un programa de prueba que genere tres items,
"uno", "dos" y "tres" y luego escriba los nombres e identificadores de cada tem.

Planteamiento: La parte del atributo no presenta ningn problema, Para asignar un identificador nico a cada
instancia de la clase, se proporciona un atributo de clase, que no es ms que un contador de objetos construi-
dos. Adems, se guarda el valor de ese contador en un atributo de cada objeto. As, cada,
objeto recibe un
nmero distinto, nico. Luego, el programa de prueba consiste en crear los tres objetos Item con nombres. Es
al acceder a los identificadores cuando se ve que cada uno ha recibido un nmero distinto.

Solucin:
,
class Item {
private static int contador = O:

private int Id:


private String nombre:
,
Item (String nombre) {
this.nombre = nombre;

Id = ++contador: Usamos un atributo de clase para


identificar a cada objeto de la clase.
}

int Id(){
return Id:
}

String nombre(){
return nombre:
}
}
,
public class Pruebaltem {
public static void ,main(String args[]) {
tem il = new Item(
,
"uno"):
tem
,
i2 = new Item(
,
"dos"):
Item i3 = new Item("tres") :
,
System.out.println("Item" + il.nombre() +" id" + il.ld(;

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Ampliacin de clases

,
System.out.println("Item"
,
+ i2.nombre() + " id " + i2.Id():
System.out.println("Item" + i3.nombre() + " id " + i3.Id():
}
}

Comentario: La salida del programa es:


,
Item
,
uno id 1
Item
,
dos id 2
Item tres id 3

Aviso: Como mecanismo de identificador de objetos, el sistema puede ser un poco pobre. Cuando los objetos
desaparecen, quedan nmeros sin asignar que no se volvern a usar, Todos Jos objetos en Java reciben un
identificador nico, pero basado en funciones de dispersin (hash function),

Ejercicio 3.7:
Se desea representar las bombillas que pueda haber en una casa. Cada bombilla tiene asociada un.interrup-
tor y slo uno. As mismo, existe un interruptor general de la casa. Un interruptor tiene dos estados, ON y
OFF. Una bombilla luce si el interruptor general de la casa est ON y su. interruptor asociado tambin.
Escriba una clase de nornbre Bombilla que permita modelar la informacon anterior. Para ello, la clase
dispondr de:

un mtodo para cambiar el estado del interruptor de la bombilla


un mtodo para cambiar el estado del interruptor general de la casa
un mtodo que determina si una bombilla est luciendo o no

Planteamiento: Los interruptores se representan por los estados ON y OFF, Para ello, se usa un enumerado
con ambos valores, llamado Estado. Por otro Jada, del enunciado se puede deducir que cada Bombi lla tendr
un atributo que ser su interruptor asociado, Ahora bien, el interruptor general es nico y comn para todas las
bombillas. Esto se modela como un atributo de clase (static) que comparten todos Jos objetos. Asimismo, el
mtodo que pulsa dicho interruptor ha de ser de clase tambin. Por ltimo, pru'ael mtodo que determi na si la
bombilla luce o no, hay que tener en cuenta que tanto el interruptor de la bombilla como el interruptor general
deben estar a ON. Cuando uno de ellos esta a OFF la bombilla no luce.

Solucin:
enum Estado { ON. OFF }:

class Bombilla {
ji Parte esttica que representa al Interruptor General
private static Estado interruptorGeneral e Estado.OFF;
La parte comn a todos los objetos
de una clase se representa con
public static void pulsalnterruptorGeneral(){ miembros de clase y se manejan
if (interruptorGeneral ce Estado.ON){ con mtodos de clase.
interruptorGeneral e Estado.OFF:
}else{
interruptorGeneral e Estado.ON:
}
}

ji Atributos y mtodos relativos a cada bombil7a


private Estado interruptor;

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

public Bombilla() {
interruptor = Estado.OFF:
}

public boolean luce() {


return (interruptor = Estado.ON) &&
(interruptorGeneral = Estado.ON):
}

public void pulsaInterruptor() {


if (interruptor = Estado.ON){
interruptor = Estado.OFF:
}else{
interruptor e Estado.ON:
}
}

II E7 main no forma parte del eiercicio


public static void main(String[] args) (
System. out. printl n( "Este mai n no forma parte del ejerci cio") :

Bombilla al = new Bombilla():


Bombilla a2 = new Bombilla():
Bombilla a3 = new Bombilla():

al.pulsaInterruptor():
System.out.println("al " + (al luce() ? "SI" "NO") + " luce."):

al.pulsaInterruptorGeneral():
System.out.println("al " + (al luce() ? "SI" "NO") + " luce."):

}
}

Comentario: Los mtodos que pulsan el interruptor (tanto el general COJllO el de la bombilla) comprueban el
estado para cambiarlo, mediante un i f (o un switch).
Si se modela el estado del interruptor con un booleano, llarnado estPu 1sado, el rntodo pulsar se
reduce a:

public void pulsaInterruptor() {


estPulsado = I estPulsado:
}

Aviso: No sera correcto en este problema representar los interruptores corno booleano Es cierto que cada
interruptor slo dispone de dos estados, as corno el tipo boa1ean tiene slo dos valores. Pero las operaciones
sobre el interruptor no son las que se dispone de los boa1ean.

Ejercicio 3.8:
Escriba un programa que utilice la clase Bombilla del apartado anterior. Para ello, se crear una Bombilla
y se imprimir por pantalla si luce o no. Luego se pulsa el interruptor de la Bombilla y se vuelve a imprimir
el estado de la misma. Por ltimo, se pulsa el interruptor general y se imprime el estado.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Ampliacin de clases

Planteamiento: Se define una clase pruebaBombi 11a. Primero instancia una Bombi11a, Hamada al. Corno los
interruptores pueden tener el valor ON y OFF, con el operador ternario "?:" se imprimen las palabras "SI" o
"NO" para determinar si lucen.

Solucin:
class PruebaBombilla {

public static void main(String[] args) {


Bombilla al = new Bombilla():

System out.println("al " + (a1 1uce () ? "SI" "NO") + .. 1uce. ") :

al.pulsalnterruptor():
System out.println("al " + (a1 1uce () ? "SI" "NO") + .. 1uce .") :

al.pulsalnterruptorGeneral();
System.out.println("al " + (al luce() ? "SI" "NO") + " 1uce .") :

}
}

Comentario: La salida por pantalla ser:

al NO luce.
al NO luce.
al SI luce.

PAQUETES

Ejercicio 3.9:
Se desea realizar una biblioteca de clases para el tratamiento de imgenes, vdeo y audio para la realizacin
de aplicaciones multimedia: Corno existirn multitud de formatos de imgenes, vdeo y sonido, se estructuran
las distintas clases en un paquete, llamado mediaib. Se agruparn los posibles codificadores y decodificadores
en tres subpaquetes:

"imagen", con los formatos GIF, TIFF Y lPEG.


"video" con los formatos H.263, MPEG-J Y MPEG-4
"audio" con los formatos GSM y MP3.

y, para cada uno de los formatos, se proporcionar una clase que pueda codificar y decodificar dichos
formatos. El nombre de esta clase ser "codecFormato", sustituyendo "Formato" por el tipo tratado, por
ejemplo, codecGIF, codecGSM, etc.
Se pide disear la estructura de directorios necesaria para la biblioteca, indicando los directorios y
ficheros necesarios. Asimismo, para cada fichero se debe escribir la declaracin pertinente respecto de la
pertenencia al paquete. NO SE PIDE que se codifiquen las clases, slo la informacion (le estructura.

Planteamiento: En Java, la estructura de paquetes se ha hecho coincidir con la estructura de carpetas y


ficheros en que se organizan las clases, as como las clases pblicas han de residir en ficheros con el mismo
nombre. Por ello, se generar una carpeta de nombre medi aBi b, dentro de la cual habr tres carpetas ms,
imagen, video y audio. Por ltim o, dentro de la carpeta imagen se crearn los ficheros codecGIF. java,
codecTIFF. java y codecJPEG. java. Dentro de la carpeta v deo existirn los ficheros codecH263. java,

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

codecMPEG1.java y codecMPEG4.java. Por ltimo, en la carpeta audio se pondrn los ficheros codecGSM.java y
codecMP3.java.

Solucin:
La estructura de directorios se muestra a continuacin:

El LJ medl1461b
8 t:J .ud.
D Q'J.,;I1l!t'I.](I,VA

D cO<j,,".:MP;J. ]4VA

~ cOdl"COrr.j.llv.
@ (;QCle'~,Jl"E.U.Jevo

[!) eeeeer UF .) tMl


SL:I "',],~o
lE) ,:od'f;Cf! 61.]IIV.II
o .. (I";~Mt"!';;l}t. )4'0''"'

[i"l COd':',:.!'1I'&il'l. )evd

Cada fichero debe contener al principio una Lnea indicando el paquete al que pertenece y luego las clases que
aporte. La siguiente lista recoge slo las lneas de declaracin de paquete:

codecGSM.java: package mediaBib.audio:


codecMP3.java: package mediaBib.audio:
codecGIF.java: package mediaBib.imagen:
codecJPEG.java: package mediaBib.imagen:
codecTIFF.java: package mediaBib.imagen:
codecH263.java: package mediaBib.video:
codecMPEGl.java: package mediaBib.video;
codecMPEG4.java: package mediaBib.video;

Comentario: Evidentemente, cada fichero tendr, al menos, una clase pblica con el mismo nombre que el
fichero. Los detalles de codificacin exceden del propsito de este libro, pero Java Media Framework (JMF) es
una biblioteca que cubre estos aspectos.

Aviso: Tenga en cuenta que para la clase que trata el formato H.263 se ha elegido el nombre codecH263. No se
puede usar codecH. 263, porque los identificadores de clase no pueden llevar un punto. Esto es as porque el
punto es el separador pm'a paquetes y generara ambigedad un nombre corno mediaBi b. video. codecH. 263.
Tampoco se admiten caracteres como el guin' -'. Por razones parecidas, se suelen evitarlas peculiaridades de
internacionalizacin, y se suelen evitar acentos y ees, que s estn admitidos.

CLASES PREDEFINIDAS

Ejercicio 3.10:
Escriba un programa que inicialice dos cadenas ele caracteres, una llamada nombre y otra llamada apellido.
Los valores iniciales ele las cadenas son "Juan" y "Prez", respectivamente. El programa debe escribir ambas
caelenas y su longitud por pantalla.

Planteamiento: Se declaran dos referencias a String, y se inicializan directmnente, asignando la cadena de


caracteres sin necesidad de new, en la misma lnea. Para conocer la longitud de una cadena de caracteres, se usa
el mtodo 1ength ( ).

Solucin:
class Cadenas 1 {

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Ampliacin de clases

public static void main (String args[]) (


String nombre - "Juan":
String apellido = "Prez": ------I[ El objeto original no se mod~ica. ]

System.out.println(nombre + " tiene" +


nombre length () + " letras"):
System.out.println(apellido + " tiene" +
ape 11ido.1ength () + " 1et ras" ) :
}
}

Comentario: La clase String es una de las ms usadas de Java. La salida por pantalla del programa es:

Juan tiene 4 letras


Prez tiene 5 letras

Alternativamente, una cadena se puede inicializar como Stri n9 nombre = new Stri nq( ..Juan"), expresin
completamente equivalente a la anterior, razn por la cual no se usa mucho,

Ejercicio 3.11:
Escriba un programa que declare una cadena de caracteres denominada nombre, con valor inicial "Juan",
primerpellido, con valor "Prez" y segundopellido con valor "Lopez". Despus, el programa concatena a
nombre el primer apellido y luego el segundo. Por ltimo, el programa imprime el nombre completo y su longitud

Planteamiento: Para concatenar dos cadenas, se usa la operacin "+". Tambin existe la variante "+=". Para
hacer el programa, se crean las tres variables nombre, pri merApe11i do y segundoApe11ido, inicializadas COJllO
indica el enunciado. Luego se concatena con nombre con primerApe 11ido con el operador "+=", y luego con
segundoApe11i do. Por ltirno, se imprilue el nombre y el nmero de letras.

Solucin:
class Cadena2 (

public static void main(String args[]) (


Stri ng nombre = "Juan";
Stri ng prime rApe 11ido = "Prez":
Stri ng segundoApe 11ido = "Lpez":

nombre += primerApellido:
nombre += segundoApellido:

System.out.println(nombre + " tiene" + nombre.length () + " letras"):


}
}

Comentario: Se podra resolver en una sola sentencia la concatenacin de los dos apellidos, de la forma:

nombre += primerApellido + segundoApellido:

La salida del programa es:

JuanPrezLpez tiene 14 letras

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Aviso: Cuando se concatenan cadenas, se forma una nueva, que contiene las dos originales seguidas sin separa-
cin ninguna, Si se hubiesen querido blancos entre las subcadenas, hay que ponerlos explcitamente, de la forma:

nombre += " " + primerApellido:


nombre += .. " + segundoApelldo:

Ejercicio 3.12:
Haga un programa que contenga la cadena "Juan Pin Lopez". El programa ha de imprimir por pantalla
ambas cadenas con todos los caracteres en minsculas y luego en maysculas.

Planteamiento: La clase Stri ng proporciona dos mtodos, totowerraser ) y toUpperCase ( ) que devuelven una
cadena con todos Jos caracteres en minsculas y en maysculas.

Solucin:
class Cadenas3 {

public static void main (String args[]) {


String sIc "Juan Pin Lpez":

System. out. printl n( "En mi nscu 1as " + 51. toLowerCase (:


System. out. printl n( "En maysculas " + 51. toUpperCase (:
}
}

Comentario: La salida de este programa es:

En minsculas juan pinon lpez


En maysculas JUAN PIN LPEZ

Fjese en que las letras acentuadas y la ee tambin han pasado a maysculas y minsculas,

Aviso: Los mtodos de la clase Stri ng no modifican la cadena contenida, sino que devuelven una nueva con
Ias modificaciones deseadas.

Ejercicio 3.13:
Escriba un programa que determine si los dos primeros argumentos pasados en lnea son iguales o no.

Planteamiento: Los dos primeros argumentos son args[O] y arg[ll Para comparar cadenas, se usa el mtodo
equa ls() que devuelve un booleano indicando si son iguales.

Solucin:
e 1ass Cadena4 {

public static void main (String args[]) {


if ( args[O].equals(args[I]{
System.out.println("Son iguales.");
}else{
System.out.println("NO son iguales. ");
}
}
}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Ampliacin de clases

Comentario: Se podra implementar alternativamente, usando la funcin compareTo(), que devuelve un O si


ambas cadenas son iguales. La sentencia quedara:

if ( args[0].compareTo(arg5[1]) == O ){
System.outpr intlnrSon iguales "):
[el se{
System.out.println("NO son iguales. "):
l
Aviso: Un error muy comn es usar el operador "==" para comparar objetos. Los objetos son referencias, es
decir, al comparar con "==" se est evaluando si las referencias apuntan al mismo sitio. El caso de Stri ng es
ms delicado porque, por razones de eficiencia, las cadenas con el mismo valor apuntan al mismo objeto. El
siguiente programa:

public static void main(String args[]) {


String sI = "hola":
String s2 = "hola":

if 52) {
(51 ==
System.out.println("Son iguales."):
l else {
SY5tem.out.println("NO son iguales."):
l
l
imprime por pantalla el mensaje "Son iguales. ", con lo que parece que "=" funciona bien. Se aconseja usar
siempre el mtodo equa 1 s ( ).

Aviso: En este programa habra que comprobar que el array de argumentos tiene al menos dos.

Ejercicio 3.14:
Escriba un mtodo que dado un objeto de la clase String cuente diferentes tipos de caracteres. En particular;
el mtodo imprimir el nmero de letras, dgitos y espacios en blanco de la cadena. Haga un programa que
escriba el conteo de la cadena "Hola, vivo en Marquina 123,5-7").

Planteamiento: Character El envoltorio


tiene funciones que trabajan sobre caracteres. Se usarn los
mtodos isLetter(), isDigit() e isWhitespace() para comprobar el tipo de un carcter. Para examinar
cada carcter del String, se recorre con un bucle foro Pero el bucle for espera una secuencia de un tipo
base. Con el mtodo toCharArray() de la clase Stri ng, se puede obtener un array de caracteres a partir de
un String.

Parmetros: Un String con la cadena a procesar.

Valor de retorno: El mtodo escribe en pantalla, por lo que el valor de retorno se especifica corno void.

Solucin:
class ContarLetras {
static void conteo (String s) {
int numLetras = O:
int numDgito5 = O:
int numEspacios = O:

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

for (char e: s. toCharArray( {---------------,


i f (Cha racter . i sLetter( c {
numLetras++: Se obtieneun array de caracteres
}e1se if (Character.isDigit(c{ para que el fo r pueda recorrerlo.
numDgitos++:
}e1se if (Character.isWhitespace(c{
numEspacios++:
} Cada tipode carcter se contabiliza
} en el apartado correspondiente.

System.out.print1n ("Nmero de letras" + numLetras):


System.out.print1n ("Nmero de dgitos" + numDgitos):
System.out.print1n ("Nmero de espacios" + numEspacios):
}

pub1ic static void main (String args[]) {


conteo ("Hola, vivo en t1arquina 123, 5-7"):
}
}

Comentario: La salida del programa quedara corno sigue:

Nmero de letras 18
Nmero de dgitos 5
Nmero de espacios 5

Otra forma de hacer el recorrido por la cadena sera utilizando el mtodo charAt(int index) de la clase
Stri nq, que devuelve el carcter en la posicin i ndex. El bucle se escribira as:

for (i nt i = O: i < s.l ength( ); i ++) {


char e = s.charAt(); -------------t[ Recorridocon charAt enelString. ~

if (Character , isLetter(c {
numLetras++;
}e1se if (Charecter isDigit(c {
numDgitos++;
}e1se if (Character.isWhitespace(c {
numEspacios++:
}
}

Esto no suele usarse por razones de eficiencia y de legibilidad.

Ejercicio 3.15:
Escriba un mtodo que, dado un String, devuelve otro objeto String en el que se cambian todas las vocales
minsculas del original por la letra 'a'.

Planteamiento: El mtodo rep 1ace() de la clase Stri nq sustituye un carcter por otro en una cadena. Como se pide
cambiar vari as letras, se invoca rep 1ace () sucesi vamente, cada vez con una vocal disti nta a susti tui r por la letra 'a'.

Parmetros; El objeto Stri n9 a modificar,

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Ampliacin de clases

Valor de retomo: Un valor String con las vocales sustituidas.

Solucin:
String sustituye (String s) (
s = s. rep 1ace( 'e'. . a' ) :
s = s. rep 1ace( 'i ':
s = s. rep 1ace( 'o'.
. a' ) :
. a' ) :
------------I[ Elobjetooriginalno se modifica.~

s = s. rep 1ace( 'u'. . a' ) :

return s:

Aviso: Slo hay que tener cuidado con no sustituir la vocal 'a', pues es innecesario. El mtodo no sustituye
letras acentuadas, etc.

Ejercicio 3.16:
Escriba un mtodo que, dada una cadena de caracteres, devuelve la mitad inicial de la cadena. Escriba un
programa que pruebe el mtodo con las cadenas "Hola que tal" y "Adis".

Planteamiento: El mtodo substri ng( i ni cio, final) toma dos nmeros y devuelve una cadena que comien-
za en i ni ci o y termina en fi na l. Las cadenas comienzan en 0, y 1ength ( ) /2 da el punto medio, Luego se
escribe un mai n() para probar con las cadenas propuestas por el enunciado.

Parmetros: La cadena a dividir, de tipo Stri ng.

Valor de retomo: Un objeto de la clase Stri ng, con el resultado.

Solucin:
class ParteA1Medio (

stati e Stri ng parteA 1Medio(Stri ng s) (

}
return s.substring(O. s.length() / 2): ------I[ Se empieza a contar por O. ~

public static void main(String args[]) (


String s:

s = "hola que tal":


System.out.println(s + " " + parteA1Medio(s:

s = "Adis":
System.out.println(s + " " + parteA1Medio(s:
}

Comentario: Este programa escribe por pantalla:

hola q
Ad

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Ejercicio 3.17:
Escriba un mtodo que, dada una cadena de caracteres, sustituya todas las ocurrencias del texto "es" por
"no por", Escriba un segundo mtodo que sustituya todos los grupos de dgitos por un nico carcter asteris-
co, es decir, si la cadena de caracteres es "esto/234es5678buen0900" el primer mtodo debe devolver "no
porto/234no por5678buen0900" y el segundo debe devolver "esto "es vbueno=". Escriba el programa que
permita comprobar que funciona correctamente.

Planteamiento: El mtodo rep 1ace( Stri ng, Stri ng) toma una expresin regular y la cadena por la que desea
sustituir cualquier ocurrencia de la expresin regular, Si el primer parmetro se utiliza una cadena de caracte-
res se tomar COIUO tal cuando coincida completamente,

Parmetros: La cadena sobre la que se quiere aplicar los cambios, por tanto el parmetro ser de la clase
Stri ng,

Valor de retorno: El objeto de la clase Stri ng modificado,

Solucin:
pub1ic c1ass UsoString {

pub1ic static String cambiaEs(String textol{


return texto. rep1 aceA11("es", "no por" l ;
}

pub1ic static String cambiaDigitos(String texto)]


return texto. rep1 aceA11(" \ vd+". "*"): Utiliza una expresin regular que
significa un dgito o ms,
}

pub1ic static void main(String[] args) {


Stri ng textoOrigi na1 e "esto1234es5678bueno900":

System.out.print1n(cambiaEs(textoOriginal:
System.out.print1n(cambiaDigitos(textoOriginal:
}
}

Comentario: Para ver cmo definir una expresin regular consulte la documentacin de la clase Pat tern,
Fjese que para escribir la expresi n regular \d+ hay que duplicar la barra hacia atrs, El resultado de este
programa es:

no porto1234no por5678bueno900
esto*es*bueno*

Ejercicio 3.18:
Escriba un mtodo que, dada una cadena de caracteres, cuente cuntas veces aparece la misma en dicho texto.
Por ejemplo, para la cadena "En un lugar de la mancha, de cuyo nombre no puedo acordarme", si se cuenta
cuntas veces aparece "o ", o dicho de otra forma, cuntas palabras acaban en o, debera indicar que son 3,

Planteamiento: Para buscar un texto dentro de una cadena de caracteres se puede utilizar el mtodo indexOf()
que devuelve la posicin en que empieza el texto buscado dentro del original. Para buscarlo ms de una vez
se usa el mismo mtodo donde el segundo argumento permite indicar a partir de qu posicin empezar a
buscar,

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Ampliacin de clases

Parmetros: La cadena en la que se quiere contar cuntas veces aparece el texto y el texto que se quiere
buscar. Por tanto, se necesitan dos objetos de la clase Stri ng.

Valor de retomo: El nmero de veces que aparece el segundo argumento en el primero, es decir, un valor del
tipo int.

Solucin:
public class UsoString (

public static int cuentaVeces(String texto. String busca){


int pos = O:
int veces = O:
whilepos = texto.indexOf(busca. pos >= O){
pos += busca.length():
veces++:
}

return veces:
}

public static void main(String[] args) (

System.out.println("Veces que aparece \"0 \": " +


cuentaVeces( "En un lugar de la mancha. de cuyo nombre no puedo acordarme" .
"o ":
}
}

Ejercicio 3.19:
Escriba un mtodo que cuente el nmero de palabras que contiene un texto.

Planteamiento: Para contar el nmero de palabras se puede utilizar de la clase Stri ng el mtodo sp 1it ( ) que
permite dividir una cadena de caracteres en fragmentos de acuerdo con una expresin regular, devolviendo un
array de Stri ng con todos los fragmentos del texto original. Para dividir por palabras, se utiliza como expresin
regular" +", un espacio y un signo ms, que significa un espacio una o ms veces. Antes de llamar a sp 1 it() se
llamar al mtodo trim() para eliminar los espacios en blanco que pueda haber al principio y al final del texto.

Parmetros: La cadena de la que se quiere contar el nmero de palabras que tiene.

Valor de retomo: El nmero de palabras de la cadena de caracteres, es decir, un valor del tipo int.

Solucin:
public class UsoString (

public static int cuentaPalabras(String texto){


Utiliza una expresin regular que
String[] palabras = texto.trim().split(" +"): significa un espacio o ms.
return palabras.length;
}

public static void main(String[] args) {


System.out.println("Nmero de palabras: " +

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

cuentaPa1abrase "En un 1ugar de 1a mancha. de cuyo nombre no puedo acordarme":


}
}

Ejercicio 3.20:
Escriba un programa que determine cuntas veces una persona celebra su cumpleaos en lunes. El programa
debe imprimir lasfechas en que el cumpleaos cae en lunes los primeros 40 aos de su vida y el total de ellas.
Suponga el ejemplo de una persona que naci el4 de abril de 1965 y tiene 40 aos.

Planteamiento: Mediante la clase GregorianCalendar, se construye la fecha deseada. Con un bucle for se
recorren los 40 aos, aadiendo cada ao medi ante el mtodo ro 11( ). Para cada fecha, se obtiene el da de la
semana y se compara si es lunes (Ca 1endar. MONDAY),en cuyo caso se imprime la fecha en formado da/mes/
aos. Adems, se proporcionar un contador

Solucin:
import java. uti 1.Gregori anCa1endar:
import java.util.Calendar:

public class CuentaDas (

public static void main(String[] args) (


int cuentaLunes = O:

GregorianCalendar gc = new GregorianCalendar(1965. Calendar.APRIL. 4):

for (i nt i = O; i < 40: i ++) (


gC.roll(Calendar.YEAR.1): --------------------1[ Avanza un ao. ~

if (gc.get(Calendar.DAY_OF_HEEK) == Calendar.MONDAY){
cuentaLunes++:

System. out. printl n( "El " + gc. get (Calendar. DAY_OF_MONTH)+


"I " + (gc. get (Ca1endar .MONTH
) +1) +
"/" + gC.get (Calendar.YEAR) +
" es 1unes" ) ;
} Los meses se representan desde O
(enero) a 11 (diciembre).
}

System.out.println ("El cumpleaos se celebra en" + cuenta Lunes + " lunes"):


}
}

Comentario: La salida del programa es:

El 4/4/1966 es lunes
El 4/4/1977 es lunes
El 4/4/1983 es lunes
El 4/4/1988 es lunes
El 4/4/1994 es lunes
El 4/4/2005 es lunes
El cumpleaos se celebra en 6 lunes

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Ampliacin de clases

Aviso: El bucle for primero incrementa el ao (mtodo ro 11) porque se considera que el da de nacimiento no
se celebra el cumpleaos.
Hay que tener cuidado con los meses, pues Ca1endar considera el O como enero y el 11 como diciembre. Si
se escribe GregorianCa 1endar( 1965. 4. 4), se especifica el 4 de mayo de 1965.

Il\IPORTACIN ESTTICA

Ejercicio 3.21:
Escriba un mtodo que dado un ngulo en radianes, lo escriba en pantalla en grados, as como los valores del
seno, el coseno y la tangente. Las funciones de Math han de importarse de forma esttica. Haga un programa
que imprima los valores de esas tres funciones para los valores O, 71/4, 71/2, Y 7r en radianes.

Planteamiento: Al importar de forma esttica, no se requiere anteponer el nombre de la clase. Entonces se


importa toda la clase Math. El ngulo, cuando no se dice nada, se supone que est en radianes. El mtodo
toDegrees () lo pasa a grados.

Parmetros: Un doub 1e con el ngulo.

Valor de retorno: El resultado del mtodo es escribir en pantalla. El mtodo no necesita devolver ningn valor
de retorno por Jo que se uti liza la clusula voi d.

Solucin:
import static java .1ang Math *; Importacinestticade todoslos
mtodos de laclaseMath.
public class Trigonometra {

static void funciones(double alfa) (


System.out.println(toDegrees(alfa) + " " + sin(a1fa) +
" " + cos(alfa) + " " + tancal fa) ):
}
public static void main(String args[]) (
funciones(O);
funciones(PI / 4):
funciones(PI / 2):
funciones(PI):
}
}

Comentario: La salida del programa quedara como sigue:

0.0 0.0 1.0 0.0


45.0 0.7071067811865475 0.7071067811865476 0.9999999999999999
90.0 1.0 6.123233995736766E-17 1.633123935319537E16
180.0 1.2246467991473532E-16 -1.0 -1.2246467991473532E-16

Aviso: El cdigo queda ms simple, pero no siempre mejora la legibilidad del programa, porque se olvida de
dnde proceden los mtodos,

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
7155dd7t679ced17baa7b72020ba1792
ebral'y

7155dd7f679ced17baa7b72020ba1792
e b rary

7155dd7t679ced17baa7b72020ba1792
ebral'y

7155dd7f679ced17baa7b72020ba1792
ebrary

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Estructuras de control

,
4.1 ESTRUCTURAS DE SELECCION
4. 1. 1 Estructura if
La estructura i f se escribe de la siguiente forma:

if (condicin) {
sentencias
}

La condicin se escribe siempre entre parntesis. La condicin es una expresin que evala un valor de tipo
boolean (booleano) como las expresiones aritmtico-lgicas vistas en el Captulo 1. Si la condici n devuelve true se
ejecuta el conjunto de sentencias dentro del bloque del i f.
Un bloque de sentencias est delimitado por llaves, por lo que la estructura i f est asociada a todo el bloque de
sentencias. Si la estructura if lleva asociada slo una sentencia, se puede poner sin lJaves, pero se recomienda
aadirlas aunque sea redundante. Esto mismo es aplicable al resto de estructuras que se describen en las siguientes
.
secciones.
Por ejemplo, suponga que en un programa existe una variable velocidad de tipo int cuyo valor es 80:

if (velocidad <= 90){


System.out.println("la velocidad es menor o igual que 90."):
}

Como la condicin vale true, se escribe por pantalla el mensaje de la sentencia dentro del bloque i f.

4. 1.2 Estructura i f -e 1se


La estructura i f -e 1se se escribe de la siguiente forma:

if (condicin) {
sentencias

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

} else {
sentencias
}

La condicin es una expresin lgica como en la seccin anterior. Si la condicin es verdadera, es decir, se evala
a true, se ejecuta la sentencia o bloque de instrucciones que se encuentra a continuacin del if. Seguidamente, el
programa continuara su ejecucin de forma secuencial con la sentencia inmediatamente posterior a toda esta estruc-
tura. Si, por el contrario, la condicin se evala a fa 1se, se ejecuta la sentencia o el bloque de sentencias que se
encuentra a continuacin del el se y el programa continuara su ejecucin.
Por ejemplo, suponga que en un programa existe una variable velocidad de tipo int cuyo valor es 110:

if (velocidad <= 90) {


System.out.println("La velocidad es menor o igual que 90.");
} else {
System.out.println("Velocidad excesiva. Supera los 90.");
}

q Sobre la estructura if-else consulte los Ejercicios 4.1 a 4.11.

4. 1.3 Operador condicional


El operador condicional (?:) est relacionado con la estructura i f-e 1se. El operador evala la condicin a la izquier-
da del smbolo? Si la condicin vale true devuelve el valor de la expresin que haya entre el? y el :. Si la condicin
vale fa 1se se devuelve el valor de la expresin tras el smbolo :. Por ejemplo, para escribir el In ay 01' de tres nmeros
se puede escri bir.

System.out.print("El nmero mayor es el de valor "):


System.out.println(a > b ? a : b):

q Sobre el operador condicional consulte los Ejercicios 4.2 a 4.6 y 4.16.

4.1.4 Estructura switch


La estructura switch consta de una expresin y una serie de etiquetas case con un caso opcional default. La
sentencia svlitch se escribe de la siguiente forma:

switch (expresin){
case valorl:
sentencias:
break;
case valor2:
case valor3:
sentencias:
break;

default:
sentencias:
break;
}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Estructuras de control

La expresin, que es obligatorio que est entre parntesis, tiene que evaluarse a un entero, un carcter, un enume-
rado o un booleano A continuacin, en cada case aparece un valor que nicamente puede ser una expresin constante,
es decir, una expresin cuyo valor se puede conocer antes de empezar a ejecutar el programa, del mismo tipo que la
expresin del switch. Despus de cada case se puede poner una nica sentencia o un conjunto de ellas. Los valores
asociados en cada case se comparan en el orden en que estn escritos. Cuando se quiere interrumpir la ejecucin de
sentencias se utiliza la sentencia break que hace que el control del programa termine el switch y contine ejecutando
la sentencia que se encuentre despus de esta estructura. Si no coincide el valor de ningn case con el resultado de la
expresin, se ejecuta la parte default.
Si ningn valor de los case coincide con el resultado de la expresin y la parte default no existe, ya que es
opcional, no se ejecuta nada de la estructura sw tch.
Por ejemplo, suponga que desea conocer el nmero de das de un mes dado. Un switch es la mejor opcin para
seleccionar cmo calcular cuntos das le corresponden a cada mes.

public class DasDelHes {


enum Mes {Enero. Febrero. Harzo. Abril.
Mayo. Junio. Julio. Agosto.
Septiembre. Octubre. Noviembre. Diciembre}

public static void main(String[] args) {


int das:
Mes mes = Hes Noviembre:
switch (mes) {
case Abril:
case Junio
case Septiembre:
case Noviembre:
das = 30:
break;
case Febrero: ji no se conoce el ao
das = 28:
break;
default:
das = 31:
break;
}
System.out.printlnC"El mes" + mes + " tiene" + das + " das. "):
}
}

c:> Sobre la estructura switch consulte los Ejercicios 4.13 y 4.24.

,
4.2 ESTRUCTURASDE REPETICION
4.2.1 Estructura whi1e
La estructura de repeticin \~hi1e sigue el siguiente esquema:

while (condiCin){
sentencias
}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

La condicin tiene que estar obligatoriamente entre parntesis. La condicin es una expresin lgica. Si la condi-
cin vale true, se ejecutan las sentencias que componen el bucle. Cuando concluye la ejecucin de las instrucciones
del bucle se vuelve a evaluar la condicin. De nuevo, si la condicin es cierta se vuelven a ejecutar las instrucciones
del bucle. En algn momento la condicin valdr false, en cuyo caso finaliza la ejecucin del bucle y el programa
contina ejecutndose por la sentencia que se encuentre a continuacin de la estructura whi 1e.
Por ejemplo, el siguiente mtodo devuelve true si el nmero introducido por parmetro es un nmero primo.

public boolean primo(int numero){


int divisorc2:
boolean primo = true:

while divisor * divisor <= numero) && primo) {


if (numero % divisor c= O)
primo = false;
divisor++:
}

return pr t mo:
}

~ Sobre la estructw'a while consulte los Ejercicios 4.13, 4.14 Y4.24.

4.2.2 Estructura do-while


La sentencia do-wh: 1e tiene la siguiente estructura:

do {
sentencias
} while (condicin):

Cuando en un programa se Uega a una estructura do-wn le se empiezan a ejecutar las sentencias que componen la
estructura. Cuando se terminan de ejecutar se evala la condicin. Si la condicin vale true, se ejecutan de nuevo las
sentencias que componen la estructura. El bucle deja de repetirse cuando, tras evaluarse la condicin, sta vale fa 1se.
Corno ocurra con la estructura whi 1e es necesario que dentro del bucle, en algn momento, la condicin valga fa 1se
para evitar que el bucle se ejecute indefinidamente,
Suponga que se desea realizar un programa que solicite al usuario un nmero entre O y 100, ambos inclusive. Al
terminar debe imprimir por pantalla el nmero introducido. Si el nmero introducido no est dentro del intervalo,
debe dar un mensaje de error. Un posible programa sera el que se muestra en el siguiente ejemplo:

import java.util.Scanner:

public class PedirNumero {


public static void main(String[] args) {
int numero:
String 1inea:

Scanner teclado = new Scanner(System.in):

do {
System.out.print("Introduzca un nmero entre O y 100: ");

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Estructuras de control

numero teclado.nextlnt():
Q

} while (numero < O II numero> 100):

System.out.println("El nmero introducido es: " + numero):


}
}

~ Sobre la estnlctura do-while consulte los Ejercicios 4.28, 4.30 Y4.51.

4.2.3 Estructura for


La estructura for tiene dos formas. La ms habitual es:

for (inicializacin: condicin; actualizacin){


sentencias
}

Los elernentos de que consta son los siguientes:

La i ni ci a 1i zaci n es una sentencia que perrnite inicializar el bucle, puede ser la declaracin e inicializacin
de las variables que se utilizan en el bucle. Esta sentencia de inicializacin se ejecuta nicamente una vez en
la pri mera ejecucin del bucle.
La condici n es la condicin para continuar la ejecucin del bucle. La condicin se evala siempre antes de
empezar a ejecutar el bucle. Si la condicin es cierta, se ejecutan las sentencias del bucle.
Despus de ejecutar las sentencias del bucle y antes de volver a evaluar la condicin se ejecuta la actua 1i za-
cin. Esta parte se suele utilizar para modificar el valor de las variables que forman parte de la condicin.

Todos los elementos que se acaban de describir del bucle for son opcionales, es decir, pueden ser vacos. Por
ejernplo, para escribir por pantalla 5 veces el mensaje "Hola a todos" con el nmero de vez, se puede escribir:

for (int i = O: i < 5: i++) (


System.out.print(i + 1);
System.out.println(" Hola a todos. "):
}

La segunda estructura de un bucle for es la siguiente:

for (variable : estructural{


sentencias
)

donde la variable indicada entre parntesis, que se puede declarar en ese misrno lugar, va tornando el valor de todas
las variables de la estnrctura indicada, repitindose el bucle para todos los valores. Por ejemplo, para escribir por
pantalla todos los elementos de un array de String se puede escribir:

for(String a : miArrayOeString){
System.out.println(a);
}

~ Sobre la estructura for consulte los Ejercicios 4.15 a 4.27.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

4.2.4 Uso de las estructuras de repeticin


Es importante utilizar el tipo de bucle ms apropiado en cada parte de un programa, En la Tabla 4.1 se pueden ver las
reglas a tener en cuenta para usar una u otra estructura de repeticin.

Tabla 4.1. Reglas de uso de las estructuras de repeticin.

Estructura Usar si

whi le Si el bucle se ejecuta O o ms veces. Es decir, si hay casos donde no se ejecute.


do-whi le Si la parte de ejecucin del bucle se ha de hacer al menos una vez.
for Se sabe el nmero de veces que se ha de repetir el bucle.

Si utilizar la inicializacin y la actualizacin del bucle permite escribir el cdigo


de forma ms clara.

Se realiza un recorrido en una estructura de almacenamiento,

Si la estructura de almacenamiento se va a recorrer completa realizando operacio-


nes con sus valores, se utilizar la segunda versin del foro

4.3 ESTRUCTURASDE SALTO


4.3.1 Sentencia break
La sentencia break se utiliza para terminar inmediatamente la ejecucin de una estructura de repeticin o de un
switch. Una vez se ha ejecutado la sentencia break, la ejecucin contina tras la estructura de repeticin o switch
donde se ha ejecutado break.

~ Sobre la sentencia break consulte los ejercicios de uso de la sentencia switch y el 4.24.

4.3.2 Sentencia continue


La sentencia conti nue nicamente puede aparecer dentro de una estructura de repeticin. El efecto que produce es
que se deja de ejecutar el resto del bucle para volver a evaluar la condicin del bucle, continuando con la siguiente
iteracin si el bucle lo permite.

4.4 EXCEPCIONES
4.4.1 Captura
La estructura de captura de excepciones es try-catch- fi na lly.

try {
sentencias
} catch (ClaseException e) {
sentencias
} catch (ClaseException e) {

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Estructuras de control

sentencias
} catch CClaseException e) {
sentencias
} finally {
sentencias
}

En la estructura try-catch- fi nally, la parte catch puede repetirse tantas veces como excepciones diferentes se
deseen capturar. La parte finally es opcional y slo puede aparecer una vez.
Para ver cmo funciona esta estructura en el siguiente ejemplo se presenta un programa que pide al usuario un
nmero entre Oy 100.,con manejo de excepciones.

import java.io.*:

public class PedirNumero2 {


public static void main(String[] args) {
int numero = -1;
int intentos = O:
String 1inea:

BufferedReader teclado = new BufferedReaderCnew InputStreamReaderCSystem.in:

do {
try{
System. out. pri nt( Introduzca un nmero entre O y 100: "):
n

linea = teclado.readLineC):
numero = Integer.parselntClinea):
}catch(IOException e){
System. out. print 1n( "Error al 1eer del teclado. n) :
}catch(NumberFormatException e){
Systen.out.pr int lntDebe introducir un nmero entero entre O y 100. "):
}finally{
intentos++:
}
} while (numero < O II numero> 100):

Systen.out.pr+rrt.lnrEl nmero introducido es: + numero): n

System. out. pri nt 1nC Numero de intentos: + intentos):


n n

En este programa se pide repetidamente un nmero utilizando una estructura do-wh i 1e, mientras el nmero sea
menor que O o sea mayor que 100. Dentro de esta estructura do-whi le es donde se solicita el nmero al usuario. El
mtodo readL ine( ) de la clase BufferedReader puede lanzar la excepcin IOExcept ion. Si no se hace nada con ella,
cuando se produce el programa termina. As mismo, la llamada al mtodo parse lnt O puede lanzar la excepcin
NumberFormatException. Esta excepcin se lanza cuando parselnt O no puede convertir el texto en un nmero
entero.
Cuando se produce una excepcin se compara si coincide con la excepcin del primer catch. Si no coincide se
compara con la excepcin del segundo catch, y as sucesivamente. Cuando se encuentra un catch cuya excepcin
coincide con la que se ha lanzado, se ejecuta el bloque de sentencias de ese catch.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Si ningn bloque catch coincide con la excepcin lanzada, dicha excepcin se lanza fuera de la estructura try-
catch -fi na 11y. Si no se captura en el mtodo, se debe lanzar delegndola. Para ello debe declararlo en la cabecera del
mtodo,
El bloque fi na 11y se ejecuta tanto si try termin normalmente como si se captur una excepcin en algn bloque
catch. Es decir, el bloque fi na 11 y se ejecuta siempre.

4.4.2 Delegacin
Se produce una delegacin de excepciones cuando un mtodo utiliza una sentencia que puede generar una excepcin,
pero la excepcin que se puede generar no la captura y la trata, sino que la delega a quien le llam, Para ello,
simplemente, declara en la cabecera que la excepcin que se puede producir durante la ejecucin del mtodo la puede
generar dicho mtodo de la siguiente forma:

public class Alumno {

public int leeAo(BufferedReader lector) throws IOException. NumberFormatException {


String linea teclado.readLine(): Q

Return Integer.parselnt(linea):
}

De esta forma si al leer del BufferedReader que recibe en el parmetro se encuentra con algo que no es un entero,
se generar una excepcin yen lugar de devolver el entero, se enviar la excepcin a donde se llam a este mtodo.

4.4.3 Definicin de excepciones de usuario


Una excepcin es una clase. Para crear una excepcin se deriva de la clase Exception. Para ms detalles sobre
derivacin de clases y herencia vase el Captulo 5. Si se desea tener una excepcin que indique un ao fuera de
rango, se puede hacer de la siguiente forma:

public class AoFueraDeRangoException extends Exception {


public AoFueraDeRangoException(String texto) {
superCtexto) ;
}
}

Al crear la excepcin, se ha aadido un constructor que acepta un Stri ng. De esta forma se puede aadir un
mensaje al crear la excepcin que d detalles adicionales sobre el problema que ha generado la excepcin. A partir de
este momento se dispone de una excepcin que se puede lanzar cuando sea necesario,

4.4.4 Lanzamiento de excepciones de usuario y redefinicin


Si se dispone de la excepcin declarada en el apartado anterior en una posible clase Alumno, el mtodo
ponAoDeNacimientoC) quedara:

public class Alumno {

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Estructuras de control

public void ponAoOeNacimiento(int ao) throws AoFueraOeRangoException {


if (ao < 1900 II ao> 1990)
throw new AoFueraOeRangoException( "Oemasiado joven o demasiado viejo."):
aoOeNacimiento = ao:
}

De esta forma, si al llamar al mtodo se utiliza un valor de ao anterior a 1900 o posterior a 1990, el mtodo no
asigna ese ao al alumno, sino que lanza una excepcin indicando que ese ao no tiene sentido para un alumno. Para
lanzar una excepcin se utiliza la sentencia throw con el objeto excepcin que se desea lanzar. Se ha hecho en el
mismo paso la creacin y lanzamiento de la excepcin.
Para capturar dicha excepcin desde donde se llam al mtodo ponAoDeNacimiento(), se hara entonces de la
siguiente forma:

try {

alumno.ponAoOeNacimiento(unAo):

} catch (AoFueraOeRangoException e) {
ji manejar la excepcin de poner el ao

e> Sobre el uso de excepciones en sus distintas formas consulte Jos Ejercicios del 4.30 al 4.51.

4.5 ASERCIONES
4.5.1 Aserciones como comprobacin de invariantes
Una asercin tiene la siguiente sintaxis:

assert condicion:

assert condicion : mensaje:

donde la condicin es una expresin lgica que debe cumplirse en el momento en que se evala la asercin. Si la
condicin no se cumple, el programa termina con un error. Tras el operador dos puntos puede ponerse un String con
el mensaje que se devuelve como error.

4.5.2 Aserciones como precondiciones


Corno convenio, las precondiciones de un mtodo pblico en Java es preferible que se comprueben mediante una
condicin y lancen la excepcin 1llega 1ArgumentException o la excepcin apropiada de acuerdo con el error encon-
trado, como en el siguiente ejemplo:

public void ponEdad(int edad) throws Exception{

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

if(edad < o II edad> 150)


throw new Exception("Edad no vlida. "):

l/resto del mtodo

Sin embargo, en un mtodo no pblico s se puede sustituir esa comprobacin, en muchos casos redundante, por
una comprobacin que asegure que el mtodo se utiliza de forma consistente en la clase, como en el siguiente ejemplo,

pri vate void fijalnterva 1o( int interva 1o) {


assert intervalo> O && intervalo <= MAX INTERVALO:

l/resto del mtodo

Si al Ilamar al mtodo fijalntervalo(), el valor del parmetro no est dentro del intervalo establecido, al no
cumplirse la condicin de la asercin, el programa terminar con un error.

4.5.3 Aserciones como postcondiciones


En este caso s se recomienda el uso de aserciones para la comprobacin de las postcondiciones de un mtodo, pues se
supone que el mtodo se encuentra bien implementado. En este caso, el uso de postcondiciones permite asegurar que
se cumplen en too as las ejecuciones que se hacen del mtodo,

public void ordenar(int[] datos){


/la Igoritmo de ordenacin

boolean desordenado = false:


for(int i=O: i<datos.length-l: i++)
desordenado = desordenado II datos[i]>datos[i+l]:
assert I desordenado : "Ordenar: array no ordenado.";
}

El mtodo anterior es un mtodo de ordenacin de nmeros enteros. Al ti nalizar el mtodo debe asegurarse que el
array termina con too os sus datos ordenados. Como esta comprobacin es compleja se ha aadido unas lneas de
cdigo que hacen la comprobacin. En la asercin se ha utilizado la versin completa, en la que si la condicin no se
cumple, se evala la parte que hay tras los dos puntos y con ello se construye el error AsertionError. Cuando el
programa termina, aparecer en pantalla el mensaje que se ha puesto tras los dos puntos.

4.5.4 Aserciones como invariantes


Las aserciones como invariantes permiten comprobar en cualquier parte del cdigo de un mtodo que se cumplen los
invariantes establecidos. Su uso es el mismo que para las postcondiciones.

~ Sobre el uso de aserciones consulte el Ejercicio 5.10.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Estructuras de control

EsTRUCTURAS DE SELECCIN

Ejercicio 4.1:
Escriba un mtodo, de nombre mayorlrelidad, que reciba una edad como entero por parmetro y muestre un
mensaje por pantalla si es mayor de edad o no.

Planteamiento: El mtodo debe escribir "La persona es mayor de edad" o "La persona no es mayor de edad".
Se utilizar la estructura i f para aadir dentro del mensaje de salida "no" si no se cumple que el valor
proporcionado al mtodo como parmetro es mayor que el valor constante 18.

Parmetro: El mtodo recibe por parmetro un valor entero, que se comparar con la constante tambin
entera 18.

Valor de retomo: El mtodo no necesita devolver ningn valor de retorno por lo que se utiliza la clusula void.

Solucin:
public void mayorDeEdad(int edad) {
final int MAYORIA EDAD = 18:

System. out. print ("La persona ..):


if(edad < MAYORIA_EDAD){
System out. print( "no"):
}
System. out. print 1n (" es mayor de edad."):
}

Ejercicio 4.2:
Escriba un mtodo, de nombre nlayorQue25, que reciba un entero por parmetro y muestre un mensaje por
pantalla que indique si es mayor o menor que 25.

Planteamiento: El mtodo se podra realizar, igual que el anterior, utilizando la estructura if-else. Pero
tambin es posible implementar una solucin utilizando el operador condicional (? :) .

Parmetro: El mtodo recibe por parmetro un valor entero (int), que se comparar con la constante tambin
entera 25.

Valor de retomo: El mtodo no necesita devolver ningn valor de retorno por lo que se utiliza la clusula
void.

Solucin:
public void esMayorQue25(int n) {
final int VEINTICINCO = 25:

System.out.print("El nmero" + ni:


System.out.printCn> VEINTICINCO? ..es ":" no es ..):
System.out.printlnC"mayor que" + VEINTICINCO + .....
):
}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Ejercicio 4.3:
Escriba un mtodo, de nombre mayorlrelidad, que reciba una edad como entero por parmetro y devuelva si
la persona es mayor de edad o !lO.

Planteamiento: Se proponen dos soluciones. El mtodo, al igual que el anterior, se podra realizar utilizando
la estructura i f. Pero tambin es posible implementar una solucin utilizando el operador condicional (?:). En
ambos casos el mtodo debe ejecutar una sentencia return con el valor booleano adecuado.

Parmetro: El mtodo recibe por parmetro un valor entero, que se comparar con la constante tambin
entera 18.

Valor de retorno: El mtodo devuelve un valor boo1ean.

Solucin1: (con sentencia if)


public boolean mayorDeEdad(int edad){
final int MAYORIA EDAD = 18:

if (edad >= MAYORIA_EDAD){


return true:
}
return fa1se:
}

Solucin2: (con operador condicional)


public boolean mayorDeEdad(int edad){
final int DIECIOCHO = 18;

return (edad >= DIECIOCHO) 7 true false;


}

Ejercicio 4.4:
Escriba un programa, de nombre pares, en el que se solicite un nmero entero al usuario y el programa
escribir un mensaje por pantalla que indique si se trata de un nmero par o de un nmero impar.

Planteamiento: Despus de leer del teclado el nmero solicitado al usuario, para comprobar que se trata de un
nmero par o impar, se realiza la operacin mdulo 2. Si el valor del mdulo es Ose trata de un nmero par y
se escribe el correspondiente mensaje, si no se escribir el mensaje correspondiente a un nmero impar, Esto
se realiza mediante la estructura if -e 1se.

Solucin:
import java.util.*:

public class ParesImpares{


public static void main(String[] args){
Scanner teclado = new Scanner(System.in):

System. out. pri nt C' Escri ba un nmero entero: "):


int nmero = teclado.nextlnt():

if(nmero % 2 == O){
System.out.printlnC"El nmero" + nmero + " es par. "):

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Estructuras de control

}else{
System.out.println("El nmero" + nmero + " es impar. "):
}
}
}

Comentario: Recuerde que un nmero es par si es divisible por dos e impar en caso contrario.

Ejercicio 4.5:
Escriba un mtodo, de nombre escribeordenadosostvmeros, que reciba por parmetro dos nmeros reales
y los escriba de menor a mayor.

Planteamiento: Se proponen dos formas de implementacin, mediante el operador ternario y mediante la


estructura i f -e1se.

Parmetros: El mtodo recibe como argumentos los dos valores reales (double) que se quieren imprimir
ordenados.

Valor de retomo: El mtodo no necesita devolver ningn valor de retorno por lo que se utiliza la clusula
void.

Solucin 1:
public void escribeOrdenadosDosNmeros (double a. double b){
System.out.println(a < b ? a + " " + b : b + " " + a ):
}

Solucin 2:
public void escribeOrdenadosDosNmeros(double a. double b){
if(a < b){
System.out.println(a + " " + b):
}else{
System.out.println(b + " " + a):
}
}

Ejercicio 4.6:
Escriba un mtodo, de nombre escriberdenados'Irestvmeros, que reciba por parmetro tres nmeros reales
y los escriba de menor a mayor.

Planteamiento: Se pueden comparar los tres valores entre s para imprimirlos en el orden adecuado. En
primer lugar se comprueba cul es el menor que los otros dos y una vez tomada esa decisin se comprueba
entre los dos restantes.

Parmetros: El mtodo recibe como argumentos los tres valores reales (doub 1e) que se quieren imprimir
ordenados.

Valor de retomo: El mtodo no necesita devolver ningn valor de retorno por lo que se utiliza la clusula
void.

Solucin 1:
public void escribeOrdenadosTresNmeros(double a. double b. double c){

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

System.out.println((a < b && a < e) ?


b < e ? a + .. .. + b + " " + e
a + .0 ., + e + " " + b
(b < a && b < e) ?
a < e ? b + .. .. + a + " " + e
b+""+c+ " " + a
(e < a && e < b) ?
a < b ? e + " " + a + ""+b
c+" "+b+ " " + a ""

):
}

Planteamiento: Tambin se pueden ordenar los valores antes de imprimirlos, Para ordenar los valores se
comparan de dos en dos y, si es necesario, se intercambian sus valores mediante una variable auxiliar,

Solucin 2:
public void eseribeOrdenadosTresNmeros_2(double a. double b, double e){
double temp:

if (a > b) {
temp = a:
a = b:
b = temp:
}

if (a > e) {
temp = a:
a = e:
e = temp:
}

if (b > e){
temp = b:
b = e:
e = temp:
}

System.out. printf( "%f %f %f\n", a. b. e):


}

Comentario: Aunque como se ve, es factible una implementacin con el operador condicional, se recomienda
la segunda soluci n por ser mucho ms fcil de leer.

Ejercicio 4.7:
Escriba un programa, de nombre DosPersonas, que pida el nombre y dos apellidos de dos personas y
los escriba ordenados alfabticamente, teniendo en cuenta los dos apellidos y, si fuese necesario, el
nombre.

Planteamiento: El programa debe solicitar los datos de las dos personas. Compara el primer apellido de
ambas personas y si son distintos se utiliza el orden de impresin por primer apellido. Si el primer apellido
coincide se comparan por el segundo apellido. Si tambin coinciden se comparan por el nombre.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Estructuras de control

Solucin:
import java.uti1.*:

pub1ic c1ass Ejercicioll {


pub1ic static void main(String[] args){
Scanner teclado = new Scanner(System.in):

System.out.println("E1 programa le pedir el nombre y dos apellidos de dos personas. "):


System.out.print("lntroduzca el nombre de la primera persona: "):
String nombrel = tec1ado.nextLine():
System. out. pri nt ( "1ntroduzca el pri mer ape 11ido: "):
String apel1idolPerl = tec1ado.nextLine():
System. out. pri nt ( "1ntroduzca el segundo ape 11ido: "):
String apel1ido2Perl = tec1ado.nextLine():

System. out. pri nt(" Introduzca el nombre de 1a segunda persona: "):


Stri ng nombre2 = teclado nextL i ne( ) :
System. out. pri nt ( "1ntroduzca el pri mer ape 11ido: "):
String apel1idolPer2 = tec1ado.nextLine():
System. out. pri nt ( "1ntroduzca el segundo ape 11i do: "):
String apel1ido2Per2 = teclado.nextLine():
compareTo 1gnoreCase ( ) no tiene
Ir-----------------------_,I en cuenta maysculas y minsculas.
ifapellidolPerl.compareToIgnoreCase (apel1idolPer2) < O) II
(apellidolPerl.equalsIgnoreCase(apel1idolPer2) &&
apellido2Perl.compareToIgnoreCase(ape1lido2Per2) < O) II
(apellidolPerl.equalsIgnoreCase(apel1idolPer2) &&
apellido2Perl.equalsIgnoreCase(apellido2Per2) &&
nombrel.compareTolgnoreCase(nombre2) < O{
System.out.print1nCapellidolPerl +" "+ ape1lido2Perl +" "+ nombrel):
System.out.print1nCapellidolPer2 + " " + ape1lido2Per2 + " "+ nombre2):
}e1se{
System.out.print1nCapellidolPer2 + " " + ape1lido2Per2 + " "+ nombre2):
System.out.print1nCapellidolPerl +" "+ ape1lido2Perl +" "+ nombrel):
}

}
}

Ejercicio 4.8:
Escriba un mtodo, de nombre cambiolinbdonedas, que reciba como parmetro un valor real que indica una
cantidad de dinero en euros. El mtodo imprime por pantalla la cantidad de monedas de cada tipo en que se
debe devolver la cantidad de dinero indicada.

Planteamiento: Al tratarse de una cantidad de dinero en euros, al principio el valor del argumento debe tener
como mximo dos decirnales. Para ello, se multiplica el valor por 100 y se opera con el valor como un nmero
entero. Esta operacin consigue que siempre se opere en cntimos. El numero de monedas que se deben
devolver se calcula empezando con la de mayor valor y continuando con las siguientes: 2 euros (200 cnti-
mos), 1 euro (100 cntimos), 50 cntimos, 20 cntimos, 5 cntimos, 2 cntimos y por ltimo 1 cntimo, Para
realizar las operaciones se utiliza la divisin entera y la operacin resto.

Parmetros: Recibe como argumento un valor real, con dos decimales como mximo.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Valor de retomo: El resultado de las operaciones se escribe directamente en pantalla. El mtodo no necesita
devolver ningn valor de retorno por Jo que se utiliza la clusula vod.

Solucin:
public void escribeCambioEnMonedas(double cambio){
int devolver = (int)(cambio * 100): // en cntimos.

System. out. pri nt 1 n(" Para devolver "+ cambio + " debe dar:"):
// para cada moneda
if (devolver >= 200){
System. out. pri nt 1n( "Monedas de 2 euros: " + devolver /200) :
devolver %= 200:
}
if (devolver >= 100){
System. out. pri nt 1n( "Monedas de 1 euro: " + devolver/lOO):
devolver %= 100:
}
if (devolver >= SO){
System.out.println("MOnedas de SO centmos: "+ devolver/SO):
devolver %= SO:
}
f (devolver >= 20){
System.out.println("MOnedas de 20 centmos: "+ devolver/20):
devolver %= 20:
}
f (devolver >= 10){
System.out.println("MOnedas de 10 centmos: " + devolver/ l):
devolver %= 10:
}
f (devolver >= S){
System.out.println( "Monedas de S centimos: " + devolver/S):
devolver %= S:
}
f (devolver >= 2)(
System.out.println( "Monedas de 2 centimos: " + devolver/2):
devolver %= 2:
}
f (devolver >= l){
System. out. pri nt 1n( "Monedas de 1 cent mo: " + devolver):
devolver = O:
}
}

Comentario: El mtodo nicamente se ha planteado para que escriba el cambio en monedas, por lo que si
el valor que se pasa COI110argumento es I11Uyelevado mostrar una cantidad muy alta de monedas de 2
euros.

Ejercicio 4.9:
Escriba un programa, de nombre Socio, que calcule la cuota que se debe abonar en el club de go(f La cuota
es de 500 euros. Tendrn.un 50% de descuento las personas mayores de 65 aos y un.250/0los menores de 18
aos si los padres no son socios y 350/0si los padres son socios.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Estructuras de control

Planteamiento: El programa debe solicitar la edad del usuario si sta es mayor de 65, Al precio del abono se
le aplica el descuento del 500/0, Si la edad es menor que 18, se pregunta al usuari o si su padre es socio del club,
Si la respuesta es s, se le aplica un descuento del 350/0; en caso contrario, se le aplica un descuento del 200/0,
Una vez calculado el precio del abono se escribe por pantalla,

Solucin:
import java,util,*:

public class SociO{


public static void main{String[] args){
final int CUOTA = 500: II en euros
final int PORCENTAJE_MAYORES = 50: /1 por ciento
final int PORCENTAJE_JOVEN_SOCIO = 35: II por ciento
final int PORCENTAJE_JOVEN_NO_SOCro = 25: II por ciento

int edad, cuota:


Scanner teclado = new Scanner{System,in):

Systen. out, pri nt(" Introduzca 1a edad del nuevo soci o: "):
edad = teclado.nextInt{):

cuota = CUOTA:

if(edad >= 65){


cuota -= CUOTA * PORCENTAJE MAYORES I 100:
}else if (edad < 18){
System.out.print("El padre es socio (s /no)": "):
String respuesta = teclado.next{):
if{respuesta.equalsIgnoreCase("si"{ Comprueba sise ha escritosien
maysculaso minsculas,
cuota -= CUOTA * PORCENTAJE -JOVEN -SOCIO I 100:
}else{
cuota -= CUOTA * PORCENTAJE JOVEN NO SOCIO! 100:
}
}

System. out. pri nt 1n ("Debe pagar de cuota " + cuota + " Euros."):
}
}

Ejercicio 4.10:
Escriba un mtodo que calcule la potencia de un nmero real (a) elevado a un nmero entero (b]. Tenga en
cuenta que tanto a como b pueden valer O o pueden ser nmeros negativos,

Planteamiento: La potencia de un nmero a elevado a otro b, es a*a* ... *a, un nmero b de veces, si ambos
son positivos. El resultado se complica si alguno o ambos valen O o un nmero es negativo, En particular, O
elevado a un nmero negativo vale infinito, Para representar este valor se uti lizar la constante Doub1e .
POSITIVE INFINITY.

Solucin:
public double potencia(double a, int b){
double resultado = 1:

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

if(a == O){
if (b == O){
resultado = 1:
}else if(b < O){
resultado = Double.POSITIVE INFINITY: o elevadoa un nmero negativo
valeinfinito.
}else{
resultado = O:
}
}else if(b == D){
resultado = 1:
}else if (b < D){
for(int i = O: i < -b: i++)
resu 1 tado *= a:
resultado = l/resultado:
}else{ // b es > O
for(int i = O: i < b: i++l
resu 1 tado *= a:
}

return resultado:
}

Aviso: Puede comprobar el resultado de este mtodo con lo que devuelve Math. pow( l.

Ejercicio 4.11:
Escriba un programa, de nombre edad, para calcular la edad de una persona solicitando lafecha actual y la
fecha de su nacimiento.

Planteamiento: El programa debe comenzar solicitando los datos de da, mes y ao actuales y el da, mes y
ao en que naci la persona. Estos valores se guardarn en seis variables de tipo entero. En principio la edad
de una persona se calcula restando del ao actual el ao de nacimiento, Pero si an no ha sido su cumpleaos
tendr an un ao menos, por lo que si no ha sido an su cumpleaos hay que restarle uno. Para comprobar
que no ha sido su cumpleaos se comprueba si el mes actual es anterior al del cumpleaos o, si Losmeses
coinciden, se comprueba si el da es anteri oro

Solucin:
import java.util.*:

publ ic elass EdadPersona (


public static void main(String[] args){
Scanner teclado = new Scanner(System.in):

System. out. pri nt(" Introduzca el da de nacimiento: " ):


int daNac = teclado.nextlnt():
System. out. pri nt(" Introduzca el mes de nacimiento: " ):
int mesNac = teclado.nextlnt():
System. out. pri nt(" Introduzca el ao de nacimiento: " ):
int aoNac = teclado.nextlnt():

System. out. pri nt(" Introduzca el da actual: "):


int daHoy = teclado.nextlnt():

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Estructuras de control

System.out.print("lntroduzca el mes actual: "):


int mesHoy = teclado.nextlnt():
System.out.print("lntroduzca el ao actual: "):
int aoHoy = teclado.nextlnt():

int aos = aoHoy - aoNac:


if(mesHoy < mesNac){
aos-:
}else if(mesHoy == mesNac && daHoy
aos-:
< daNac){ ------t[ Si an no ha cumplido los aos. ~

System.out.println("Tiene "+ aos + " aos."):


}
}

Comentario: El programa se podra haber hecho sin solicitar la fecha actual al usuario obteniendo este dato
del sistema mediante el siguiente fragmento de cdigo:

GregorianCalendar calendario = new GregorianCalendar():


int daHoy = cal endari o.get (Gregori anCa 1endar .DAY_OF_I'IONTH):
int mesHoy = calendario.get(GregorianCalendar.MONTH) + 1:
int aoHoy = calendario.get(GregorianCalendar.YEAR):

Ejercicio 4.12:
Escriba un mtodo, de nombre esFechaVlida, que reciba corno parmetros tres valores enteros con el da,
mes y ao de una fecha y devuelva un valor booleano que indique si se trata de valores vlidos para una
fecha.

Planteamiento: Los valores vlidos para los meses son exclusivamente valores entre 1 y 12. Se considerarn
como valores vlidos para los aos valores entre 1600 y 3000. En cuanto los valores vlidos para los das
depender del valor del mes de la fecha. Para comprobar si se trata de un da vlido se utilizar una variable
auxiliar en la que se le asigna el valor mximo de da del mes para el mes de la fecha. Mediante una estructura
switch a esta variable se le asigna el valor 31 si es uno de los meses 1,3,5,7,8,10 o 12. El valor 30 si es uno
de los meses 4, 6, 9 u 11. En el caso de que el mes sea febrero, el 2, se debe tener en cuenta si se trata de un ao
bisiesto, para asignarle el valor 28 o 29. Un ao es bisiesto si es mltiplo de cuatro y no es mltiplo de cien a
no ser que sea mltiplo de cuatrocientos.

Parmetro: El mtodo recibe por parmetro tres valores enteros, el valor del da del mes y del ao de la fecha
que se desea comprobar como vlida.

Valor de retomo: El mtodo devuelve un boo1ean, true si se trata de una fecha vlida y fa 1se en caso
contrario.

Solucin:
public boolean esFechaVlida(int da. int mes. int ao){
int dasMes:

II Se comprueba que el mes es correcto.


if(mes < 1 limes> 12)
return false:

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

// Se comprueba que el ao es correcto.


if(ao < 1600 II ao> 3000)
return fa1se:

// Es un mes correcto. se calcula los das que tiene.


switch (mes) {
case 4:
case 6:
case 9:
case 11:
d ases = 30:
break:

case 2:
if ao % 4 == O) && (ao % 100 1= O)
I I (ao % 40 O == O {
dasMes = 29;
} else {
dasMes = 28;
}
break:
default:
dasMes = 31:
break:
}

// Se comprueba que el d1a es correcto.


return da >= 1 && da <= dasMes:
}

Comentario: Esta forma de calcular los aos bisiestos de una fecha slo es correcta para el calendario gregoriano,
es decir para fechas posteriores a 1582, fecha de su adopcin.

Nota: Puede ver otro ejercicio de uso de switch en el Ejercicio 4.25.

EsrRUCTURAS DE REPETICIN

Ejercicio 4.13:
Escriba un mtodo, de nombre esPrimo, que reciba un nmero entero por parmetro y devuelva un booleano
que indique si se trata de un nmero primo o no.

Planteamiento: Para comprobar que se trata de un nmero primo hay que comprobar que no tiene divisores
distintos de la unidad y del propio nmero. Se ir comprobando si tiene algn divisor a partir del 2 en
adelante, si se encuentra algn nmero que lo divida, el mtodo ejecutar una sentencia return con el valor
false, pues si al menos tiene un divisor no es primo. Mediante un for se comprobar para todos los
nmeros entre el2 y los menores que el valor pasado como argumento. Si al finalizar la ejecucin del for en
ningn momento se ha ejecutado la sentencia return ser porque no tena ningn divisor y se ejecutar la
sentencia return con el valor true.

Parmetro: El mtodo recibe como argumento el valor entero (int) del nmero del que se quiere comprobar
que es primo. Tambin se podra elegir un tipo long, ampliando as el rango de valores posibles.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Estructuras de control

Valor de retorno: El mtodo devuelve un boo 1ean, con el valor true si se trata de un nmero primo o fa 1se en
caso de que no lo sea.

Solucin:
public boolean esPrimo(int n){
if (n % 2 == O)
return false:

int divisor = 3
boolean primo = true:
while (divisor * divisor <= n){
if (n % divisor == O)
return false:
divisor += 2:
}
return true;
}

Comentario: Recuerde que un nmero es primo si no tiene divisores distintos del propio nmero y la unidad.
Primero se comprueba si es divisible por dos. En caso contrario, Juego slo se intenta dividir entre Jos impares
a partir del 3.

Ejercicio 4.14:
Escriba un programa que solicite al usuario un nmero entero positivo. El programa debe presentar en
pantalla la descomposicin enfactores pri/110Sde dicho nmero. Por ejemplo, si el nmero es 28 debe escribir
36 = 2 * 2 *3 * 3

Planteamiento: Para ir calculando los sucesivos factores primos se va dividiendo el nmero por los sucesivos
valores enteros empezando en dos. Cuando se encuentra un divisor se escribe y se actualiza el valor del nmero
que se est factorizando hasta que es igual aJ propio divisor, en cuyo caso ese ser el ltimo factor primo.

Solucin:
import java.util.*:
public class FactoresPrimos (
public static void main(String[] args){
long nmerolnicial. nmero:
Scanner teclado = new Scanner(System.in):

System.out.print("Introduzca el nmero que desea factorizar: "):


nmerolnicial = teclado.nextLong():
if(nmerolnicial > l){
int factor = 2:
nmero = nmerolnicial:
System. out. print (nmero + " = "):
while (nmero> factor){ Sies divisible
porfactor,
en la
if(nmero % factor ce O){ siguienterepeticin
hayque volver
nmero /= factor: a dividir
porfactorsies posible.
System.out.print(factor + " * "):
}else{
factor++ :
}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

}
System.out.println(factor):
}
}
}

Comentario: Idealmente habra que ir dividiendo slo por los nmeros primos. pero eUo complica el ejercicio. En el
ejemplo se divide por todos los nmeros crecientemente, de esa forma si el factor no es primo. ya se habr factorizado
por uno de sus factores el nrimero, por lo que en realidad nunca ser divisible por' un nmero no primo. Si el nmero es
un primo grande o tiene un factor que es un primo grande, puede tardar bastante tiempo en realizar el clculo completo,

Ejercicio 4.15:
. ,
Escriba un mtodo que escriba en la pantalla el valor de la suma de los n pnmeros numeras pares.

Planteamiento: Para sumar los n primeros nmeros pares hay que tener una variable que vaya acumulando dichos
valores. Para eUo se puede uti lizar un bucle for que vaya generando pro'a su ndice los valores 0, 2, 4, ... , 2* (n-1)
y los vaya sumando.

Solucin:
import java.util.Scanner:
public class SumaPares {
public static void main(String[] args) throws Exception{
Scanner teclado new Scanner(System.in): Q

int nmero. suma=O;


System. out. pri nt(" Introduzca el nmero n: "):
nmero = teclado.nextlnt();

for(int i = O: i < 2*nmero: 1 = 1 + 2){ -----il El ndice va teniendo los valores


0,2,4,6, ...
suma = suma + i:
}

System.out.println("La suma de los primeros" + nmero +


" nmeros pares es: " + suma);
}
}

Comentario: En lugar de generar los nmeros en el ndice del for se podra generar los pares a partir del
ndice sustituyendo el bucle for del ejemplo por el siguiente:

for(int i = O: i < nmero; i++){ El ndice va teniendo los valores 0,


suma e suma + 2 * 1; 1,2,3, ... pero se suma 2'i
}

Ejercicio 4.16:
Escriba un mtodo dibujaCuadrado que dibuje un cuadrado de cuatro por cuatro mediante caracteres *,
como el que se dibuja a continuacin:

**:f:$

**:f:$

**:f:$

**:f:$

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Estructuras de control

Planteamiento: Se utiliza un bucle for para repetir cuatro veces el String "* * * *" cada vez en una linea.

Parmetros: No necesita ningn parmetro ya que el enunciado indica dibujar un cuadrado de 4x4.

Valor de retomo: El resultado se escribe directamente en pantalla. El mtodo no necesita devolver ningn
valor de retorno por lo que se utiliza la clusula voi d.

Solucin:
public void dibujaCuadrado(){
for( int i = O: i < 4: i++) (
System. out. pri nt 1n( "* * * ="):
}
}

Comentario: Otra posible solucin es utilizar dos for anidados, con un for interno que escriba cuatro asteriscos.

Ejercicio 4.17:
Escriba un mtodo, de nombre dibujakectangulo, que reciba dos valores enteros como parmetros, el mtodo
debe dibujar un rectngulo en el que la base es mayor que la altura, por lo que se utilizar como base el
mayor de los valores proporcionados como parmetro y corno altura el menor.
Por ejemplo si se le pasa co/1"I0argumentos los valores 3 y 5 se dibujar el siguiente rectngulo:

* ::: :t: :;: *


* ::: :t: :;: *
* ::: :t: :;: *
Planteamiento: Despus de comprobar cul de los valores debe corresponder a la base y cul a la altura del
tringulo, se utiliza un for pru'a repetir el nmero de filas con un for interior para repetir el nmero de
asterisco por cada ti la.

Parmetros: TIene que recibir como parmetros el valor del ancho y alto del rectngulo como nmeros ente-
ros (i nt).

Valor de retomo: El resultado se escribe directamente en pantalla, El mtodo no necesita devolver ningn
valor de retorno por lo que se utiliza la clusula voi d.

Solucin:
public void dibujaRectangulo(int a. int b){

int base = (a > b) ? a : b: / /Hath .max(a, b).


int altur a = (a < b) ? a : b: / / Hath .min (a. b).
for(int i = O: i < altura: i++){
for(int j = O: j < base: j++){
System. out. pri nt( "* "):
}
System.out.println():
}
}

Comentario: Para decidir el valor correspondiente a la base y a la altura se pueden utilizar los mtodos max()
y mi n( ) de la clase Math, de la forma indicada en el comentan o.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

Ejercicio 4.18:
Escriba un mtodo, de nombre dibuja'Iringulo, que reciba un entero como parmetros, eL mtodo debe
dibujar un tringulo como el que se muestra en el siguiente dibujo despus de comprobar que el valor del
parmetro es menor de 15.
Por ejemplo si el valor del argumento es 4 el mtodo dibujar el siguiente tringulo:

** :i: :::

** :i:

**
*
Planteamiento: Si el valor del argumento es menor que 15 se utilizan dos bucles for anidados para dibujar el
tringulo, para que en cada una de las filas escriba un asterisco menos, en el bucle for interior se ejecuta un
nmero de veces distinto en cada fila.

Parmetros: TIene que recibir como parmetro el valor del lado del tringulo como un nmero entero (int).

Valor de retomo: El resultado se escribe directamente en pantalla, El mtodo no necesita devolver ningn
valor de retorno por lo que se utiliza la clusula voi d.

Solucin:
public void dibujaTringulo(int lado){
if (lado < 15){
for(int i e O: i < lado: i++){
for(int j O: j < lado-i: j++){ Q

System.out.print("* "):
}
System.out.println():
}
}else{
System.out.println("El lado es demasiado grande para dibujar el tringulo.");
}
}

Ejercicio 4.19:
Escriba un mtodo, de nombre dibuja'Iringuloi, que reciba un entero como parmetro, eL mtodo debe
dibujar un tringulo como el que se muestra en el siguiente dibujo despus de comprobar que el valor del
parmetro se encuentra entre 3 y 15, ambos incluidos.
Por ejemplo si el valor del argumento es 4 el mtodo dibujar el siguiente tringulo:

*
:f: :::

* ::: :t:

* ::: :t: :f:

Planteamiento: Se comprueba que el valor del argumento es vlido, para dibujar este tringulo se comienzan
por escribir mediante un for los caracteres en blanco correspondientes a cada fila ya continuacin mediante
otro for los asteriscos correspondientes.

Parmetros: Tiene que recibir como parmetro el valor del lado del tringulo como un nmero entero
(i nt).

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Estructuras de control

Valor de retomo: El resultado se escribe directamente en pantalla. El mtodo no necesita devolver ningn
valor de retorno por Jo que se utiliza la clusula voi d.

Solucin:
public void dibujaTringulo2(int ledo)]
if (lado> 3 && lado < 15){
for(int i = O; i < lado: i++){
for(int j = O; j < lado-i-l: j++){
System.out.print(" "):
}
for(int j = O: j < i+l: j++){
System. out.print("* "):
}
System.out.println();
}
}else{
System.out.println("El lado del triangulo debe estar entre 3 y 15. "):
}
}

Ejercicio 4.20:
Escriba un mtodo, de nombre dibuja'Iringulos, que reciba un entero como parmetro, el mtodo debe
dibujar un tringulo como el que se muestra en el siguiente dibujo despus de comprobar que el valor del
parmetro es un nmero impar positivo.
Por ejemplo si el valor del parmetro es 7 el mtodo dibujar el siguiente tringulo con 7 asteriscos en la
base:

*
* :::*
*~,***
*~,****,~

Planteamiento; Se utiliza un bucle for para escribir tantos espacios corno sean necesarios en cada fila y luego
otro bucle for para escribir tantos asteriscos como sean necesarios en cada fila.

Parmetros; Tiene que recibir como parmetro el valor del nmero de asteriscos en base del tringulo como
un nmero entero (i nt).

Valor de retomo: El resultado se escribe directamente en pantalla, El mtodo no necesita devolver ningn
valor de retorno por Jo que se utiliza la clusula voi d.

Solucin;
public void dibujaTringulo3(int lado){
if (lado % 2 == 1 && lado> O){
for(int i = O; i < (lado + 1)/2; i++){
for(int j = O: j < (lado + 1)/2 - i-1; j++){
System.out.print(" "):
}
for(int j = O; j < 2*i + 1; j++){
System. out.print("* "):
}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

System.out.println():
}
}else{
System.out.println("El lado del triangulo debe ser un impar positivo. "):
}
}

Comentario: Corno puede observar se ha uti lizado una frmula que calcula cuntos espaci os y cuntos asteriscos
tiene que imprimir dada la fila correspondiente.
Una forma que puede resultar ms senciUa es pensar que en la primera fila hay que imprimir tantos
espacios como vaJga ellado/2, y en las siguientes siempre uno ms cada vez. En cuanto a los asteriscos hay que
imprimir uno en la primera fila yen las dems dos ms por cada fila.
De esta forma la solucin sera:

public void dibujaTringulo3(int lado) {


int espacios = lado / 2:
int asteriscos = 1:
if (lado % 2 == 1 && lado> O){
for(int i = O: i < (lado + 1)/2: i++){
for(int j = O: j < espacios: j++){
System. out. print (" ") :
}
for(int j = O: j < asteriscos: j++){
System.out.print("* "):
}
System.out.println():

espaci os -- 1:
asteriscos += 2: Cada fila siguiente tiene un espacio
menos y dos asteriscos ms.
}
}e1se{
System.out.println("El lado del tringulo debe ser un impar positivo. "):
}
}

Ejercicio 4.21:
Escriba un mtodo dibujaRombo que reciba un entero como parmetro. El mtodo debe dibujar un rombo
como el que se muestra en el siguiente dibujo despus de con/probar que el valor que recibe como argumento,
que indica la altura del rombo, es un nmero impar mayor o igual que 3.
Por ejemplo si el valor del parmetro es 5 el mtodo dibujar el siguiente rombo con 5 asteriscos en la
parte central:

*
* ::: :t:

* ::: * :t: :;:

* ::: :t:

Planteamiento: La solucin es muy parecida a la del Ejercicio 4.20. Se irn escribiendo tantos espacios y
asteriscos en cada fila como sean necesarios dependiendo de la fila. Esto se hace para la mitad superior del
rombo y luego para la mitad inferior.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Estructuras de control

Parmetros: TIene que recibir COIUO parmetro el valor del nmero de asteriscos en la parte central del rombo
como un nmero entero (i nt).

Valor de retomo: El resultado se escribe directamente en pantalla. El mtodo no necesita devolver ningn
valor de retorno por Jo que se utiliza la clusula voi d.

Solucin:
public void dibujaRombo(int altura){
if (altura % 2 == 1 && altura >= 3){
/ / se dibuja la parte superior
for(int i = O: i < (altura + 1)/2: i++){
for(int j = O: j < (altura + 1)/2 - i-1: j++){ Expresin que calcula cuntos
espacios hay que escribir en la fila i.
System.out.print(" "):
}
for(int j = O: j < 2*i + 1: j++){
System.out.print("* "):
}
System.out.println():
}

/ / se dibuja la parte inferior


for(int i = O: i < altura/2: t++J]
for(int j = O: j < i + 1: j++){
System. out. print (" ") :
} Expresin que calcula cuntos
for(int j = O:j < (altura/2 - i)*2 - 1: j++){ -----11 asteriscos hay que escribir en la
System.out.print("* "): fila i de la parte inferior.
}
System.out.println():
}
}else{
System.out.println("El lado del tringulo debe ser un impar positivo. "):
}
}

Comentario: Igual que se ha hecho en el Ejercicio 4.20, podra hacerse tambin Llevandola cuenta del nmero
de espacios y asteriscos que hay que ir escribiendo en cada fila, de la siguiente forma:

public void dibujaRombo(int altura){


if (altura % 2 == 1 && altura >= 3){
int espacios = altura! 2:
int asteriscos = 1;

/ / se dibuja la parte superior


for(int i = O: i < (altura + 1)/2; i++){
for(int j = O: j < espacios: j++){
System. out. print (" ") :
}
for(int j = O: j < asteriscos; j++){
System.out.print("* "):
}

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.
Programacin en Java 2

System.out.println():
espacios -= l' Cada fila siguiente tiene un espacio
asteri seos += 2: menos y dos asteriscos ms.
}

espacios = 1:
asteriscos = altura - 2:
l/se dibuja la parte inferior
for(;nt i = O: i < altura/2: i++){
for(int j = O: j < espacios: j++){
System.out.print(" "):
}
for(int j = O: j < asteriscos: j++){
System. out. pr nt ("* "):

}
System.out.println():
espacios += 1: Cada fila siguiente tiene un espacio
asteriscos --- 2' ms y dos asteriscos menos.
}
}else{
System.out.println("El lado del tringulo debe ser un impar positivo. "):
}
}

Ejercicio 4.22:
Escriba un mtodo escribeAIRevs que reciba un String y escriba dicho texto en la pantalla al revs.

Planteamiento: Para escribir el texto al revs se puede ir escribiendo el texto desde el ltimo carcter del
Stri ng hasta el pri mero de uno en uno.

Parmetros: Tiene como parmetro el texto que se desea escribir al revs (String).

Valor de retomo: El resultado se escribe directamente en pantalla, El mtodo no necesita devolver ningn
valor de retorno por lo que se utiliza la clusula voi d.

Solucin:
public void escribeA1Revs(String texto){
for(int i = texto.length()-l: ; >= O: i-){
System.out.print(texto.charAt(;:
}
}

Aviso: Habra que comprobar al principio qu texto no vale nul l.

Ejercicio 4.23:
Escriba un mtodo que compruebe si una palabra o una frase es un palindromo.

Planteamiento: Para comprobar que una frase es un palndromo hay que comprobar si se corresponden el
carcter de su izquierda con el de su derecha y as uno a uno hasta llegar a la mitad. Para no tener en cuenta si
los caracteres estn en maysculas o en minsculas antes de hacer la comprobacin se deben convertir los
caracteres bien a maysculas, bien a minsculas. Se va a escribir la solucin convirtindolos a maysculas.

Snchez Allende, Jess, Huecas Fernndez-Toribio, Gabriel, and Moreno Daz, Pilar. Programacin en Java 2. Madrid, ES: McGraw-Hill Espaa, 2009. ProQuest ebrary. Web. 10 July 2016.
Copyright 2009. McGraw-Hill Espaa. All rights reserved.

Vous aimerez peut-être aussi