Sie sind auf Seite 1von 29

186

5.23

Instrucclones de control: Parte 2 LQue haec el siguiente frugmento de programu? for ( i = 1; i <= 5; i++ ) { for ( j = 1;
<= 3; j++ )

Capijulo 5

6
Metodos

for ( k = 1; k ~= 4; ktt System.out.print(


I~I

);

System.out.println(); /1 fin del for interior system.out.println();


/1 fin del for exterior 5.24 Describa, en general, como elirninartu las instrucciones continue de un clclo en un programa, para reemplazarlas con uno de sus equivalentes estructuradns. Usc la tecnica que desarrollo aquf pura eliminur la instruccion con" tinue del prograrna de In figura 5.12. '

5.25

Escribauna aplicacion que utilice instrucclones de repeticlon y awi t.ch para imprimir una cancion que contenga elementos itcrativos. En el sitio Web www.12days.com/library I carols /12daysofxmas •htm cnconIrani In letra completa de In cancion "The twelve days of Christmas" (Los doce dias de Navidad) ideul pura este ejercicio. Una instruccion switch delle utillzarse pnru imprimir el diu (es decir, "Primer", "Segundo", etc.), Una lnstrucclon swi tah sepurada debe utilizarse para imprimir cl resto de cada verso.

Aprender a crear programas en forma modular, a partir de pequefias piezas de codigo llamadas metodos. Introducir los metodos mutcrruiticos comunes disponiblcs en la API de Java. Aprcnder a crear nuevas metodos, Conocer los ~necunismos para pasar lnformaclon entre metodos. Intrnducir las tecnicas de simulacion que so utiliznn para gencrar rnimeros uleatorios. Comprender como In visibilidad de las declaraciones esta limitada a regiones cspecilicas de programas. Aprender a escribir y utilizar metodos que se llarnen a sf mismoa.

Lajorma siempre siglle II III IUllelon, Louis Henri Sullivan E pluribus unum. (Uno compuesto de muchos) Virgil (Publius Vergilius Marc) JOM v(}/vio a llamar ayer. ofrecit!ndome volvet: William Shakespeare lliunenme lsmael Herman Melville Cualldo me llames asi; sonrie. Owen Wister

188

Metodos

Copltulo 6

capftulo6 Tip de rendimiento 6.1

Metodos

189

G No IItI/e de reescribir

las closes y me/ados existentes de 10API de Java, para traiar de hacerlos mds ejiciellIes, Por 10 general no podia mejorar .Ill rendimiento, ,

Los metodos (tambien conocidos como [unciones 0 procedimienios en otros lenguajes de programacion) permiten al programador dividir un programa en modules, por mcdio de la separacion de sus tareas en unidades uutonomas; tambien conocidas como metodos declarados por el programador. Lus instrucciones que implementan los metodos se escriben solo una vez, y estrin ocultas de otros metodos. Existen diversas razones para crear un programa en modules por medio de los metodos. Una razon es que la metodologfa "divide y vencenis'' huce que el desarrollo de progrnmas sen mas fticil de udrninistrar, Otra razcin es la relllilizacioll de software (usar los metodos existentes como bioques de construccion para crear nuevos progrnmas), A rnenudo se pucden crear programas a partir de rnetodos estandarizadns, en vez de toner que crear codigo personalizudo. Por ejemplo, en los programas anteriores no tuvimos que definir como convertir cadenas en entcros y rnimeros de punto flotante; Java proporciona estas herramientas en la clase Integer (el metoda estdtico parselnt) y en In clase Double (el metoda estatico parseDouble), respectivamente. Una terceTtl razon es para evitar repetir c6digo dentro del programa. El proceso de empaquetar un codlgo en forma de metodo permite que un programa ejecute ese codigo desde varias ubicaciones, con solo llarnar II ese metoda, Ademds, los metodos facilitan In depuracion y el mantcnimicnto de los programas.

M2! dejillida, y su nombre debe expresar


fiilt:\ Los metodos \f!!::I que realblTlltllll:has
6.1 Introduccion
La rnayona de los programus de compute que resuelven los problemas reales son mucho mas extensos que los program as que se presentan en los primeros capitulos de este libro, La experlencia hu demostrado que In rnejor manera de desarrollar y mantencr un programu extenso cs construirlo a partir de pequeiias piezas sencillus, 0 modulus, A esta tecnica se Ie llama divid~ v vencerds. En este capitulo describiremos como declarar y utilizar metodos para facilitar el disefio, In implementacion, operacion y mantenirnicnto de programas extensos,
tareus,

00 Pam promover

Observacion de ingenierfa de software 6.2

la r<!tlti/izaci,Jn de software, aula metodo debe limitorse de mallem que reolice Illia sola tarea bien esa tarea can efectividad. Esios metodos luicen que los programas searl mds [dciles de esctibir; dcpunu; mantener y modijtcat.

Tip para prevenir errores 6.1


pequel10s 'I"I' realizan IlIIa wren SOIl mas [dcile» de probar

y depurar

qlle los melodas mds grandes

e
·
~ ~

00 Si

Observacion de ingenierfa de software 6.3

TIll puedo clcgir IIllllombre concisu qlle exptese la tarea de w) metoda, tal I'ez este tratando de realizar iliversas tareas ell 1111 mismo fIIiloda, Poria gelleral, es mejor dividirtt: ell vurios metodos mds peqlle/ios.

Observacion de Ingenieria de·software 6.4


Gellerallllenle, lin metodo debe ocupar cuando mucho IIna pdgina impresa; a meior aun, la mitud de UIIO pagilill impresa. Sin importer qlle /alilQ/;~o sell lin mdtodo, este debe realizar IIl1a tarea lo mejar posible, Los metodos PI'querius fomentan!« reuriliwciull de software.

6.2 Modulos de programas en Java


Hay dos tipos de modulus en Java: metodos y closes. Para escribir prograrnas en Java, se combinan nuevos metodos y clases escritas por el programndor, con los metodos y clases "precmpaquetados", que estan disponlbles en la lnterfu: de Programacion de Aplicllciorles de Java (tambien conocida como III API de Java 0 biblioteca de clases de Java) y en diversas bibliotecas de clases, La API de Java proporciona una vasta coleccion de ciases que contienen metodos para realizar calculos materndticos, manipuluciones de cadenas, manipulaciones de caracteres, operaciones de entrada/salida, comprobacion de errores y muchas otras operaciones utilcs, Este conjunto de clases fucilita la escritura de programas, ya que la API de Java proporciona muchas de las herramientas que necesitan los prograrnadores, Las clases de lu API de Java forman parte del Kit de desarrollo de software para Java 2 (J2SDKj, el cuul conticne miles de clases preempuquetadas,

tii1 Procure [amiliarizarse

Buena practlca de programacion 6.1


con la VOSta coleccitlTl de cluses y metodos que proporciona Iu API de JUI'l/ (j ave. Bun. com/j2se/l. 4 .1/docs/llpi/index.html) y con las extelM'as colecciones de clases dispo/libles en los diversas biblia/ecos de c/ases.

rn
,

Un metoda se invoca 0 se llama (es decir, se le indica que haga su tarea designada) mediante la llamada a metoda, Estu Hamada especifica el nombre del metoda y proporciona informacion (en forma de argwilelltos) que el metodo llamado requiere para realizar su tarca, Una vez que se ha cornpletudo la Hamada, cl metoda de" vuelve un resultado al solicitante (0 metoda que his» la Ilamada) 0 simplernente Ie devuelve el control. Una analogfa a csta estructura de programa es la fcrma jererquicade la adrninistrucion. Un jefe (el solicitante) pide a un trabajudor (el metoda lIamado) que realice una tarea y que le reporte (es decir, devuelva) los resultados despues de completar la tarea, El metodo jete no sabe como realiza el metodo trabajador sus tareas designadas, Tal vez el trabajador Harne a otros metodos trabajadores, sin que 10sepa el jefe, Este "ocultamiento" de los de" tulles de implementacion fomenta In buena ingenierfa de software, En la figura 6, I se muestra al metodo j efe comunicendose con vurios metodos trabajudor en forma jerarquicu. EI metoda j efe divide Ius responsabilidades entre los diversos rnetodos trabajadores. Observe que trabajadorl ucnia como "metoda jefe" de trabaj ador4 y trabaj ador5, Las relacioncs entre los metodos tambien pueden scr distintas dela estructura jerarquica que se muestra en esta figura,
till

6.3 Metodos de 10 close Math


La close Math praporcionu una coleccion de metodos que Ie permitiran a usted realizur calculos mnteml\ticos comunes, Aquf utilizmnos vurias metodos de 1a clase Math para introducir el concepto de los metodos, A 10 largo del Iibro vel'emos mas metodos de las clases API de Java.

00 Evite reinven/ar

Observacion de ingenlerfa de software 6.1


la rueda. Cualldo sen posible, utilice clases Y ,mtflOdos d~ III API de Jllva, en lie?,deescrib!~ nue· vas close,! y nu!todos, £Sto reduce eiliempo de desarrollo y eVita que .Ie tn/roduzcan errores de pmgramaclOn,

190

Metodos

Capitulo 6

capnulo6

Metodos

191

Metodo
abs( II

Descrlpclon Valor absolute der (este metoda tambicn tiene verxiones para float, int y long)
Redondea .t III entero mas pequeno que no seu mellor de x Coseno trignnometrico de r (x asta en rndianes) metodo cxponcncial e'

EJemplo
aba( 23.7) 0823.7 abs ( 0, 0 ) es 0 • 0 abs( -~3.7) e823.7 ced l, ( 9.2 ) es 10.0 aeH( -9.8 )es-9.0 cos (

ceil ( II )
COS( II II ) )

o. 0 ) es 1. 0

exp(

exp( 1.0)es2.71828 exp( 2.0)es7.38906

Figura 6.1 Relaclon jerorquica entre el rnetoco Jele y los rnetodostrobolodores,


Uoor(
II

Para llumur a lin metoda se escribe su nombre seguido de un parcntesis do apertura, despues su argumento (0 una lista de argumentos separados por comas) y al final un parentesis de cierre. Par cjernplo, un prngramador que desee calcular la rafz cuudrada de 900 • 0 podrfa escribir
Math.sqrt( 900.0 )

log(

II

Redondea ,t al entero mas grande que no sea mayor de .t Logaritrno natural de x (base e)
EI valor mas grande der

floor( 9.2) es 9.0 floor ( -9.8)es -10.0 log( Math.E) es 1.0 log( Math.E. Math.E) es 2.0 max ( 2.3, 12 . 7 ) es 12 .7 max( -2.3,-12.7) e5-2.3 min ( 2.3, 12.7 ) es 2.3 mini -2.3. -12.7 )cs-12.7 pow ( 2. 0, 7 • 0 ) es 12 8 •0 pow( 9.0,0.5 )es 3.0 sin ( 0.0 ) es 0.0 sqrt( 900.0) sqrt( es 30.0 9.0) eo 3.0

max] x. Y

yy

AI ejecutarse esta instruccion, llama al metodo estatico sqrt I de Math para calcular la raiz cuadrada del rnimew encerrado entre parentesis (900.0), El mimero 900.0 es el argumento del metoda sqrt. La expresion anterior se evahia, dando como resultado 30.0, 81 metodo sqrt toma un argurnento de tipo double y devuelve un rcsultado de tipo double. Para mostrar el valor de la llamuda anterior al metodo en lu vcntana de comandos, puede escribir
System.out.println( Math.sqrt( 900.0 ) );

(este metodo tarnbien riene versiones para float, int y long) min (
lI,

Y1

El valor OlUS pequeno de .t y y (este metoda tambicn ticne versioncs para float. int y long) ,r elcvado a la potencia )' (x') Seno trigonometrico de x (x estd en radiunes) Rafz cuadradn de x Tangente tri¥onometrica de x (r estu en radianes)

pow( sin( eqrt( tan(

lI,

En esta instruccion, el valor que devuelve sqrt

se convierte en el argumenro para el metoda println. .


mnodos. Math es pane ae! fl<lqlJete java. lang, el

II

rll a
=:4 ~ ~

Observaclon.de

ingenieria de software 0.5


.IllS

x)
II )

CU1l1se importa ou(omdticllJllellte

No es necesario importar la cluse Math para.lItllbll' por el compilador.

tan( 0.0 les 0.0

Error comun de programacion

6.1
/11

Olvidar llama I' a 1111 metodo de Iii clase Math, nnteponienilo ol nombre del metodo cl lIolllbm de y llIl punta ( .!, produce un errorde sintaxis.

clase Math

Figura6.2 Metodos de 10close Math, Considere un applet (figura 6.3) que utiliza el metodo cuadrado para calcular los cuadrados de los enteros del I al 10, Cuando el applet comienza a ejecuturse, el contencdor de upplcts (el appletviewer 0 un navegador Web) llama al metodo ini t del applet (declurado en las linens 10 a 35). En In linea 13 se declarn una referenda tipo JTextArea llarnuda areaSalida y la inicializa con un nuevo objeto JTe:l(:tArea, Este objeto mostrani los resultados del progrnma.
1

Los argumentos del metodo pueden scr constantes, variables


f ;: 4 • 0, entonces la instruccion System.out.print1n( Math.sqrt(

expresioncs, Si c ;: 13.0, d ;: 3.0 Y

c t d • f ) );

calcula e imprime In rafz cuadrada de 13.0 + 3.0 * 4.0 ;: 25.0; es decir, 5.0, En la figura 6,2 se sintetizan varies rnetodos de la clase Math. En la figura, las variables x y y son de tipo double. La ciaseMath tambien declara dos constantes matematicas que se utilizan comunrnente: Math.PI y Math .E, La constante Math. PI (3. 14159265358979323846j de la clase Math es la proporcion entre la circunfercncia de un cfrculo y su diametro, La constante Math. E (2,7182818284590452354) es el valor base para los logaritmos naturales (que se calculan con el metodo estatico log de lu clase Math),

2
3

Fig. 6.3: CuadradaEnteros.java utilizar un metoda definida par el programador. import jav~x.swing.*; public class CuadradaEnteros extends JApplet (
II configurar GUI y calcular los cuadrados de los enteros dell public void init()
(

4 5 6
7 8

6.4 Declaraciones de metodos


Los progrumas presentados hasta este punta consisten en la declaracion de una clase, la cual contiene cuando monos la declaracion de un mctodo que llama a los metodos de la API de Java para realizar sus tareas. Ahara veremos la munera en que los programadores cscriben sus propios mctodos.?
1. Todos los metodos de la clase Math son static; por 10 tanto. se llaman anteponiendo ul nombre del metodoel nornbre tin In clase Math y un punto (.). 2, Hemos visto varies ejemplos de upplets,en los cualesse declararon varies metodos (init, start y paint). Seguirernos utilizando applets para los programas con diversas declaraciones de metodos hasta que veamos los detulles acerca de Iusdecla-

9 10 11 12 13 14 15

al 10

raciones de clases en tos capitulo, 8 u 10, En eS6 punta, utilizaremosaplieacionesmas eluboradasparu muchos ejemplos,

192

Metodo5

Capitulo6

capftulo6

Meiodos 193

16 17 18 19

20
21 22 23 24 25 26

in t reau ltado ; String sal.Ida


II
=
1/'"
I

I I guardar e I rasul tado de 1,1 Hamada

a1 metoda cuadrado 1/ Objeto String que contiene los resu1t;i1do~

iterar

for
II anexar resultado a1 objeto String salida salida += "E1 cuadrado de " .,contador + n es " II

27
28 29 30 31 32 33
+

resultado

"\n";

Cuundo cl applet se ejecuta, se muestran todos los componentes de In GUI udjuntos al panel de contenido del npplet, Por 10 tanto, en la linea 19 se adjunta el objcto JTextArea, al que areaSalida haec referenda, al punel de contenido del applet, utilizando la referencia contenedor para que llame al metodo add de In clase container. Por el momenta, podemos adjunlar solo un componente de ln GUI ul panel de contenido del applet, y ese componente de Ia Gill ocupara toda el area de dibujo del applet en la pantalla (segrin este definida por los ntributos width y height del upplet en su documento HTML). En la seccion 6.8 verernos como adjllnlar muchos componentes de In GUI a un applet, cambiundc-el esquema del mismo, el cual conunla la rnanera en que el applct coloca a los componentes de 1.1GUI en su area en la pantalla. En In Hnea 21 se declarn In variable resul tado tipo int pam guardar el resultado de cada calculo del cuadntdo. En la linea 22 se declara la referenda salida tipo String y se inieializa con una cudena vacia, Esta cadcna contendra los resultados de calculur los cuadrados de los val ores del 1 al 10. En las lfneas 25 a 31 se define una instruccion for. Durante carla una de las iteraciones de este ciclo, en In linea 26 se culcula el cuadrado del valor actual de la variable de control contador, y guarda el valor en resul tado; En In Hnea 29 se concatena resul tado al final de In cudena salida. El spplet llama a su metodo cuadrado en la linea 26, mediante la instruccion resultado • cuadrado ( contador );

fin de instrucci6n for


II co10car resultados en el objeto

areaSa1ida.setText( salida); ) /1 fin del metodo init

34 35 36 37 38 39 40 41 42 43 44

JTextArea

) /1

fin de 1a c1ase CuadradoEnteros

Los parentesis a la derecha de cuadrado indican la Hamada a un rnetodo y encierran la listu de argumentos de ese metodo. En este punto, el progrnma hace una copia del valor de can tador (el argumento de la llarnada al metodo) y transfiere el control del prograrna a la primera linea del rnetodo 'cuadrado (declarado en las lfncas 38 a 42). En In linea 38 de la declaracion del metodo cuadrado se rnuestra que cuadrado espera lin argumcnto entero, scgtin In especifica su lista de pnnirnetros. El mctodo cuadrado utiliza el pardmetro' y para manipular el valor que cuadrado recibc como argumento, La palabra clave int que precede al nornbre del metodo, indica que cuadrado devuelve un resultado entcro, El rnetodo cuadrado recibe la copia del valor de contador en el parametro y. Despues, cuadrado culcula y * y (lfnea 40). El metodo cuadrado utilizu una lnstruccion return para devolver (es decir, regresar) cl resultado del calculo a lu instruccion en el metodo ini t que llamo a cuadrado. Observe que toda In declurncion del rnetodo (lfneus 38 a 42) aparece entre las llaves de la clase cuadradosnceros. Todos los metodns deben declararse dentro de la declaracion de una cluse, _ ." Buena practica de programacion 6.2 y mejorar
10 legibilidad del

de2asJ Cle3es9 (Ie ~ 85 16 de5as25 de ~ 85 )B de 76549 El cuadrado de a 85 (;4 :EI cuadrado ee 9 as 01 "EI cuadradu CIa tOes 1no :Subprogram<iiniclado.

eer es t

I!
_,'

rn
~

CO/Vt/IW r/Till linea en blanco ell/I'<' las declarucionc» de los me/ados, para separarlos prognuna.

Error com un de programaclon

6.2
/111

DC'r:/tlIW un tnetodo [ucra de las llaves de la declarucion de rlllel clast! es

ermr de sin/axis.

Figura 6.3 Metodocuadrado definldopor el programador. Parte 2 de 2.) ( Este programa es el primera en el que mostrarnos un componente de interfaz grafica de usuario (GUI) en un applet, El area visible en pan lalla para un objeto de la clase JAppIet tiene un panel de conienido (un objeto de lu clase Container, del paquete java. awt), al que se deben adjuntar los componentes de la OUI para que puedan mostrarse en tiempo de ejccucion. Este objeto es proporcionudo por el applet, por 10que nuestro programa no necesita crear un objeto Container. La clase Container se importo en la linea 3 para utiliznrla en cl applet, En la lfnen 16 se declara la referenda contenedor de lipo Container y Ie asigna el resultudo de una Hamada al metodo getContentPane; uno de los muchos metodos que nuestra clase cuadradoEnteros hereda de la clase JAppIet. Este metodo devuelve una referenda al objeto del panel de cnntenido del applet. EI programa utiliza esa referenda pilra adjunlar componentes de la Oill, como un objcto JTextArea, a la inlerfuz de usuario del apple!.

En 01 metodo init, el valor de retorno so asigna a la variable reaultado. En la linea 29 se concatena 'lEI cuadrado de", el valor de contador, "es", el valor de resul tado y un carricter de nueva linea, al final de la cadena salida. Este proceso se repite para cada iteracion de lu instruccion for. En III linea 33 se utiliza la referencia areaSalida para llamar al metoda setText del objeto JTextArea, el cual establece el iexto (salida) a mostrar en el area de texto. Declaramos las refercncias areaSalida, contenedor y salida. junto con la variable resul tado, como variables locales en ini t yu que se utilizan s610 en ese metodo, Las variables deben declararse como campos solamcntc si se requierc su uso en mas de un rnetodo de la clase, 0 si el progrurna debe guardar sus valores entre llumadas a los rnetodos de la clasc .. Observe que el metodo ini t llama al rnetodo cuadrado directamenre, sin calificar el nombre del metodo can el nombre de una clase y un punto (.), 0 con el nombre de una referenda y un punto. Cada metodo de una clase tiene la hahilldad de llamur a los demas metodos de esa clase en forma dlrecta."
3. A lospnnimetros se IC8 conoee tambien como part!lItt'lros fonllal~~·. 4. Huy unu excepci6n II cstu reglu: los rnetodos ~~atic de unll Gluse plIeden lIamar solumente II otros metodos static de In cirLleen fonna dircctu. Ell cl capitulo a hahlaremus detullildumente subre los metodos static.

194 Metodos
Formato generai de fa decfaracifm de un metodo

Capftulo6

capftulo 6

Metodos 195

La primera linea de la declaracion de un metoda se conoce como encabetado del metoda. Despues del encabezudo del metoda van las declaraciones e instrucciones entre lluves, las cuales forman el cuerpo del metoda, que es un bloquc, Pueden declurarse variables en cuulquier bloque, y los bloques puedcn anidurse, Un metodo no puedc declamrse dentro de otro metodo, EI formate basico de la declarucion de un metoda cs turo-de-valor-de-retomo nomore-dei-metodat; pardmetrol, panimetrol. { declaraciones e instrucciones ..., pllrame/roN)

ril Un metoda que lenga muchos punimetros

Observacion de ingenieria de software 6.7

tal vez estt! realizando demasiadas tareas. Considere dil'idir el metodo enmetodos mas pequeno'! que realicen los tareas pOI' separudo. EI encabezada del mlilodo debe caber en tllIO Ilnea; si es posible.

Hay tres manerus de regresar el control a In instruccion que llama a un metoda. Si el metodo no devuelve un resuttado, el control regresa cuundo el 1111jo progruma llega a la llave derecha de finalizacion del metedel do, 0 cuundo se ejecutu la instrucciou
retu:t"n; si el metoda devuelve lin resultado, la instruccion

El nombre-del-metodo es cualquier idcntificador valido, EI tlpo-de-valor-de-retomo es el tipo del resultado devuclto por el metodo al solicitnntc. EI tipo-de-vular-de-retomo void indica que un metodo no devuelve un valor. Los metodos pueden devolver como rruixirno un valor. Error corn

evahia la espresion y despues devuclve el valor resultante al solicitante. Cunndo se ejecuta una instruccion rsturn, el control rcgresa inmediatamente ala instruccion que llamo al metodo,
Notas

un de prograrnacion

6.3
tW till

Omitir d tipo de valor de retorno en la declaracion de un ",Jlodo

error de sintaxis,

sabre [1.1 sintaxis

para

llamar a un metoda

Error conuin de prograrnacion 6.4


Olvidar devolver till valor de un metodo que debe devolver lin valor es till error de sintasis. Si se especifica Ull tipo de valor de relomo que flO sell VOl d, elmetoda debe contener uflO illslruccion return que devuelva u/tvalor del iipo de valor de retorno del metoda. De manera similar; devolver un valor de tm meuulo cuyo lipo de valor de re1017l0 se haya dectarado como void es till error de sintaxis.

Los panimetros se decluran cn una lista separada por comus, encerradu entre parentesis, que declaru el tipo y nombre de cuda uno de los panimetros. Debe huber un nrgumento en la llumada al metodo para cadu panimetro en la declarncion del metodo, Adcnuis, cada argumento debe ser compatible con cl tipo del panimetro correspondiente, Par ejemplo, ua purametro de tipo doubl e puede recibir vulores de 7,35, 22 () -0.03546, pero no "hello" (porque una cadena no puede convertirse lmplfcitamente en unu variable double). Si un m~todo no accpta argumentos, In lista de parametros esta vacfu (es decir, el nombre del rnetodo va seguido de un conjunto vacfo de panimetros). , Error corn
~
~

La figura 6.3 contiene las declaraciones de dos metodos: init (lfneas 10 a 35) y cuadrado (Iineas 38 a 42). Recuerde que en la seccion 3.5 vimos que cl contenedor de applets llama al rnetodo ini t para iniciulizar el applet. En este ejemplo, el metodo ini t llama repetidamente al metodo cuadrado para realizar un calculo: despues coloca los resultados en el objeto JTextArea que se udjunta al punel de contenido del applet. Cuando el applet aparece ell la pantallu, los resultados so muestran en cl area de texto. Observe la sintaxis utilizada para llumsr al metoda cuadrado; simplcmente utilizamos el nombre del metodo, seguido por los argumentos para el metodo entre parentesis. Los metodos de la declaruciun de una clase pueden Ilamur a los dennis metodos en la misma declarucion de clase utilizando esta sintaxis.' Los metodos en la misma declaracion de cluse incluyen tanto a los metodos declnrudos en esa clase, como a los metodos heredados en esu clasc (es decir, los metodos que la clase actual extiende mediante la instruccion extends [JApplet en la figura 6.3; vea la lfnca 7]). Ahara hernos vista ires maneras de Hamar a un metoda: 1. El nombre del metorlo por sf solo; como cuadrado ( conceder ) en la linea 26 de la figure 6.3. 2. La referenda a un objeto, seguldo de un punto (.) y el nombre del metodo; como g. drawLine ( 15 10.210,10) en lu Ifneu lj de lu figura Ll l. 3.. EI nombre de la cluse calificando al nombre de un metodo; como Intege:t". parselnt Nume:t"o en la linea 28 de la figura 2.9. ) La ultima sintuxis cs solo para metodos de la clase static el capitulo 8). ( primerI

un de prograrnacion

6.5

[)"~:Ial'llr los puttimetms de un metodo del mismo tipo CO~1O f_loat X, y(que ~s ulla .I'i~taxls de d,'cl{lI'tlC:~()1lde Va! iables) ell vez ell' float X, float y es WI error de SIIIItIXIS, ya que se reqtllere WI 111'0para cada porometro de 10 lista de panimetros.

(los cuales describirernos dctalladamente en

Error cermin de prograrnacion 6.6


Colocar ttlt punta y coma despues del parentesis derecho que enclerra a la lista de panimetros de lu declaracion de un metodo, es Ull error de simaxis.

Error cornun de prograrnacion 6.7


Declorar Iluevamellle el parcill/elm de UIlll1l110docomo voriable local ell el ctlelpo delmitodo. taxis. es un erlVr de sin-

Error cornun de prograrnacion 6.8


PasoI' lill argument" que Ito es compatible cOlII'I tipo del prmimetl'lJ cOITespOlldiellte ell la Usta de parcimell'Os del metoda, Col1111nol' de sin/axis (pOl' ejemplo. pasar Ull String e ctlUnda Sf espera till inti.

~~ .,' Buena practlca de prograrnacion 6.3


~

rn
"

Elegir /lombres sig/lijicativos [lora los melodo.l· y los pardmelms /taee qlle 10.1' programas "evilar ttll tlSOexeesivo de comen/arios.

.WIll

md.I·legibl"s. y aYllda

Il[l a

Observacion de lngenieria de software 6.6


EI..ellcabezado del melodo y hl110madas ramellVS y argllmelllos. al me/odo debel! willl'idfr en ctlon/o almimero, tlilo y orden de /0.1 po-

Mi/lldo maximo de/inido por el programador EI applet de la flgura 6.4 utiliza un metoda llarnado maximo, definido por el programador para determiner y devolver el mayor de tres valores de punto flotante, En las lfneas 13 a 18 del metodo ini t se utili zan cuadros de dialogo de entrada pura obtener del usumio tres valorcs de punto t1otantc. En las IIneas 21 a 23 sc utiliza el metoda D01,lble.parseDouble para convertir Ius cadenas introducidas por el usumio en valores double. En la linea 25 se llama al metoda maximo (declarado en las Hneas 44-48) para dctcrminar el valor double mas grande de los tres valores double que sc pasan como ,rrgumcntos al metodo. El metodo maximo devuelve el resultado aI metoda ini t, utilizando una instrucci6n return. El progmmu asigna el resuhado a la variable max cn la Hnca 25. En las Iineas 31 y 32 se utiJiza la ccmcatenacion de objctos String para formal' una cadena, que cantiene los tres valores double introducidos por cl usuario y ill valor max, y despues se coloca eJ resultado en el meade texto areaSalida. Con.idere la declaracion del metodll maximo (linens 44 a 48).En la linea 44 se indica que elmctodo devuel· ve un valor double de punto tlmante, que el nombrc del metoda es maximo y que el metoda requiere tres
5. Hay una excepci6n a csta regia, ia cuul se describe en el capitulo 8.

196

Matodos

CapITulo 6

Capijulo 6

Matodos

197

punimetros double (x, y y z) para realizar su tareu. En la linea 46 se devuclve el valor maximo de los tres vnlores de punta Ilotante, utilizando des llamadas al metoda Math.max. Primero, la instruccion llama a Math, max can los valores de his variables y y z para determinar el mayor de los dos val ores. Despucs, la ins-

2 3

·1 II Fig. 6.4: p;ruebaMaxi,mo.java i t Encont r ar el valor maxuno de t r es mimercs de punto flotante.


import import public javi'l.awt.Container; javax. swing.':
numaro1:37.3

4
5

6
7 8 9 class PruebaMaximo extends JApplet ( GUI

:numerol: 99.31 :numero3:27.19lB


elma)(lmo!Js:99.n

10 11 12 13 14 15 16 17
18

I! inicializar el applet, public void init ()

obtener

l a ent;rada del .usuar i o y crear

'SubpragramalnlcladO.

{
II obtener entrada del usuario String s l = JOptionPane. showInputDialog ( "Escriba el primer valor de punt o flotante" ):. String s2 = JOptionPane.showInputDialog( "Escriba el segundo valor de punt;o Elotante" ): String 83 = JOptionPane. showInputDialog ( "Esc:riba e l tercer valor de punt o flotante" I; II convertir la entrada del uGuario en valores double numerol Double.parseDouble( 81 !: double numeroz Double .parsepoubl.e ( 52 ); double numero3 Double .par sepoubl.e ( 53 I: double

Figura 6.4 Metodo maximo deftnldo por el programador. (Parte 2 de 2.) tmcclon pasa el valor de la variable x y el resultado de la primers Hamada a Math. max como argumentos para el rnetodo Math •max. Flualmente, la instruccion devuelve e1 resultndo de la segunda llamadu a Math. max a la linea 25 (el punta en el que el mctodo init llumo al metodo maximo).

19

20

21
22

6.5 Promocion de argumentos


Otra caracterfstica importantc de las llamadas a metodos es la promocion de argumentos (0 coercion de lIrgu· men/lis); es decir, forzar a que se pasen argumentos del tipo apropiado a un metodo, Por ejemplo, un programa puede llamar al metoda sqr t de Math con un argurnenro entero, inclusive cuando el metoda espera recibir un argumento double. POl'ejemplo, lu instruccion

23 24 25 26 27

29 30 31 32

28

1/ crear objeto JTextArea par~ mostrar JTextArea areaSalida = new JTextArea();

los resultados

System. out.println ( Math.sqrt{ 4 ) ); evahla correctamente Math. sqrt ( 4 ) e imprimc cl valor 2. La lista de parametres de la declaracion del metodo huce que Java convierta el valor entero 4 en el valor double 4.0 antes de pasar cl valor a sqrt. En algunos casas, intentar estas conversioncs ocasiona errores de compilacion si no se satisfacen Ius reg las de promocil)" de Java. Estas reglas especiflcan como convertir de un tipo a otro sin perder datos. En el ejemplo anterior can aqr t; un int se convierte en double sin cambiar su valor. Sin embargo, al convertir un double en int se trunca In parte fraccionnria del valor double; par 10 tanto, se picrde parte del valor. La conversion de tipos enteros grandes a tipos enteros pequefios (por ejernplo, de long a int) puede producir tambien valores modiflcados. Las reglas de prornocion se uplican a las expresiones que contienen valores de dos 0 mas tipos primitives (tambicn conocidos como expresiones de tipo mit/D) y a los valores de tipos primitives que se pusan como argumentes a los m610d05. El tipo de cada valor en una expresi6n de tipo mixto se promueve al tipo "mas alto" en la expresion. (En rcalidad, la expresion utiliza una copia temporal de cada valor; los valores originales pennanecen sin cambios.l La figura 6.5 muestra los tipos primitives y los tipos a los que puede promoverse cada uno de ellos, Observe que todas las promociones validas para un tlpo dado son los tipos "de mas arriba" en la tabla. Por ejemplo, un int puede prornoverse a los tipos long, float y double que estrin mas arriba. Convertir valores a tipos que csten mas abajo en la tabla de la figura 6.5 puede producir valores distintos. Por 10 tanto, en casos en los que la informacion podrfu perderse debido a la conversion, el compilador de Java requiere al programador que utillce un operador de conversion de tipos(vea la secclon 4.9) para forzar explfcitamente a que ocurra la conversion. Nuestro metoda cuedradc (de Infigura 6.3) utillza lin parametro entero, Para llamar a ouadrado can una variable double Hamada contador, tendriamos que cscribir IIIllamada al metodo como cuadrado ( (int 1 contadcr ). Estn Ilamuda al metoda convierte explfcitamente el valor de y en un entero, para usurlo en el metoda cuadrado. Por 10 tanto, si el valor de y cs 4 • 5, el metoda cuadrado devuclve 16, no 20.25.

II mostrar los mimaros y el valor maximo areaSalida. set.'l'ext ( "numerol: " + numerol + "\nnumero2: " + nwnero2 + "\nnwnero3: u + numero3 + "\nel valor maximo es: " + max},

33

34
35

// obtener e1 area visible del applet para componentes GUT Cont.aIner concenedor = getConl:entPane (I :
1/ adjuntar areaSalida al contenedor contenedor . add ( areaSalida );
I I fin del metoda init

36 37 38 39 41 42

40

43
44 45 46 48 49

47
50 } 1/ fin de la cIase PrnebaMaximo

Figura 6.4 Metodo maximo deftnldo per el programador. (Parte 1 de 2.) ,p

198

Matodos

CapRulo

capHulo 6

Metodos

199

TIpo double float long int ohar short byte boolean

Promoclones Ninguna double

valldas

paquete :J~v~.applet

Dascrlpclon EI Paquete Applet de Java contiene In clase Applet y varias interfaces que permiten III internccinn entre applets y navegadores, y la reproduccion de clips de audio. En Java 2, Ia clase j avax, swing, JApplet se utiliza para definir un applet que utiliza los componentcs de Ia aUI de Swing. EI Paquete Abs/l'lIcl Window Toolkit de lava contiene las clases e interfaces requeridas para crenr y manipular aUIs en Java 1.0 y 1.1. En Java 2 Sf utilizan los componentes de lu GUT de Swing incluidos en el puquete j avax, swing. EI Paquete Abstract Willdow Toolkit Event de Java contiene clases e interfaces que habilltan el manejo de eventos para componcntes de lu aU1 en los puquetes java. awt y j avax, swing. EI Paqueie de entruda/salida de Java contiene clases que pcrmiten it los programas recibir datos de entrada Y mostrar datos de salida (veu el capuulo 17). EI Paquete tiel Lellguaje Java contiene clases c interfaces (descritas u 10 largo de este texto) requeridas por muchos programas de Java. Este puquete es importado por 01 compilador en todos los programas. El Paquete de red de Java contiene clascs que permiten a los programas comunicarse medlunte redes (vea el cupftulo 18). El Paquete de texto de Java contiene clases e interfaces que pcrmiten a un programs de Java manipular mimcros, fechus, caracteres y cadcnas, El puquete proporciona muchas de las herramientas de lnternucionalizacion de Java que permiten In perscnalizacion de un programa con respecto a una configuracicn regional espccifica (por ejemplo, un upplet puede mostrnr cadenus en distintos lenguujes, can base en 01 puis del usuario),

Uoat ()double lang, float a double int, lang, float


0

double double
110

j~va.awt

int,long,floatodouble short, int, lang, float


0

Ninguno (lus valores boolean

se consideran como nurneros en Java)

j~va,awt,event

Figura 6.5 Promoclones

permltidas para 105 tlpos prlmitlvos.

jav~,io java. lang

Error eomen de programacion 6.9


Convettit /III valor de 11/1 tipo pl'imitivv en otro tip" primitivo pllede cambiar ese 1'0101; si el nllevo tipo 110 es unll promocion vdlida. POI'ejemplo, convertir 1m vulor de punta flotanu: ellllli valor elltero pucde introducir errores de truncamiento (perdida de /0 parte [raccionaria} en el resutuulo.

java.net java. text

6.6 Paquetes de to API de Java


Como hemos visto, Java contiene muchas clases predelinidas que se agrupan en categorfas de clases rclacionadas, llumadus paquetes. En conjunto, nos refcrimos a estes paquetes como la API de lava (Interfa" de progtamadill! de aplicaciones de Java), 0 bibliotecu de closes de Java. A 10 largo del texto, las declaraciones import especifican las clases rcqueridas para compilar un prograrna en Java. POI' ejemplo, un programu incluye la decluracion
import javax.Bwing.JApplet; j avax, awing

javl;l,utH

de techa

EI Paquete de utilerta: de Java contiene cluses e interfaces utilitarias, como munipulaciones y hera, herramientas para procesar rnimeros uleatorios con la clase Random, ulmacenar y procesur grundes cantidades de datos y descomponer cudenas en piezas mas pcquciias llarnadas tOKeIlS, can lu clase StringTokenizer (vea los capitulos 20, 21 Y 22). EI Paquete de componentes GUI SWillS de Java contlene clases e interfaces para los componentes de la Glll Swing de Java, los cuales ofrecen soporte para Gllls portables, EI Paquete Swillg Event de Java contienc clases e interfaces que permiten 01 rnunejo de eventos para los componcntes de In aUI en el paquete j avax, swing.

pam especificar que el prograrnu utiliza la cluse JApplet del paquete j avax. swing. Esto perrnite a los programadores utilizar el nombre de la cluse JApplet, en vez de tenet que usar el nornbre complete calificndo de la clasc, j avax. swing. JApplet, en el codigo,Uno de los puntos mas fuertes de Java es el extenso numero de clases en los paquetes de III API de Jnva, que los programadorcs pucden reutilizar, Utiliznrernos una gran cantidad de esas clases en este libro, Ln figura 6.6 proporcionu una breve descripcion de un subconjunto de los paquetes en lu API de Java. Utilizaremos clases de estes paquetes y de otros mas a 10 largo de este libro. Le proporcionamos este listado para introducino a la variedad de cornponentes reutilizables que hay disponibles en la API de Java. Mientras este uprendiendo estc lenguaje, invierta una parte de su tiempo cxplorando las descripciones de los paquetes y las cluses en 10 documentncion par,\ la API de Java (j ava , sun, com/
j2se/1.4,1/docs/api).

javl;lx. swing. event

Figura 6.6

Paquetes de 10 API de Java (un subconJunto).

EI conjunto de paquetes disponibles en el Kit de desarrollo de software para Java 2 (J2SDK) es bastante extenso. Ademas de los paquetes sintetizados en la figura 6.6, el J2SDK incluye paquetes para gnificos complejos, interfaces graficas de usuario avanzadas, impresion, redes uvnnzadus, seguridad, proccsamicnto de bases de datos, multimedia, accesibilidad (para personas con discapacidadcs) y muchas otras funciones, Para una vision general de los paquetes en el J2SDK version 1.4.1, visite:
java,aun.com/j2se/l,4,1/docs/api/overview-summary,htrnl

utiliza la mayoria de las instrucciones de control presentndas hasta este punto en el libro, e introduce varios conceptos nuevos. Hay alga en el arnbiente de un casino de npuestas que anima a las personas: desde las elegantes mesas de caoba y fleltro para tirar dudes, hasta las maquinas tragamonedas, Es eI elemento de awl', la posibilidad de que la suerte convierta un bolsillo lleno de dinero en una montana de riquezas, EI elemento de azar puede lntroducirse mediante el metodo random de la clase Math.6 Considere In siguientc instruccion:
double valorAleatorio " Math,random();

Ademas, muchos otros puquetes estan disponibles para descargarse en java. sun. com.

6.7 Generaci6n de numeros aleatorios


Ahoru unalizaremos de manera breve una parte divcrtidu de In prognunaci6n: simuluci6n y jucgos. En estu y en la siguiente secci6n desarrolluremos un progranm de juego bien estructurudo con varios metodos. EI progrnmu

EI rnetodo random de Math genera tin valor double aleatorio en el rango de 0,0 hasta, perc sin incluir, 1.0. Si el metodo random verdaderamente produce valores uleutorios, entonces cualquier valor desde 0.0 hasta, pero sin incluir, 1,0 deberfa tener una opartunidad (0 prcbobiluiad; igual de ser elegido cada vez que se llame a random, Los vulores devueltos por random son en realidad numerus seudoaleatorias (una secuencla de va6, Java tambien prQPorcionllla clase Random~n el pnquetG j I;lva,utH pura producir valores ale:ltorio$. Un objelo de estu cillse puede produclr VIIlores nlentorios int, long, flol;lt 0 double.

200

Matodos

Capilulo,6

capHulo 6

Metodos

201

lares producidos por un calculo matcmdtlco complejo). Ese calculo utiliza la hora actual del dfa para sembrar el generador de mimeros aleatorios de tal forma que la ejecucion de un programa produzca una secuencia distinta de valores nleatorios, El rango de vulores producidos directumente par el metoda random es a menudo distinto del range de valares requeridos en una aplicaciou de Java particular, Por ejemplo, un progruma que simula 01 tiro de un dado de seis Iudos requerirfa enteros aleatorios en el rnngn de I II 6. Un programn que udivine en forma aleatoria el siguiente tipo de nave espacial (de cuatro posibilldndes distintas) que volani a 10 largo del horizonte en un vi· deojuego requerirfa mimeros aleutorios en el range de I a 4. Para demos trur el metoda random, desarrollaremos un programu que simula 20 tires de un dado de seis lades, y que muestru el valor de cada tiro. Utilizarernos el operndor de multiplicacion (*) en conjunto con el metoda random, COIllO se muestra a continuacion, para producir enteros en el range de 0 a 5. ( int ) (Math.random() • 6 ) A esta manipulacion se le conoce como escalar el runge de valores producidos por cl metodo random de Math. EI mimero 6 en In expresion so conoce como el factor de escala. El operador de conversion a enteros trunca la parte de punto flotante (la parte despues del punta decimal) de cada valor producido por In cxpresion. Despues vamos a desplazur el range de ntirneros producidos agregando un valor de desplazomiento (eneste caso, I) a nuestro resultudo anterior, como en
1 + ( int ) ( Math.random()

27 28

"20 mimercs aleatorios de 1 a 6", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0);

29
30 31 32 33

II tarminar la aplicaci6n

I I fin de main II fin de la clase EnterosAleatorios

34

Figura 6.7

Enteros aleotorios condesplazamlento

y escala. (Parte 2 de 2.)

•6)

EI valor de despluzumiento especifica el primer valor en el conjunto deseado de enteros aleatorios. La figuru 6.7 confirrna que los resultados del calculo anterior scan enteros en el range de I a 6. La linea16 en el metoda main de la apllcacion sc ejecuta 20 veces en un ciclo, y los resultados se muestran en un cuadro de dialogo de mensaje,

Para mostrur que estos mimeros ocurren con una probabilidad aproxlmadamentc iguul, vamos a simular 6000 tiros de un dado con la aplicacicn de In figura 6.8. Cada entero dell al6 debe aparecer aproximudamente 1000 veces.
I

2 2 3 4 6 7 8 9
10

1 II

fig. 6.7: EnterosAleatorios. java I I Ent.aroe al.eator i os con desp Lazarni.entoy eacal a, import javax. swing. JOptionPane;

3 4

import javax.swing.*;

II Fig. 6.8: TirarDado.java II Tirar un dado de eeis lados


c lass 'rirarDado

6000 veces.

5 public
6 7
8
{

5 public class EnterosAleatorio5 (


public static void main( String args[] )
(

public static void main( String args[] ) int frecuencial frecuencia4 for ( i.nt tiro
0, Erecuencia2 0, frecuencia5 0, frecuencia3 " 0, frecuencia6

9 10

11

a, a,

cara;

11
12 13

int valor; String salida


II

:;

~";

14
15 16

iterar 20 veces for ( int contador

12 13 14 15 1; contador
<~

II sintetizar resultados
0

1; tiro <; 6000;

t i ro-»

){

20; contador++ ) {

16

17
18 19 20 21 22

17 18 19
20

II determinar e1 valor de tiro e incrementar el contador apropiado switch ( ){


case 1: Hfrecuencial; break; case 2: Hfrecuencia2 ; break; case 3: ++frecuencia3 ; break;

salida

+,

valor

+'

Iii

1/ anexar valor a salida

21
22

23
24 25

/1 5i e1 contador as divisible entre 5, anexar nueva linea a String salida if ( contador % 5 o) salida += "\n"; ) 1/ fin de inatrucc ion for JOptionPane.showMe5sageDialog(
Enteros oleotorlos con desplozornlsnto

23 24
25

26 27 28 30

26
Figura 6.7

29
null, salida,
y escolo. (Parte 1 de 2,)

Figura 6.8 Tlrar un dado de sels lodes 6000 veces. (Parte 1 de 2,)

202 Melodos

Capftulo6

cop~ulo6 Anteriormente demostrarnos la instruccion


cara

Melodos 203

31 32 33 34
35

case

4:
++frecuencia4; break;

1 ~ ( int

) ( Math,random()

• 6 );

case

38 39 40
~

37
case

36

5: Hfrecuencia5; break; 6: Hfrecu!mcia6; bnak; de ins t.rucc i on swi teh

lu cual simula cl tiro de un dado de scis lados, Esta instruccion siempre asigna a la variable cara un entero en el rango 1 :;;cara :::;6. La anchura de este rango (es decir, el mimero de cnteros consecutivos en el rango) es de 6, y el numero iniciul en el runge es 1. Haciendo referenda a la instruccion anterior. podcmos vcr que la anchura del rnngo se detennina en base al mimem 6 utilizudo para escalar random can el operudor de multiplicucion, y el mimero inicial del range es igual al mimero I sumado a ( int ) (Mat:h, random () * 6 ). podemos generalizar este resultado como numero = vulorlsesplummiento
+ ( int ) ( Math,random() • /actorEscala );

42
43 II II fin

44 45 46
47

fin de ins truce Ion for areaSalida • new JTextArea(); \ t.Precuenc i a" + • \n1 \ t" + frecuencial + "\n3\t" + frecuencia3 + + "\n5\t" + frecuencia5 + );
+

en donde valorllesplatamiento es igual al primer mimero en el range dcseado de entcros consccutivos y fuctorEscala cs igual a la anchura de esc ran go, En los ejercicios veremos que es posible seleccionar enteros al azar, a partir de conjuntos de valores que no sean rungos de entcros consecutivos,

JTextArea areaSa1ida, "\n2\t" "\n4\1;" "\n6\t"

6.8 Ejemplo: Un juego de ozor


Uno de los juegos nuis populares de azar es el juego de dados conocido como "craps". cl cual se juega en casinos y callejones en todo el rnundo. Las reglas del juego son simples:
Ullj'lgador lira dos dados. Coda dado tiene sels caras, las cuales contienen uno, dos, Ires, euatro, cinco Y sei: punrespectivamente. Una vez que los dados dejan de moverse, se calcula la SU/lla de los puntas negros en las dos caras superiores. Si la sumo es 7 u 11 en "I primer tiro, el jugador gana. Si /0 sumo es 2, 3 a 12 en el primer tiro illamado "craps"). el jugac/or pim/e (es decir; III "casa" galla). Si la sumo es 4, 5, 6, 8. 90 10 en el primer tiro, eSt! sumo .Ie convierte en el "punta" del jugadO/: Para gmm" el jugai/or debe seguir tirando los dados /WSIa que sa/ga otra vez "su punto" i<!sclccir, que tire ese mismo valor de punto). Eljugodor pierde si lira 11/1 7 ames de llegar a .I·U ]J'lIItO.
IDS negros,

48 49
50

51 52
53

setText ( "Cara + frecuencia2 + frecuencia4 + frecuencia6

54
55

JOptionPane, show!~essageDialog ( null. areasal ida, "Tirar un dado 6000 veces "; JOptionPane,INFORMATION_MESSlIGE ); System.e~it( II fin de main 'rirarDado 0);

56 57 58 59 60 61

(I

terrninar

la aplicacion

EI applet de la flgura 6.9 simula el juego de craps, utillzando varies metodos para definir la logica del juego,
1 / I Fig, 6,9: II Crap". craps, j ava

II

fin

de 1a cLase

3 4 5 6
7

Figura 6,8

Tirar un dada de seis lados 6000 veces. (Parte 2 de 2,)

8 9 10 11 12 13
14

Como 10muestran las dos salidas de ejernplo, al escalnr y desplazar los valores producidos por el metodo ran ~ dam, el programa puede simular en forma realista el tiro de un dado de seis lades. Se utilizan instrucciones de control anidadas en el programa para determinar el mimero de veces que se tiro cadu uno de los lades del dado, La instruccion for de las lineus 13 a 45 itera 6000 veces, Durante cada iteracion, en la linea 14 se produce un valor del I al 6. EI valor de cara que se eligio al azar se utiliza como la expresion controladora de In instruccion swi tch uniduda (lineas 17 a 43), Con base en el valor de cara, la insuuccion Bwitch incrementa una de las seis variables contadores durante coda iteracion del ciclo.? Observe que In instruccion swi tch no tiene caso default, ya que tenemos un caso para cada posible valor del dado, Ejecute el programa varius veces y observe los resultados. Cada vez que ejecute este program a, observe que produce resultados distintos.
7. Cuundo estudiemos los urreglos, en el capitulo 7. veremos como reemplazar toda In instruccien swi tch en este programa con una sola instruccion.

15 16 17 18 19 20 21 22 23

boolean primerTiro = true; int sumaDeDados = 0; int miPunto • 0; int estadoJuego

verdadero si es el primer II suma de los dados


(I

tiro

del

dado

punta ai, no gana a pierde en el primer tiro CONTlNUAR;II e1 juego no se acaba todavia
(I

II conf i.qurar

componentes

de la GUI

Figura 6.9 Simulacl6n de crops, (Parts 1 de 4,)

204

Melodo5

Capffulo6

copnulo 6

Metodos

205

24 25 26 27 28 29 30 31 32 33 34 35 36
37

public void init{)


{

38 39
40

41
42

II crear etiqueta y campo de texto para el dado 2 dad02Etiqueta ~ new JLabel ( "Dado 2" ) I contenedor. add ( dad02Etiqueta II dad02Campo· ~ new JTextField{ 10 I; dad02Campo.setEditable{ false I; contenedor. add ( dad02Campo I;
campo de texto para suma surnaEtiqueta ~ new JLabel ( "La suma es" ); contenedar.add{ surnaEtiqueta ); surnaCampa ~ new JTextField ( 10 ); surnaCampo.setEditable{ false ); contenedor.add{ surnaCampo I;
y

79 80 81 82 83 84 85 86 87 88 89 90 91 92
93

II pierde en primer tiro

estadoJuego break;

PERDIDOS;

II recuerda el punta default : estadoJuego = CONTlNUAR; miPunto ~ sumaDeDados;


primerTiro break;

43 44 45 46 47 48 49 50 51 52 53 54 55
56

II crear etiqueta

57 58 59 60 61 62 63 64
65

crear etiqueta y campo de texto para punta puntoEtiqueta ~ new JLabel ( "El punta es" I; contenedor.add( puntoEtiqueta I; punt.ocamoo ~ new JTextField ( 10 I; puntoCampo.setEditable( false ); contenedor.add( puntoCampo );
II

) II fin del metoda init


II

66 67

dados surnaDeDados

68
69 70 71 72
73

tirarDados(l;

II

tirar los dados

II primer tiro de los dados

if ( primerTiro ) switch ( sumaDeDados I {


II

74 75 76 77 78

gana en primer tiro estadoJuego ~ GANADO;

94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
133

false;

II fin de instrucci6n switch


I I fin de La parte if de La instrucci6n if ...else

else { II tiro subsecuente de los dados

II determinar estado del juego


if ( sumauepados
=~ miPunto) estadoJllego = GANADO;

II gana llegando al punto

else if ! sum;;tDeDados = '7 ) =

II pierde tirando un 7

estado"uego ~ PERDIDOS;
} I I fin de la parte else de La Instrucc i cn if ...else

mostrarMensaje (I;

I I mostrar un mensaje i ndi.cardoel estado del juego

I I fin del metoda actionPerformed


II t i rar dados , calcular suma y mostrar resultados

II elegir valores aleatorios para los dados

int dadol int dad02 int suma

~1

+ +

( (

int

(
(

i.nt )
+

Math.random () ~jath.random ()

. .

6 I; 6 I;

~ dadol

dado2;

II surnarvalores de 108 dados

II mostrar resultados en campos de texto

) II fin del metoda tirarDados

Figura 6.9 Simulacion de craps. (Parte 2 de 4.)

Figura 6.9 Simulacion de craps. (Parte 3 de 4.)

206 Melodos 134 135 136 137 138 139 140 141 142
143 144 145 146

Capffulo6.

copftulo6

Melodos

207

determinar estado del juego; mostrar el mensaje apropiado en la barra de estado public void mostrarMensaje()
/1
(

/1 el juego debe if

else { 1/ juego ganado

perdido

if ( e8tadoJuego = = GANADO )

147 148 149 150 152


151 153 154

else

primerTiro

true;

// e1 siguiente tiro es el primero de un nuevo juego

} // fin de la parte else de la instrucci6n if ...else // fin del metoda mostrarMensaje


/1

EI jugudor debe tirar dos dudes en todos los tires. Al ejecutar el applet, haga clie en el bat6n TIrar dodos para jugur, La barra de cstado en lu parte inferior de la ventana del appletviewer muestra el resultado de cuda tiro. Las capturas de puntalla mucstrun cuatro ejecuciones separadus del applct (una victoria en el primer tiro, una derrota en el primer tiro, una victoria llegando al punta y una derrota al tirar un 7 antes de llegar al punto.) Hasta ahora, In mayor parte de las interacciones con el usuurio en nuestros programas han side a traves de un cuudro de diulogo de entruda (en donde el usuurio puede escribir un valor de entrada para el programa) o cuadro de dialogo de rnensaje (en donde se muestra un mensaje ul usuario y este puede hacer clic en Aceplor para desapurecer el cuadro), Aunque estes cuudros de dinlogo son formas vtilidas de recibir entrada de un usuario y de mostrar la salida en un progrnma de Java, sus capucidades son bastante lirnitadus; un cuadro de dialogo de entrada puede obtener del usuario s610 un valor a la vez, y un cuadro de duilogo de mensaje s610 puede mosnnr un mensaje. Sin embargo, por 10 general, se requieren mas entradas del usuario a la vez (como cuundo el usuario introduce su nombre y direccion) 0 se requiere mostrur diversas piezas de datos (como los valores de los dados, ln suma de los dados y el punta, en este ejemplo), Para comenzar nuestra introducci6n a las interfaces de usuario mas elnboradas, mcstramos en nuestro programa dos nuevos conceptos de interfaz grafica de usuario: adjuntar varies cornponentes de la GUr a un applet y elmanejo de eventos de la GUl. Las declaraciones import en las lfneas 3 a 6 indican los paquetes de los cuales se utilizan clases en este applet. En In lfnea 3 se especifica que el programa utiliza clases del paquetc java. awt (especfficamente, las clases Container y FlowLayout). En la linea 4 se espccilica que el progruma utiliza clases del puquete java. awt, event. Este paquete contiene muchos tipos que pcrmiten que un programa procese las intcracclones de un usuario con la OU! de un progrnma En nuestro programa, utilizurnos los tipos ActionListenar y ActionEvent del paquete java, awt. event. En la linea 6 se especifica que el program a utiliza clases del paquete javax. swing (cspecfficarnente, utilizamos las clascs JApplet, JButton, JLabel y
JTextField).

155

fin de la clase Craps Gonor en el primer tiro Perder en el primer tiro

Como 10 indicamos nnteriormcnte en el Iibro, todo programa de Java sc basa cuando menos en una decluradon de clase que extiende y mejora una declaracion de clase exlstente, par media de la herencia, Recuerde que las nuevas cluses de applets extienden la clase JApplet, de rnanera que puedan hercdar sus atributos y comportamlentos (campos y metodos) existentes. En la linea 8 se indica que la clase Craps hereda de JApplet y que implementu a la interfuz Aat.i.onListener. Ademas de extender una supercluse, una clase puede irnplcmentar una 0 mas interfaces. Una interfaz es un tipo que especifica uno 0 mas metodos (comportnrnicntos), los cuales usted debe declarar en su clase. La interfaz ActionListener declara al metoda actionPerformed. Para implcmentar la lnterfuz ActionListener, tenemos que implementar un metodo con la primera linea public void actionPerformed( ActionEvent actionEvent ) en nucstra clase Craps (como se muestra en la linea 66). La tarea de este metoda es procesar la interaccion de un usuario con el objeto JBu t ton (llamadc TIrar dodos en la interfaz de usuario) en este applet, Cuando el usuario oprimc el boton, el metoda actionPerformed se llama en respuesta a la interaccion del usuario. Este proceso de responder a las interacciones de los usuaries sa conoce como manejo de eventos. El evellfo es la interaccion del usuario (por ejernplo, oprimir el bot6n). El metodo actionPerformed es el manejador de evelllOS, el cual contiene In 16gica del juego de Craps en el programa, Hublaremos en breve sabre los detalies reluclonados can In interaccion del manejo de eventos y el metoda actionPerformed.8 EI juego de los dudes es razonablernente complicado. El jugador puede ganar a perder en el primer tiro, o puede ganar 0 perder en cualquier tiro subsiguicnte. En la lfnea II sa crean e inicializun variables que especifican los tres estados de un juego de dados: Juego ganado (GANADO),juego perdido (PERDIDO) 0 seguir tirando los dados (CONTINUAR). La palabra clave final al principio de la declarncion indica que estas son variables constantes (variables cuyos valores no pueden cambiarse). Cuando un programa declara una variable final, este debe inicializur la variable antes de usarla, y no puede maditicar su valor a partir de entonces, Si la variable

Un oblate JLabel Un objeto JButton Un obleto J'l'extField Gonar liegondo 01 punta

Perder ffrondo 7 antes de lIegar 01 punta

Figura 6.9 Simulacl6n de craps. (Parte 4 de 4.)

8. gil el cupirulo 9 hablaremos detnlladamente sohre las interfaces. Par ahara, a medida que vuya desarrollnndo sus propios upplets con interfnccs graflcas de usuario, lmite Ins caractenstlcas que soportan el manejo de eventos de los componentes de III GUI que presentarnos.

208

Melodos

Capfiulo 6.

capHul06

Melodos

209

es un campo, esta inicializacion generalmente ocurre en la decluracion de la variable." Las programadorcs a menudo se refieren a las variables constantes como constantes, constantes con nombre 0 variables de S(i/o lecturu.
~A

Error comun de programacion 6.10 Utilizw el valor de /lila variable final cializarta, .1'011 cetones que pnulucenun a
sill inicializar 0 inunuar modificar error de compilacion.
1I11C1

l!iJJ
" ~ ,c

variable final '

dcsplII!s de ini-

Buena practica de programacion 6.4


POI' COIJI'enciOIl, utllice .1'610tetras may4,rculas (con guiones bajos entre palubtus] final. Este formato hace que las elJllSIlI/lfes resahen ell UII programa. en los nombrcs de varil/bles

rn

FlowLayou t es el administrudor de esquemas mas simple. Los componentes de la OU! .se colocan de izquierda a derechu, en el orden en el que se adjuntan ul objeto Container (el panel de contenido del applet, en este ejemplo) con el metodo add. Cuundo el administrador de esquernus IJega al borde del contenedor, empieza una nueva fila de cornponentes y continua con su distribucion en esa mao En la linea 28 se crea un nuevo bi to de III clase FlowLayou t y 10 pasa como el argurnento para el metodo setLayou t. Generalmente, eI o Je . IOC d . esquema sc establece antes de que se agreguen cornponentes de la our u un objeto contair:er.. uan 0 ~Jecute este applet en el appletviewer, cambie el tumaiio de la ventana para ver como funeiona el objeto FlowLayout para areas de applets de dlstinto tnrnaiio. Elegimos una anch~fU y altura para este_upplel que permiticra al objcto FlowLa:yout posicionar los componentes de la OU! segun se muestra en la figura 6.9. Error eernun de programacion 6.11
~ Si 1m objelo co~ta.i.ne~ no es .10sujicielltemenle de la Gll! que Ilene adjullltl.l'. grande lui vez
/10

Buena practica de programacion 6.5


Utilitar variables final con nombre«sigllijiclllivos, //IlIS Iegibles y jaciles de modificar. cllvez de literates (como 2), /Jaee que las programas scali

'

liJj ponentes

se niuenren algl/llos 0 lIingulID de 10 coms

En las linens 13 a 16 se declaran varies campos que se utiliznn en los rnetodos del applet Craps. La variable primerTiro es una variable tipo boolean que indica si el siguiente tiro de los dados es el primer tiro en el juego actual (true cuando el upplet empieza a ejecutarse y cuando cornienza cada juego nuevo). La variable sumaDeDados rnantiene la surna de los dados durante el ultimo tiro. La variable miPunto almacena el "punto' si el jugador no gana 0 pierde en el primer tiro. La variable estadoJuego lleva el registro del estado actual del juego (GANADO,PERDIDO 0 CONTINUAR). En las Iineas 19 a 21 se declaran Ius referencias a los componentcs de la QUr que se utilizan en la irnerfaz gnifica de usuario de este applet, Las referencias dadolEtiqueta, dado2Etiqueta, sumaEtiqueta y puntoEtiqueta hacen referenciu a un objeto de la clase JLabel, un componente de la OU! que contiene una cudena de caracteres a mostrar en la pantalla. Generalmente, un objeto JLabel indica cl propos ito de otro componente de la OUI en la puntulla, En las capturus de pantalla de lu flgura 6.9, los objetos JLabel son el texto Q In izquierda de cada recuingulo en las primeras des tiIas de la interfaz de usuario. Las referencias dadolCampo, dado2Campo, sumaCampo y puntoCampo hacen referenda a un objeto de In clase JTextField (un componcnte de In our que sc utiliza para obtener una cadena de informacion del usuario mediante el tecludo, 0 pam mostrar informacion en In pantalla). Los objetos JTextField son los rectungulos a la derecha de cadu objeto JLabel en las primeras dos filus de la interfuz de usuario. La referenda tirarBoton huce referenda a lin objcto de In clase JButton. Cuando el usuario oprime un objeto JButton, el programa normalrnente responde reulizando una tarea (tirando los dados, en este ejemplo). EI objeto JButton es el recningulo que contiene las palabras Tiror dodos en lu parte inferior de lu interfnz de usuario que se mucstra en la I1gura 6:9. Hemas visto objetos JButton en programas antcriores: cada cuadro de t1ialogo de mensaje y cuda cuadro de dialogo de entrada cOlltenian un boton Aceptor para desaparcccr el cuadro de dialogo () enviar la entmda del IIsuario al programa. Tambit!1l hemos visto objetos JTextField en programas nnlerio· res. Cada cuadra de diu logo de enlrada contiene un objeto JTextField, en el eual 01 usuario escribe un valor de entrada. El metodo ini t (lineas 24 a 63) erea los objctos de los componentes de In OU! y los adjunta al panel de eontenido del applet (como en la tigura 6.3). En la Ifnea 27 se inicializa la referenda contenedor tipo Container con el resuitado de In Hamada al metodo getContentPane heredado del apple!. Recuerde que en la scocian 6.4 vimos que el metodo getcontentPane devuelve una referenda al panel de eontenido del applet, la eual puedc usarse para ndjuntar eomponentes de la OU! a la intcrfaz de usuario del applet. En Itt linea 28 se utiliza el metodo setLayout de Container para cspecilicar el udministrador de esquema.l· para la interfaz de usuario del applet. Un ndministr,ldor de esquemas ordena los componenlcs de la OU! en un objeto Container, para presentarlos en la pantaIIa. EI adminislrador de esquemas delerminu la posicion y el tamano de todos los eomponentes de la AU! adjunlos al contenedor. proccsalldo en consecuencia la mayorin de los detaIIcs del esquema y pennitiendo al programudor conccntrarse en In apUliencia visual basica del progrUlna.

En las Uncus 31 a 35, 38 a 42, 45 a 49 y 52 a 56 se erea un objeto JLabel y un objeto JTextField, y se udjullian a la interfaz de usuario. Como estes conjuntos de lfneas son bastunte similares, nos concentrnremos en las lfneas 31 a 35. En In linea 31 se crea un nuevo objeto JLabel, se inicializa con In cadena "Dado 1ft y se asigna el objeto a la referenda dadolEtiqueta. Esta etiqueta precede ~I objeto JTeX~Field co:r~spondiente (llamado dadolCampo) en la interfaz de usuario, para que el usuano pueda determinar el propostto del valor que se muestra en el campo de texto. En la linea 32 se adjunta dadolEtiqueta aI panel de contenido del applet. En la linea 33 se crea un nuevo objeto JTextField, se iniclaliza con 10 caracteres de ancbura y se asigna el objeto a III referenda dadolCampo. Estc objeto JTextField muestra el valor del primer dado dcspues de cada tiro de los dados. En In lfnea 34 ~c utiliza el tnelD?~setEdi ~able de JT xtField con el argurnento false, para indlcar que el usuano no puede escribir en el objeto JTextF~eld (esto tarnbien se conoce como hacer que el objeto JTextField 110 pueda editarse). Los campos de texto no editablcs se muestrun con un fondo grls, de manera predetenninada. Un objeto JTextField editable tlene un fondo blanco (como se ve en los cuudros de didlogo de entrada). En la Hnen 35 se adjunta dadolCampo al panel de contenido del applet. En las llneas 38 a 56 se realizan tareas ldentlcas para Ius demas etiqueus y campos de texto, En la linea 59 se crca un nuevo objeto JButton, se inicializa can lu cadena "Tirar dados" (In cual apareceril en el boron) y se nsigna esc objeto a In referenda tirarBoton. En la linea 60 se especificu que este applet (mediante la palubra clave thi s) debe escuclzar los eventos producidos por el boton tirarBoton. La palabra clave this permite al applet referirse u sf mismo. (Hablarernos detulladumente sobre this en el capitulo 8.) Cuando el usuario interactua con un componente de la aU), se envia un evenlo al applel. Los evcntos de In QUI son mcnsajes que indican que d usuario del programa ha interactuado con uno de los compollentes de la OU! del programa. Por ejemplo, cuandousted oprimc el objeto JButtonen la interfaz de usuario de este programa, se envia un mensaje aI applet para in~ic.arl~ que el evcnto ha ocurrido, notificandole que usted oprimio el boton. Pura un objeto JButton, el mensuJe tndlCa al applet que cl usuario realizouna acdon sobre el objcto JButton, 10 eual produce unu Hamada al metoda actionPerformed para procesar la interacci6n del usuario. Esle estilo de pro!!famllcion se conoce como programacion contro/ada POl' evelllos: el usuario interacrua con un COlnponente 1a OU), el progrJma recibe la notificacion del evento y 10 procesn. La interuccion del usuario con la our "control a" el programu. Los metodos que se Ilaman al ocurrir un evento se conocen como mitot/os tnanejlldores de m~nlos, 0 simplemente como mlltlejlldores de evenlos. Cuando ocurre un evento de la OU! en un programa, el mecanismo para manejar eventos crea un objeto que condene informucion acerca del cvento que acuba de ocurrir, y llama a un meloda apropiado para manejar eventos (actionperformed para un abjelo JBu t ton). Antes de que pueda procesarse cualquicr evento, cada componcnte de la OU! debe saber que objeto en el programu dene eI metodo mancjudor de eventos que sera IIamado cuando ocurra un

d:

9, La inicializucion pueue ocurrir tnmbien en 01 cOIl,vrructorde In elase (que describimos en el capitulo 8i, el cual oS similar a un metodo. Proporcionuremos mayores detulles sobrc la palabrn clave final en los capitulos -7 y 8.

10. Cadu objelo container puede tener solo un lIdminislrador de esquemils a hi vez. Varios objetos cont~~ner,en el mismo progranla p\lcden lener distimos adlllinistradures de esquemas. La mnYl1riatie los enromos de progrmnacl~n de jOIvupr?veen· hClTumientns de diseiio de GUI, pllrn ayudllr II un prognunador u que d1,efie gruficnmente UllilGUI; despues las herralmentas escribell c6ulgo en Jilva purra crear la GUI. En 108 capitulos 13 y 14 hllbIllrelOos sobre varios adlOinislradores de esquemas que permiten un cOlltrollm\s preciso sobre lu dislribuci6n de los componentes de la GUI.

210

Melodos

Copftulo 6

copftulo 6

Melodos

211

evento. En la linea 60, el metodo addAationListener de JButton se utiliza para indicar a tirarBo~ ton que el applet (this) puede escuchar eventos de acdon, y que contiene el rnetodo actionPerformed. A cste procedimienro Be Ie llama registrar el manejador de eventos con el componente de lu QUI. (Tambien nos gustu lIamario la linea PWIl empezar a escucliar, ya que ahnra el upplet escucha los eventos del bat6n.) Para responder a un evento de accion, debe mas declarur una clase que irnplemente a AationListener (para ello se requiere que la clase declare tambien ul rnetodo actionpeI'formed), y debemos registrar cl manejador de eventos can el componente de la QUI. Finalmentc, en In linea 61 de init se adjunta el objeto JButton con el cual tirarBoton hace referencia al panel de contenido del upplet, cornplctando usf In interfaz de usuario. EI metoda actionPerformed (linens 66 a 115) procesa las interacciones entre cl usuario y el objeto JButton en la QUI de este applet.'! En la primeru linea del metodo se indica que actionPerformed es un metodo publico que no devuelve nuda (void) al completar su tarea, EI metoda actionPerformed recibe un argumento (uu objeto ActionEvent) cuando es llaruadu en respuestaa una aeci6n realizada sobre un componente de la GUI por parte del usuario (en este caso, oprimir el boron JButton). EI argumento ActionEvent contiene inforrnacicn sobre la accion que ocurric, Este objeto se pasa a actionPerformed mediante el mecanisme de manejo de eventos de Java. EI rnetodo actionPerformed es otro metoda mas que Java llama par usted, Declarumos el metodo tirarDados (lfneas 118 a 133) para tirar los dados, calcular y mostrar su suma. EI rnetodo tirarDados no toma argumentos, por 10 que tiene una lista de parametres vacfa, Este metoda de, vuelve la suma de los dos dados, par 10 que se indica cl tipo int como valor de retorno en el encabezado del metodo. El usuario huce die en el boron Tiror dodos para realizur su tiro. Esta accion llama al metodo actionPerformed en el applet. En lu lfnea 68 del metoda actionPerformed se hace una llamada a tirarDados, el cual elige dos valores aleatorios entre I y 6, muestra el valor del primer dado, el valor del segundo dado y la sum a de ambos en los primeros Ires objctos JTextField, respectivamente, y devuelvc la suma de los dudes. Los valores enteros se convierten en cadenas (linens 127 a 129) con el metodo esratico toString de la cluse Integer, ya que los objetos JTel{tField s610 pueden mostrnr cudenas, Despues, el metodo actionPerformed comprueba la variable primerTiro tipo boolean (llnea 71) para detcrmlnar si su valor es true. De ser asf, entonces cste es el primer tiro del juego. La instruccion swi tch anidada de Ius lfneas 73 a 98 deterrnina si el juego se hn ganado 0 perdido, 0 si debe continuar con otro tim. Despues del primer tiro, si cl juego no ha tenninudo. el valor de aumaDeDados se guarda en miPunto (linea 93) y se muestra en el campo de texto puntoCampo (Ifnca 94). En la linea 113 se haee una lIamadu al metodo mostrarMensaj e (declarado en Ius linens 136 a 153) para mostrar el estado actual del jucgo, Este metodo llama al metodo showSta tus del applet paru mostrar una cadena en la barra de estado del contenedor del applet. En In linea 140 se'muestra Tirar de nuevo. si eatadoJuego es igual a CONTINUAR. En la Hnea 145 se muestra

asicrnuel valor GANADOa la variable estadoJuego y se complete el juego. En la linea 108, si sumaDeDadO~ es igual a 7, en la linea 109 se asigna el valor PERDIDO a la variable estadoJuego y se completa eI jucgo. AI cornpletarsc el juego, mostrarMensaj e muestra un mensaje apropiado y el usuurio puede haccr clic en el bot6n Tiror dodos para iniciar un juego nuevo. A 10 largo del programa, los campos de texto dadolcampa, dado2CamXlo y sumaCampo se actuulizan con los nuevos valores de los dados y la surna en cada tiro, y el valor de puntoCampo se uctualiza cada vez que empieza un nuevo jucgo, Observe el uso de los diversos mecanismos de control de programas que hemos descrito. EI programa de los dudes utiliza cuatro metodos (;i.nit, actionPerformed, tirarDados y mostrarMensaje) y Ius instrucciones swi coh, if ...else e if anidadas, Observe tambien el uso de varias etiquetas case en In instruccion switch para ejecutar las mismus instrucciones para las sumas de 7 y II (lfneas 76 a 80), y para las sumas de 2, 3 y 12 (lfneus 83 u 88). El mecanismo manejador de eventos tambien acnia como una forma de cuntrol del programa, En este programs, el manejo de eventos pcrmite lu rcpeticion controlada por el usuario: cada vez que el usuurio hace clic en Tirar dodos, el programa tira los dudes de nuevo. En el ejercicio 6.46 in, vcstigaremos varias caractcnsilcas lnteresantes del juego de los dudes,

6.9 Alcance de las declaraciones


En los ejemplos anteriores hcmos visto declaracicnes de varias entidades de Java, como clases, metodos, varia, bles y panimetros. Las declaracicnes introducen nombres que pueden usarse para referirse a dichas entidades, Elll/c(lnCe de una declaracion es la porcion del prograrna que puede referirse a una entidad par su nombre. Dichu declaracion se encucntra demro del alcunce para esa porcion del programs. Ell esta secclon ofrecemos una introducci6n a varias cuestiones importantes, relacionadas con el alcance.'? Las reglas basicas de alcance son las siguientes: 1. EI alcance de la declnracion de un parametro es el cucrpo del metodo en cl que aparece la declaracion. (En el capftulo 8 hablaremos sobre los coustructores, que son similares a los mctodos, EI alcance de In declaracion de un pardmetro de constructor es cl cucrpo de esc constructor.) 2. EI alcance de la declaracion de una variable local es a partir del punto en el que la declaracion ,Ipare, ce en el bloque, basta el termino de cse bloquc. 3, EI alcance de una etiqueta en una instruccion break 0 cont i.nue etiquetada (que prcsentarnos en la seccion 5.S) es la insrruccion cncerradn por lu instrucclon etiquetada (es decir, el cucrpo de la ins, trucei6n etiquetuda).

4. El alcance de In declaraci6n de una variable local que nparcce en la scccion de inicializnci6n del cnca,
bezado de una instrucci6n for es el cuerpo de la instruccion for y Ius demus expresiones en el en, cabezado. 5. EJ alcunce de un metodo () campo de una c1asc es el cuerpo completo de la clnse. Esto permite ,t los metados de una clase utilizar nombres simples para Ilamar a otros metodos dec1arados en la clase, 0 heredados por esa clase (como los metodos que nuestras c1ases heredan de la clasc JApplet), y para acceder a los campos declarados en la clasc.l] Cualquier bloquc puede contener declaraciones de variables 0 referencins. Cuando los bloques se anidan. en cl euerpo de un metodo y un identificador declawdo en un bloque externo tiene el mismo nombre que un identificador declarado en un bloque interno, el compiludor genera un error de sintaxis, indicando que la varia, blc yo esta declurada. Si una variable local 0 parametro en un .mctodo tienen eI mismo nombre que un cnmpo, el campo se "oculta" hasta que cl bloque tennina de ejecutarse. Java Iluma a esto sombreado. En el capitulo 8 veremos como tener acceso a los campos sombreados.
12. Veil el d(lcumenla .lava Laflg~age Specijic:lltiUlI, Secdan 6.3: Scope a Dedamtion (java.~un.com/docal books I j1 SIB econd_ edHionl h tml/names •doc. h tml # 1 a 32:1B), Jl"ra oblener 105 dellllles complelas sabre los alcanccs de Jaya. 13. En el capitulo 8 verenlOS que los melodas ~tatic son unn e~ccpcitlll a estu reglu. Jisla es Iii por la COlliulillzumos ra~6n upplets Pili'll crear progntnUl' que COnlCI1~ltnarias declaruciollCS de metodas. Una vez 4\ICpresc()temos los detalles completos v <leercnde las cJllses en los cupiwlus Bu 10, utilizurcmos principalOlenle Ilplicuciones pilra implementur los ejemplos en el resta tlellibro.

El jugador gana. Haga clia en Tirar dados para jugar de nuevo. 5i estadoJuego es igual n GANADO.En In linea 147 se muestra

El jugador pierde. Haga alic en Tirar dadoa para jugar de nuevo, si estadoJuego es igual a PERDIDO. Si cl juego se acnba, cn In linea 149 se asigna el valor true a ia variable primerTiro, indicando que cl siguicnte tiro del dado SCi'll el primer tiro del siguiente jucgo. Despues el programa espera a que el usuario haga clic de nuevo en eI boton Tlror dodos. Cada vez que el usuario oprime esc bat6n, cl metodo actionPerformed llama al metado tirarDados para producir un nuevo valor en sumaDeDados. Si cl tiro actual es la continuaei6n de un juego incompleto, se ejecuta cl eodi, go de las Uncas 102 a Ill. En la linea lO5, si sumaDeDados coneuel'da con miPunto, en la linea 106 se

ur

II. Pronto veremos que hay lTIuchos metodas manejudores de eventos puru los diversos componentes de hi OUJ. Describirelllas varias de estas companelltes de la OU! y los metodos munejudores ue cvenlOS en tos cupfrulos t3 y 14.

212

Melodos , Error corn un de prograrnaclon 6.12


1111

Capfiulo 6

CClprruloo

Melodos

213

~ ~
i

Declarer IIna entidad en 1m bloque illtemo can el mismo nombre que una entidad en me/ado, produce un error de sintaxis.

bloque externo del mismn

Buena practlca de prograrnacion

6.6

m
~

Evite lIti/izar /0.1 mismos nombres para compos y variables locales. El uso de nombres dlferellfe,1 ayuda ala s lee. lares de .I'll programa a distinguir las variable: usadas ell elistlntas partes de la declaracion de IIl1a clase.

A3 A4 45 A6
47 AS

areaSalida.append( "\n\o.'( local en uaart.ocal 8S " despues de entrar a usarLocal" )i


HX;

"

EI upplet de la figura 6.10 demuestra Ius cuestiones relacionadas can el alcance de los campos y Ius variables locales. Esle es nuestro primer ejernplo de un applet que implernenta el metoda start (lfncas 24 a 37). Recuerdc que en la seccion 3.3 vimos que cuando un contenedor de applets carga un applet, primero crea una instancia de lu clase del applet, Dcspues llama a los metodos ini t, start y paint del applet (paint no se utilizu en estc ejcmplo). El metodo start siernpre se dcclara con el encabezado que se muestra en la linea 24. 1
2

areasal Ida.append ( "\nx local en. usart.oca l es " + )( + " daspues de sal ir de usarLocal" )i } I I fin del matcdo usart.oca l I I usarCampo modi fica el campo public void usarCampo () ( areasal
x

A9
50

51
52

53
54 55

de Aleance durance
+ :j:: +

cada llamada

3
4

1/ Fig. 6.10: Alcance.java II Un ejemplo del alcance. import java.awt.Container; import javax.swing.*; public class Alcance extends JApplet { JTextArea areaSalida;

5 6
7

56 57 58
59 60 61

ida.append ( "\11 vneI campo x es " ., al entrar a usarCampo" );

areaSalida. append ( "\nel campo x es " ., al sal lr de usarCampo" );


I I fin el metoda usar'Campo

+ .. + ~

8
9 10

62 63

I / fin de la clase Al cance

11 12 13
14

15
16

II crear GUI del applet public void init()


{

:.:local on US81LocaJe5 25 nespues us emar ausanme! ~IOtaleI1USal~ocales ;odespu6stlesalirde\J<3arLDCal 'etcamnc r es t alenlrarausarCampo elcamnc res 10 "I;:;alirde usarcampo tloeal en usarLocales 25 cespuaa de enlrar a usanocar loeal en usarLotal as ~6 cespuas de sallr de uaartneal

17 18 19 20 21 22 23
24 25

areaSallda = new JTextArea(); Contalner _contenedor = getContentPane(); contenedor .add ( areasa! iela )i /i fin del metcdo ini t
II el metodo start se llama despues de que init terminal start llama a I I los met.odoa usarLocal and usarCampo

:1:

'elc\lITlPoxes 10 itlI,lnlrsr3 usarcampo el r.ampo ~ as 100 ill $311rde uearcampe llocalenstanes5 Subprogramalnlclado.

public void start()


{

26 27 28 29 30 31 32 33 34 35 36 37 38 39
40 41 Figura 6.10

Figura 6.10

Ejemplo del aleanee. (Parts 2 de 2.)

areaSalida. append ( "x local en start es " usarLocal() ;


usar'Campo ( ) ;

x );

II

usarLocal() ;
usarcamoo ( ) i

usarLocal tiene x local II useInstance modifiea el campo x de Alcance II usarLocal inicializa la variable local x II Campo x de Alcance retiene su valor
+

areaSalida. append ( "\n vnx local en start es "


II

x );

fin del metoda start

I I usart.oca crea e inicializa la variable local x durante cada llamada l public void usarLocal()
{

E)emplo del aleanee. (Parte 1 de 2.)

En la linea 11 se declare c inicializa el campo x con 1. Este campo se sombrea (oculta) en cualquier bloque (0 metodo) que declare una variable Hamada x. EI metodo start dec lara una variable local x (linea 26) y la inicializa con 5. EI valor de esta variable se anexa al area de texto areaSalida para mostrur que el campo x esta sombreado en start. EI programa declnra otros dos metodos: usarLocal (lfneas 40 a 50) y uearCampo (hneas 53 a 61), cada uno de los cuales no tiene urgumentos y no devuelve resultados. EI metoda start llama a cada mctodo dos veces (lineus 30 a 33). El metoda usarLocal declura a In variable local x (linea 42). Cuando usarLocal sc llama par primera vez (linea 30), creu la variable local x y la lnicializa con 25 (linea 42), anexa el valor de x II areaSalida (linens 44 y 45). incrementa x (linea 46) y anexa el valor de x a areaSalida otru vez (linea 47). Cuando usarLocal se llama una scgunda vez (linea 32), vuelve a crear la variable local x y la inicializa con 25, de forma que la salida de cada ilnmada a usarLocal es identica, EI metodo usarCampo no declura ninguna variable. POl'It) tanto, cuando huce referenda a In variable x, se utiliza el campo x (linea 11). Cuando el metodo usarCampo se llama por primera vez (linea 31), anexa el valor del campo x u areaSalida (lfneas 55 y 56). multiplica cl campo x por 10 (llnea 57) y anexa el valor del campo x a areaSalida otra vez (linea 58) antes de regresar. La siguiente vez que se llama al metodo

214

Metodos

Capftulo6

copnulo 6

Metodos

215

usarCampo (linea 33), el campo tiene su valor modificudo, 10. Finalmentc, en cl metoda start el prograrna anexael valor de lu variable local x a areaSalida otra vez (linea 35), para mostrar que ninguna de las llamadas al metoda modified a In variable local x de start, ya que todos los metodos hicieron referencia a las variables en otros alcances,

Metoda

Cuando as lIomado Elstametoda y su proposlto

public void stop () Este metoda se llama cuando el upplct debe detener su ejecucion; nermalrnente, cuando el usuario del navegudor sale de 111 p,lginll HTML en la que reside el applet. El rnctodo reallzu todua las tareas requerldas para suspender hi ejecucion del upplet, Las acciones upicas que se reulizun nqui son detener la ejecuclon de Ius nnimaciones y los subprocesos, pullHc void destroy () Este metodo se llama cunndo el applet se va a quitur de memoria; normalmenre, cuando el usuario del navegador sale de lu sesion de navegucion (es decir, cuando cierru todus Ius ventanus del navegudor). El metoda realiza todas las tareas requeridus para destruir los recursos asignados al applet, FIgura 6,11 Metodos JApplet que son Ilamados por el contenedor un opplet, (Parte 2 de 2.) de applets durante 10 eJecucl6n de

6,10 Metodos de 10 close JApplet


Hemos escrito rnuchos applets hasta este punto, pero no hemos huhludo todavia sobre los metodos clave de la clase JApplet que son llamados por el contenedor de applets durante la ejecucion de un applet, La figuruti.l l muestralos metodos clave de la cluse JApplet, especilicu cuandose llaman y cxplicu el proposito de cada uno de elias. Can la excepcion del metoda paint, estos metodos de JApplet son declarados par lu API de Java de tal forma que no hncen nada, a menos que usted proporcione una declaracicn en la clase de su applet, EI metoda pain t original sc usegura de que los gnificosy los componcntes .dc la GUIse muestren correctamente. Si listed dcsea redcfinir uno de estes rnetodos en un upplet, debe utilizar cl encubezado del metodo upropiado, como se muestru en la figura 6.11. De 10 contrario. elcontcnedor de npplets no llarnani a su version del metodo durante la ejecucion del upplct. El proceso de dcclarar los metodos como se describe uquf se conoce como sobrescribir el metoda original; la nueva declaracion del metoda reemplaza a la declaracion hereduda. EI contenedor de npplets Burnard a la version sobrescrita de un metoda para su applet antes de intentar Hamar a Ius versiones prcdeterminadas que hereda de JApplet. EI proceso de sobrescritura de metodos se describe con detalle en el capitulo 9. melotios in! t, start, paint, stop a destroy tie JApplet, lJue 110 concuenle COli el encabezado del metodu correspondiente que se muestra ell lajigura 6.11. se generarti lIIl metodo que IIV sad IIIlJillldo auttmuiticamente durunte la ejecucion del apple;

~ ~:;J::p:::n~~II~:e~I:~'::::::~~':!':~
~

convcniente que Harneill metodo paint directamente. Sin embargo, para llamar a paint debemospasarIe el parametro Graphics que espera. No tenernos un objeto Graphics a nuestra disposicion para pasarlo a paint (ni sabemoscomo crear uno). POI'esta razon, la close JApplet proporciona el metodo repaint. La instruccion
repaint() ;

obticne el objeto Graphics par usted y llama a otro metodo, llamado update, que a su vez llama al metodo paint y le pasa el objeto Graphics. Describirernos detalladamente el metoda repaint en el capitulo 19.

EI metodo repain t tambien es de interes para machos progrumadores de upplets. EI metoda pain t del upplct normulmente es llumudo par el contenedor de applets, L Que pasarfu si usted quisiera cambiar Inuparicncia del applet, en respuesta a las interucciones del usuario can el applet? En dichas sltuaciones, tal vez sea

6.11 Sobrecorgo de rneteoos


Java permite que varies metodos con el rnisrno nombre se decluren en la misma close, siempre y cuando estos metodos tengun distlntos conjuntos de panimetros (los cualcs se dcterminan mediante el mimero y los tipos de los panimetros), Esta tecnica se conoce como sobrecargu de metodos, Cuando se llama a Uti metoda sobrecargado, el compilador de Java selecciona el metodo apropiado examinando el mimero y los tipos de los argurnentos en la Hamada, La sobrecarga de metodos se utiliza conninrnente para crear varies metodos can el mismo nombre que reulizan tureas similares, pero en tipos de datos distintos, La figura 6.12 utiliza el metoda sobrecargudo cuadrado para calcular el cuudrudo de un int y el cuadrudo de un double. ~' Buena practica de programacion 6,7 110 identicas,

Metoda

Cuando es llornedo esta metoda y su propcsilo

public void ini t () Este rnetodo es llamudo una vez por cl contencdor de applets euando se carga un applet para ejecutarse. Llevu 1\ cabo In iniciulizucion de un upplet, Las acciones tipicus que se reulizan aquf son lniciulizar campus, crcar componcntcs de In QUI. cargar los sonidos a reproducir, cargar las inuigenes a mosrrur (vea el capitulo 19) y crear subprocesos (veu el capuulo 16). public void start ( ) Este metodo se llama dcspues de que el metodo ini t termina de ejecutarse. Adcnuis, si el navegador visita otro sitio Web y despues regresa a la pngina de HTML en In que reside el apple(, el metodo start se llama de nuevo. EslC metodo !leva a cabu todas las tareas que deben completarse cuando el applet se cargn pm primeru vez, y que dcben llevurse a cllbo cadn vez que se vuelva a visitar la ptigioa de HTML en la que reside el applet. Las acciones t1picas que se realizan aqui incluyen el empeZUr una animaci6n (vea el capitulo 19) y cmpezar atms subprocesos de ejeeuci6n (vea el capitUlo 16). public void paint ( Graphics g ) Este metodo de dibujo se llama despllcs de que el metoda ini t term ina de ejccutarse y el metoda start ha comenzado. Tumbien se llama cada vez que el applet necesitu volvar a pintarsc. Por ~ieillplo, si el usuurio cubrc el applet con olra ventnnu abierta en la panlalla y despucs descubre el applet, se haec una llnllltlda al metoda paint. Las aceiones tfpicas que se realilnn aqll( incluyen al dibujar con el objeto g lipo Graphics que se pasa al metoda paint mediante el contanedor de applets. Figura 6.11 Metodos JApplet que son lIamados par el contenedor de applets durante 10 eJecuci6n de un applet. (Parte 1 de 2,)

m
~

Sobrecatgar me~odas.que realium 1<1':£1.1estrechumente relacionadas. peru gramas set1ll mas legibles y comprensibles.

puede hacer qlle las pro-

Los metodos sobrecargados se distinguen par sufinna: una combinacion del nombre del metodo, el mimero y tipo de sus parametres. Si el compilador de Java unalizara solamente los nombres de los metodos durante la compilacion, el c6digo de lu tigura 6.12 sena ambiguo; el compilador no sabrfa c6mo distinguir entre los d<)s metodos cuadrado (lineas 22 a 29 y 32 u 39). El compilador utiliza nombres mus largos "dcformados" 0 "decorados", que incluycn eI nombre original del metodo, los tipos de cada par:imetro y el orden exacto de los purfunetros, pam dclerminar si los metodos en una clase son unicos en esa clase. Por ejemplo, en In figura 6.12 cl compiludar podna utilizar cl nombre logico "cuadrado de in!" para el metodo cuadrado que especitica un pnrametro int, y "cuadrado de double" para el metoda cuadrado que especifica un paramctro double. Si la declaraci6n de metodol empieza como
void metodol( int a, float b)

entonees el compilador podrfa utilizm' el nombre 16gieo "metoda! de int y float", Si los parametros se especiliearan como
void metodol( float a, int b )

216

Metodos

Copilulo6

capilUlo 6

Meiodo5

217

1 2 3 4 5 6 7 8 9 10

I I Fig. 6.12: SobrecargaMetodos. java II Usa de metodos sobrecargados import java.awt.Container; import javax , swing. ': public crass sobrecarqejtetodos extends JApplet ( II crear GUI y llamar a cada uno de los metodos cuadrado public void init()
(

2
3
4

II Fig. 6.13: SobrecargaMetados.java II Metodos sobrecargados can firmas identicas.

import javax.8wing.JApplet:

5 public class SobrecargaMetodos extends JApplet ( 6

int return x • x:

11

12 13 14 15 16 17
18 19

JTextArea areaSalida = new JTextArea(); Container contenedor ; getContentPane(l; contenedor.add( areaSalida I;

9 10 11 12 13 14 15 16 17

20

I 1/ fin del metoda init

20

18 19

II

fin de la clase SobrecargaMetodos

21 22 23 24 25 26 27 28

29
30 31 32 33
34

Figura 6.13 Las decloraclones de mstodos sobrecorqodos can IIstas de para metros ldentlcos ocoslo nan errores de complocion

35 36 37 38

39
40 41 ) II fin de la clase SobrecargaHetodos

I
.

entonces el compilador podrfa utilizar el nornbre logico "metoda 1 de float e int''. Observe que el orden de los tipos de los panimetros as importante para el compilador, El compilador considera que los dOHencabezados anteriores de metodol son distintos. Observe que, al hablar sabre los nombres logicos de los metodos utilizados por 01 cornpilador, no rnencionames los tipos de valores de retorno de los metodos, ya que estes no pueden distinguirse en base al tipo de valor de retorno. El programa de la figura 6.13 ilustra los errores de compilador generados cuando dos metodos tienen la rnisrna firma y distintos tipos de valor de retorno. Los metodos sobrecargados pueden tcner distintos valores de retorno, pero deben tener distintas listas de pararnerros. Ademas, los metodos sobrecargados no necesitan tener el mismo mlrnero de punimetros. Error cornu" de prograrnacion 6.14
Declarer metodos sobrecatgados
COIL lis/as identicas de panunettos

es UII error de sill/axis.

Figura 6.12 Declaraclones de rnetodos sobrecorgados.

Los programas que hemos visto hasta ahara se estructuran generalmente como metodos que se llarnan entre SI, en forma disciplinada y jenirquica. Sin embargo, para algunos problemas es necesario hacer que un metoda se llame a Sl rnismo, Un metoda recursivo es un metoda que se llama a sf mismo, ya sen directa 0 indirectamente, a traves de otro metoda. La recursividad es un tema importante que se describe detalladamente en curses de ciencia computucional avunzados, En esta seccion y en la que sigue, presentaremos ejemplos simples de recursividad, En este Iibro incluirnos un analisis extenso sabre la recursividad, En la figura 6.18 (ill final de In seccion 6.14) se sintetizan los ejemplos y ejercicios de recursividad que se incluycn en el libro, Primero considerarernos a la recursividad en forma conceptual. Lucgo examiuarernos diversos programus que contienen metodos recursivos. Las metodologfas recursivas para solucionar problemas tienen una variedad

218 Melodos

Cop~ulo 6

capitulo

Melodos 219

de elementos en cormln, Cuando se llama a un metodo recursivo para solucionar un problema, el metodo es en rcalidad capaz de resolver solo el(los) casots) mas simpleis), 0 casois) base. Si se llama al mctodo con un caso base, el metodo devuelve un resultado, Si el metodo sc llama con un problema mas complejo, el metodo divide el problema en dos piczas concepmales: una pieza que el metodo sahe como resolver (el cuso base) y una pieza que el metodo no sabe como resolver. Para que lu recurslvidud sea factible, la segunda pieza debe asemcjarse al problema original, pero debe ser una version ligeramente mas simple 0 pequefia de el. Como este nuevo problema se ve como el problema original, el metodo llama a una copia nueva de si mismo pura trabajar en el problema mas pequeiio; a este procedimiento se Ie conoce como una llamada recursiva y tambien como el paso de recursividad. Este paso de recursividad normulmente incluye una instruccidn return, yu que su resultndo se combinara con la porcion del problema que el metoda sabia como resolver, pam formur Ull resultado que se pasara de vuelta al metodo que originalrnente hizo la Hamada. EI paso de recursividad se ejecuta mientras la Hamada original ul metodo aiin sigue activo (es decir, mientras no haya terminado de ejccutarse). Adermis, puede producir como resultado muchas llamadas recursivas, a medida que el rnetodo divide cada nuevo subproblcrna en dos piezas conceptuales. Pura que IIIrecursividad termine en cierto memento, cada vez que el metoda se llama a sf mismo con una version llgeramente mas simple del problema original, la secuencia de problemas mas y mas pequefios debe convergir en el caso basco En esc punto, el metoda rcconoce el caso base y devuelve un resultado a la copia anterior del metodo. Se lleva a cabo una secuencia de regresos (mediante instrucciones return) hastu que la llamada al metoda original devuelve el resultado final al metodo que hizo la llamada. Este proceso parece ser complejo, en comparacion con el metoda convencional para solucionar problemas que hernos llevudo a cabo hasta este punto, Caleulos recursivos del factorial Como un ejemplo del funcionumiento de los conceptos de recursividad, escribiremos lin programa recursive para realizar un popular calculo maternatico. Considere el factorial de un entero n no negative, que se escribe como II! y que es el producto de
/I·(1I-1}-{1I-2)· ... ·1

VOlorftnol = 120

devuelve 1

(a) Secuenclo de lIomados recurslvas Figura 6.14 Evaluocl6n recurslva de 51

(b) Valores devueltos de coda lIamada recurslva

1 2 3
4

/1 Fig. 6.15: PruebaPactorial.java


/ I Metoda recursivo para el factorial.

impon

java.awt.·;

5
6

import javax.swing.*; JTextArea areaSalida;

7 public class PruebaFactorial extends JApplet (


8 9
10

I! es igual a 1 yO! se define como 1. Por ejemplo, 5! es el producto de 5·4·3·2· l, que es iguul a [20. EI factorial de lin entero, numero, mayor o igual a 0, puede calcularse iterutivamente (no recursivamente) utilizando la instruccion for de lu siguiente rnunera:
faotorial for = 1; contador >= 1; contador-)

11 12
13 14 15 16

1/ crear GUr y ca Icul.ar public void initl)


(

Eactoriales d~l 0-10

areaSalic!a " new JTextArea

I) ;

( int "oontador = numeror faotorial *= contador;

17
18

Container contenedor _ getContentPane(); ccnt enedor .add ( areaSalida ); // calcular los factoriales de 0 hasta 10 for I long contador

Para Ilegar a una declaracion recursiva del metodo del factorial, podemos observur In siguiente relacion:
nl=II'(1I-1)1

Por ejemplo, 5! es evidentemente igual a 5· 4!, como


5! = 5 ·4·3·2· 5!=5·(4·3·2·1) 5! =5· (41) 1

He

muestra mediante las siguicntes ecuaciones:

19 20 21 22 23 24 25

} II fin del metoda init

La evuluncion de 5! procederfa como se muestra en la Ilgura 6.14. En la figura 6.14(a) se rnuestra como la sucesion de llamudas recursivas procede husta que I! se evahia como I, can 10 cual termina In recursividad, En la figura 6.14(b) se muestran los valores devuehos de cada llumada recursiva ul metoda que hizo la llamada, basta que el valor final se calcula y se devuelvc. La figuru 6.15 utiliza In recursividad para culcular e imprimir los factoriales de los enteros del 0 al 10. El metodo recursive factorial (llneas 26 a 36) evahia primero para determinur si una condicion de terminacion (linea 29) es true. Si numero es menor 0 igual que 1 (el casobase), factorial devuelve 1, no se necesita mas recursividad y el rnetodo regresa. Si numero es mayor que 1, en In linea 34 se expresa el problema como el producto de numero y una llamada recursive a factorial, evaluando el factorial de numero -1, el cual es un problema ligeramente mas simple que el ctilculo original, factorial ( numero ).

26 27
28

29 30
31

32 33 34 35
Figura 6.15 C61culos del factorial con un rnetodo recurslvo. (Parte 1 de 2.)

220

Metodos

Capiiulo6

cap~Ulo 6

Metodos

221

36 37

38

I I fin de la c1ase

PruebaFactorial

Observe que hay dos cases base para el calculo de Fibonacci: 11bonacci(0) se define como O. y tlbonacci(l) se define como 1. EI applet de In figura 6.16 calcula el i'·limo mimero Fibonacci en forma recursiva, utilizando el metoda fibonacci (Ifneas 62 a 72). El applet permite al usuario introducir un entero en un campo de texto, Bl valor introducido indica el i,.'iOio mimero Fibonacci a calcular. Cuando el usuario oprime Intra, el metodo actionPerformed (Iineas 43 a 59) se ejecuta en respuesta al evento de In interfaz de usuario, y llama al metado fibonacci pam calculur ei ruimero Fibonacci especificado. Estos numeros tienden a hacersc grandes nipidaJllent~; par 10 tanto, utilizamos long como el tipo del panimetm el tipo de valor de retorno de fibonacci, y En la figura 6.16, las capturas de pantalla muestran los resultados de calcular varies mimeros Fibonacci. Unu vez mas, el metoda init (lfneas 13 a 40) crea los componentes e la OUIy los adjunta al panel de d contenido del applet. EI administrador de esquemas para el panei de contenido se establece en FlowLayout en In linea 17.

2
3 Figura 6.15 Calculos del factorial can un metoda recursivo. (Parte 2 de 2.)

EI metoda factorial (lfneas 26 a 36) recibe un panimetro de tipo long y dcvuelve un resultado del mismo tipo. Como puede verse en la figura 6.15, los valores de los factoriales se hacen grandes rapidarnente. Seleccionumos cl tipo long (que puede representar enteros relativamente grandes) para que el programu pudiera calcular factoriales mayores de 201 Desafortunadamente, 01rnetodo factorial produce valores grundes tan rapidamente que los valores de los fuctorialcs pronto se exceden del valor maximo que puede alrnacenarsc en una variable long. Debido a las restricciones en los tipos integrales, tal vez serfa necesario utilizar variables de tipo float y double para calcular factoriales de numerus mas grandos. Esta situacion upunta a una debilidad en la mayoria de los lenguajes de programacion: a saber, que los lenguajes no se extienden facilmcnte para enfrentar los requerimientos unicos de varius uplicuciones. Como veremos en el capitulo 9, Java es un lenguajc extensible que nos permite crear enteros nrbitrnriurnente grandes si 10 deseumos. De heche, ~I paquete java .math proporciona las cluses Biglnteger y BigDecimal explfcitarnente para calculus rnatenuiliens de precision urbitraria que no puedcn representarsc can los tipos primitives de Java, ~ Error comun de programacion
~ ~

4 5 6 import javax.swing.*; 7
8

I I Fig. 6.16: PruebaFibonacci. II Metodo recursivo fibonacci. import java.awt.*; import java.awt.event.·;

java

9 10

JLabel numeroEtiqueta, resultadoEtiqueca; JTextField numeroCampo, resultadoCampo; II configurar la GUI del applet public void ini. t ()

11
12

13

14 15
16 17

( I I obt.sner el panel de contenido y establ.ecer Container cont.enedor • getConl:entpane II ; cont.enedor , set.Layout I new Fl owl.ayout; (I I;
su esquema como FlowLayout

18 19
20

6.15

21
22 23

I I crear numeroEtiqueta y adjunt.arl o al panel de contenido nwneroEtiqueta " new JLabell "Escr i ba un entero y opr ima Intro" cont enedcr , add I numeroEtiqueta );
II crear numeroCampo y adjuntarlo al panel numerocampo ; new JTextField ( 10 I; contenedor.addl numeroCampo I; de contenido

I;

Si se amite el caso base" se escribe el paso de recursividad incorrectamente, de manel'a que no converj« ell el ca· so base. se produdrd /lna recursividad infilli/a, 10 que evenlualmente agotara la memoria. Est» error es andlogo ell problema de un cido infillito en Ulia solucuin itera/iva (110 recursivCl).

fua:serie

de Fibonacci, 0, 1, 1,2,3,5,8,13,21, ...

empieza can 0 y 1, Y tiene lu propicdad de que cada mimero subsiguiente de Fibonacci es IIIsuma de los des ruimeros anteriores de Fibonacci. Esta serie ocurre en la naturaleza y, en especial, describe una forma de espiral. La proporcion de mirneros Fibonacci sucesivos converge en un valor constantc de 1.618 .... un numero que ha sido denorninado la proporcion dorada 0 la media dorada, Los humanus tienden a encontrar que la media dorada es esteticnmente placentera. Los arquitectos a mcnudo disefian vcntanas, cuartos y edificios cuya longitud y anchura se encuentrnn dentro de la proporcionde In media dorada, Las tarjetas postalcs se disefian a menudo con una proporci6n tie anchura y altura dentro de la media dorada. La serie de Fibonacci pucde definirse recursivamente, de la siguiente munera:
fibonacci(O) = 0 fibonacci(/) = 1 fibonac:ci(n) = jibllnacci(n-I

24 25 26 27 28 29 30 . 31 32 33 34 35 36 37 38 39 40

II crear

resultadoEtiqueta

y adjuntarlo

al panel

resul tadogt.i queta " new JLabel ( -si valor de Fibonacci contenedor. add ( resultadoEtiqueta I;
numeroCampo, hacerlo no editable II y adjuntarlo al panel de contenido resultadoCampo " new JTextField( 15 I; resultadoCampo.setEditablel false I; contenedor.add( resultadoCampo I;

de contenido as' I;

I I crear

41

II fin del m~tado init

)+jlbolJacci(II-2)

Figura 6.16

Numeros Fibonacci generados con un rnetodo recurslvo. (Parte 1 de 3.)

222

Metodos

Capijulo 6.

capUulo6

Metodos

223

42 43 44 45 46 47 48 49 50 51 52 53 54 55
56

II obtener entrada del usuario y llamar al metoda fibonacci public void actionPerformed( ActionEvent event I

long numero, valorFibonacci;


II obtener entrada del usuario y convertirla en long numero ~ Long.parseLong( numeroCampo.getTextll );

showStatus ( "Calculando ... I;


tt

57 58 59 60
61

/1 indicar que 101procesamiento se comp1etci y moatrar e1 resultado showStatusl "Listo.' ); I; resultadoCampo.setText( 1/ fin del metoda actionPerformed

62 63 64
65

66 67 68 69 70 71 72

73
74
1/

Figura 6.16 Numeros Fibonacci generados can un metoda recurslvo, (Parte 3 de 3.)

fin de la clase pruebaFibonacci

Figura 6.16

Numeros Fibonacci generados con un mstoco recursive, (Parte 2 de 3.)

EI manejo de eventos ell este ejernplo es similar ul manejo de eventos del applet Craps de la figura 6.9. En la lfnea 28 se especiflca que este applet (mediante this) debe cscuchar los eventos del campo de texto numeroCampo. Recuerde que en la seccion 6.8 vimos que In palabra clave this permite al applet referirse a sf mismo. Par 10tanto, en la linea 28 el applet indica a numeroCampo que el applet debe recibir notificucion (mediante una llamuda a su metodo actionPerformed) cuando ocurra lin evento de nccion en el objeto numeroCampo. En este ejemplo, el usuurio oprimc In tecla lntro (Elller) mientras escribe en el objeto numeroCampo para generar el evento de accion. Despues se envia un mensaje al applct (es decir, se llama a un metodo en el applet, en este case actionPerformed) indicnndo que el usuario del programu ha inteructuudo con uno de los componentes de la OU! del programa (numeroCampo). La instruccion para registrar el applet de manera que escuchc los eventos de numeroCampo se compilard solamente si In clase del applet implementa tambien a ActionListener (linea 8). . La Hamada al metoda fibonacci (linea 53) desde actionPerformed no es una Hamada recursiva, pero todas las llamadas subsecuentes a fibonacci que se realizan desde el cuerpo de fibonacci (linea 70) son recursivas, Cada vez que se hace una Hamada a fibonacci, este cvahia lnmcdintamente los casas bases: n igual a 0 0 1. Si esta condicion es verdadera, fibonacci devuelve n: fibonacci (0) es 0 y fibonacci (1) es 1. Curiosamente, sl n es mayor que 1 el paso de recursividad genera dos llamadas recursivas, cada una pam un problema ligeramente mas simple que lu llamada original a fibonacci. En la figura 6.17 se muestra como el metoda fibonacci cvalua fibonacci (3) . En la figura 6.17 se producen ciertas cuestiones interesantes acerca del orden en el que los compiladores de Java evahiun los operandos de los operadores. Este orden es ligeramente distinto nl orden en el que se uplican los operadores a sus opernndos, a saber, el ordcn dicrado par las reglas de preeedencia de los operadores. Con base en In figura 6.17, parece ser que mientras se Cola evaluando fibonacci (3) se hanin dos llamadas

224

Metodos

Capftulo 6

capftulo 6

Metodos 225

\l!:I tiempo requerido para realizer e/ cdlculo. Para estefiu puedc llamar al metodo cur;rentTimeMillis

4\ Trut« de mejorar

Tip para prevenlr errores 6.2


el programa de Fibonacci de la jigura 6.16, de mallei'll que calcule la cantidad aptoximada de de la cluSf /1ystem. el cual no wma urgumento: y devuelve eI tiempo actual de la computadora, ell milisegundos, Llame a este metoda dos veces; ulla vez allies de la llamada a fibonacci y otra vez dtiSPUfS de llamar a este metndo. Guanie coda 11110 de estos valores y culcule la dlferenci« en los tlempos para detetminar auintos millsegundos se necesitaton para reaUzar el cdlculo. Muestre .III resultado.

Figura 6.17 Conjunto de lIamadas recurslvas para fibonacci

(3).

recursivas: fibonacci (2) y fibonacci (1). Pero ~cn que ordcnse hanin estas llamadas? La mayoria de los programadores suponen que los operandos se evaluartin de izquierda a derecha, En Java, esta suposicion es correcta.!" El lenguaje Java especifica que el orden de evaluaclon de los operandos es de izquierda a derecha, Par 10 tanto, las llamadas ul metodo son, de hecho, fibonacci (2) primero y fibonacci (1) despues, ~
'a,·

Buena practica deprogramacion

6.8

'

No escriba expresiones que depcndun del orden de evaiullcitlll de los operandos de Ill! operador EI 11.10de dicho» expresiones a mcnudo produce como resuluuu: programas que .1011dijlci/es de leer, depurut; nwdificar y mantenet:

Hay que tener cui dado can los programus recursivos como el que utilizamos aquf para generar mimeros Fibonacci, Cada invocacion al metodo fibonacci que no concuerda con uno de los casas base (0 0 I) produce des llamadas recursivus mas al metodo fibonacci. Por consecuencia, este conjunto Ilamadas recurs ide vas puede salirse de control nipidamente, Pam calcular el valor 20 de Fibonacci can el progruma de la figura 6.16 se requieren 21,89111amarlas al metodo fibonacci;, para calculnr el valor 30 de Fibonacci se requieren 2,692,537 llumadas al metodo. A rnedida que trate de calcular numeros Fibonacci mas grandes, observara que cada ruimero Fibonacci consecutive que pida al apple I que calcule, produce un considerable aumcnto en tiernpo de calculo y en el mimero de llamadus al metoda f ibonacc i. Por ejemplo, el valor 31 de Fibonacci requiere 4,356,61711umadas, y el valor 32 de Fibonacci requiere 7,049,155I1umadas. Como puede ver, el numero de llamadas a fibonacci se incrementa nipidamente: 1.664,080 llamudas adicionales entre los valores 30y 31 de Fibonacci, y 2,692,538 llarnadas adicionales entre los vnlores 31 y 32 de Fibonacci. La diferencia entre el mimero de llamadas realizadas entre los valores 31 y 32 de Fibonacci es de mas de l.5 veces el numero de llarnadas entre los val ores 30 y 31 de Fibonacci. Los problemas de esta naturaleza humillan hasta a las computadoras mas poderosas del mundo."

En Iussecciones anteriorcs cstudlamos los metodos factorial y fibonacci, que puedcn lmplementarse facilrncnte ya sea en forma recursiva o iterativu. En esta sec cion cnmpararemos las dos metodologfas y veremos cual cs ln vcntaja de que el prograrnador elija una metodologfa en vez de la otra, en cierta situacion particular. Tanto la lteracion como lu rccursividad se basan en una lnstruccion de control: en la iteracion se utiliza una instruccion de repeticion (como for, while 0 do••• while); en la recursividad se utiliza una instruccion de seleccion (como if, if ... else 0 switch). Tanto la lteracion como la recursividad implican la repeticion: en la iteracion se utiliza explfcitamente una instruccion de repeticion; en la recursividad la repeticion se logra mediante llamadas repetidas a los metodos, Tanto la lterucion como lu recursividad implican una prueba de terminaci6n: la iteraci6n termina cuando fulla la condicion de continuacion de ciclo: la recursividad terrnina cuando se reconoce un caso base. La uerncion con repeticion controluda por contador y la recursividad se uproximun poco a poco a lu terminacion: en In iteracion se modifica continuamente un contador basta que asume un valor que hace que Ialle la condicion de continuacion de ciclo: en lu recursividad se contiruian produciendo versiones mas simples del problema original, hasta que se llega al caso base. Tanto lu iteracion como la rccursividad pueden ocurrir infinitamentc: un ciclo jnfinito se produce can la iteracion cuando la prueba de continuacion de ciclo nunca se vuelve fnlsa: la recursividad inflnita OCUITC cuando el paso de recursividad no reduce el problema cada vez en una forma que converju en el caso base. La recursividad tiene muchos puntos en contra. Invoca el mecanisme repetidarnente y, por 10 tanto, hay una sobrecarga de llamadas a los metodos, Esta repeticion puede ser costosa en terminos tanto de tiernpo de procesador, como de espacio en memoria, Cada Hamada recursiva haec que se cree otrn copia del metoda (en realidad solo se creun las variables); este conjunto de copias puede consumir considerabiemente el espucio en memoria, Sin embargo, la iternclon ocurre dentro de lUI metodo, par 10que se evitan las llamadas repetidas a los rnetodos y la asignacion de memoria adicional, Entonces waru que elegir In rccursividad? :, Observaci6n de ingenieria de software 6.8
Cuulquier prolilclllCI que pllede resolverse ell forma rccursiva. tambitJ/I puede resolverse 1m forma iterativa (no I~cltrsil'a). Generalmenu: .Ie pr~tiere IIl1a metodolagfa recursiwi a 111111 uerativa cuando la primera reJI~i(l e! problemu COl/ mas natllralidat/, y se produce till programa mas jiicil de comprender y depurat: A menudo puede implementor se IIna metodologia recursiva CIIII IlIlas cuantus lineas de cudigo, y la metodologia iteraiiva correspondienie podria tequerir de grandes cantidades de codigo. Otra de los razones para elegir Will solucion recursiva es que una solucilin lterativa podna no set uparente.

~todos.

GEvitc

Tip de rendimlento 6.2


los progratnas recursivos estilo Ftbonacci; qlle producen una "explositln" exponenciai de llamadas a

me-

~
""""'1]\\

GEvite IIlilizar /a reeursividud


..

Tip de rendimlento 6.3


('II

situaciolles

en las que Sf! requiem

III!

buen rendimiento. Las lIamadas recUlcyivas

loman tiempo Y cOllsumen memo rio adidonal.

14. Los lenguajes C y Ctt (en los cuules se basan muchas de las caructeristicas de Javu) no especifican 01orden en 01que se evalUlll1 los aperundos de la mayaria de los operadore,. En esos lengulljes, los prugramudores no pocden suponer ninguna informacion acerea del orden en el que 'e ejecutun IIl811umurlasen esle cjemplo. De hecho, las lIamadus podrian ejccutur u fibonacci ( 2 ) primcro y a fibonacci ( 1 ) dcspucs, a las IIllmadas podrian ejccutul'se en cI orden inverso: fibonacci ( 1 ), seguido de fibonacci ( 2 ). En este programa y en la muyoriu de losolro, programas, eI resultado tinnl seria eI mismo en cunl. quier elISa. Pern en algunos programas.la evuluaci(m de un "pemndo puede lIegar a lener efectos secnndnrius que podrinn afeetill' el resullado timll de la operacion. 15. En el campo de la teoria de In cOlOplejidud, los cicntific08 de compuuldol'u estudlan que tan duro lrabajan los nlgorionos pant completar sus till'eus. Las cucstiones de complejidad se analizan detulladamente en UI1 curso profesional de ciencias compulacionales de nivel superior, genernlmente lIamudn "Algoritmos".

Error comiin de programaclon 6.16


Harer que Ill! metodo /10 rccursivo se /lame (I sf mismo ell Janna inadvertida, ya sea direcla ves de atm melado, puede provucar una recursividad injini/o. .
0

indireclamellte a rra·

La mayoria de los Iibros de lexto de pragramacion hablun de Ia recursividadmucho despues de 10 que 10 hemos hecho nos(,Jtros en eSle libra. Nosatros pensamos que la recursividud as un tema tan rico y complejo por 10 tanto, 10 mejor es verla 10 antes posiblc, para <lsiesparcir ejemplos de csle lemu en el resto del libro. En Iu figura 6.18 sa sintetizan los cjemplos y ejercicios de recursividud en asle lex to. Consideraremos nuevamente algunas observaciones que se hacen en forma reiterativa a 10 largo de esle Ii· bro. Es importante tener una buena ingenierfa de s?ftware. En muchos casas, as importante tener un alto ren-

226

Melodos

Capftulo6

capitUlO 6

Malodos

227

Capitulo 6

Elemplos y elerclclos

de recurslvldad

Close Jllevador conductoElevador Fersona Fiso BotonPiso BotonElevador FuertaPiso FuertaElevador 'l'imbre Lu~

Froses verbales Se mueve ul otro piso, llegu a un piso, restablecc cl boton del elevndor, Buena el timbre del clevador, indica Btl lleguda, abrc SI! puerta, cierra su puerta, Apaga la luz, enciende In luz, restublece el boron del piso, Camina en el piso, oprime el boton del plso, oprime el bllton del elevudor, viaju en el elevador, entru al elevudor, sale del elcvador, [Ninguna en el cnunciado del problema] Sollcita el elevudor. Cierra la puerta del elevador, indica al elevudor que vayu ul piso opuesto. Indica a In persona que entre al elevador (al abrirse). Indica a la persona que sulga del elevador (al ubrlrse), abrc lu puerta del piso, cierra lu puerta del piso, [Ninguna en el enunciado del problema.] [Ningunn en el enunciado del problcma.]

Metodo factorial (figura ('.15), Metoda fibonacci (figura 6. 16), Elevar un entero a una potencia entera (ejereicio 6.36), Torres de Hanoi (ejercicio 6.37), Visualizncion tie In recursividad (ejercicio 6.39), Maximo cormin divisor (ejercicio 6.40), LQue huce este metoda'! (ejercicio 6.43), Encontrar el error en el metoda recursivo (ejerclcio 6.45). LQue haee este programa? (ejcreicio 7.16), "Que hace este programa? (ejercicio 7.19), Determinar si una cadena es un pabndromo (ejercicio 7.32), Busquedu lineal (ejereici?7.33), Btisqucdubinuria (ejcrcicio 7.34), Ocho reinas (ejercicia 7-.35), Imprimir uDsarfeglo (ejercicio 7.36), IInp,~mlt un arreglo en orden inverse (ejercicio 7.37), Valor mfnimo en un mcgill (ejercicio 7.38), Quicksort (ejcrcicio 7.39), Recorrido de laberinto (ejerciclo 7.40). .

20

Insercion en drbol binarlo (tigura 20.(7), Rccorrido preorden de un drbol binario (figura 20.17), Recorrido inorden de till drbol binario (figum20.17), Recorrido postorden de un arbol binurio (figum 20.(7), Imprimir una lista cnlazada en orden lnverso (ejcrcicio 20.20), Busqueda en una lista enlazuda (ejcrcicio20.21).

Figura 6.18 Resumen de los ejemplos y ejerciclos de recurslvldad sn ests texto.

Figura 6.19 Frases verba Iss para coda close en el simulador. dirniento. Desafcrtunadamentc, estas metas se contraponen entre sf. La buena ingenierfa de software cs In dave para adrninistrar la tarea de desarrollar sistemas de software mas grandes y complejos. EI alto rendimiento en estes sistemas es la clave para reulizar los sistemas del futuro, que irnpondnin demandas de compute macho mayores en el hardware. i.En donde se ucomodan los rnetodos uqut? clases purticulares en nuestro sistema (figura 6.19). Muchas de las frases nominales de ln figura 6.19 nos nyudan a determinar las operaciones de nuestras clases." . . Para crcar opcraciones, examinamos Ins fruses verbnles enlistadas con cada clase, La frase "se mueve al otro piso'' enlistada con In clase Elevador se refiere a la actividud en In que cl elevador se mueve entre piso y piso. ~La accion "se rnueve" debe ser una operucion de la clase Elevador'l EI elevador decide moverse en respuesta a un boron oprirnido. Un boron indica al elevador que so rnueva, perc el baton no es el que /Ilueve al elevador; por 10tanto, use mueve al otro piso' no corresponde a una operacion. (Incluirernos las operuciones para instruir al elevudor que se rnueva al otro piso mas adelunte, cuando veamos las frases verbales asociadas con los botones.) La Irase "llegu al piso" tampoco es una operacion, ya que el elevador es el que decide CUUIldo llegar al piso despues de viajar cinco segundos. La frase "restablece el boron del elevador" asociuda con la cluse Elevador imp lieu que cl elevador indica al baton del elcvador que se restablezcu. Por 10tanto, In clase BotonElevador necesita una operacion para proporcionar este servicio al elevador, Colocamos csta operacion (restablecerBoton) en el tercer come partirniento de lu clase BotonElevador en nuestro diagruma de clases (figuru 6.20). Para representar las opernciones enlistarnos el nombre de la operacion, seguido de una lista de pardmetros separados por comas entre parentesls, y despues un signa de des puntos scguido pOl'el tipo de valor de retorno; nombrei parametro], pardmetm2, .,,' parametroN ) : tipo de valor de retorno POI'cl memento, la rnayorfa de nuestras operaciones no tienen panimetros, Arin 110 sabemos los tipos de valores de retorno para muchos de los rnetodos, pOl' 10 que los omitiremos en el diagrama. A medida que avancen nuestros procesos de disefio e lmplementacion, agregaremos las listas de parametres apropiadas, junto con los tipos de vulores de retomo. De la frasc "suena eltimbrc del elevndor" eniistnda con In cIase Elevador, podemos concluir que la ciase Timbre debe tencr una operacion que propllrcione un servicio (es decir, timbrar). Enlistamos In operaciou sonarTimbre blljO In c1ase Timbre. AIllegur a un pisa, el elevador Hindica su Ilegada" a Ius puertas. La puerta del elcvador responde ,Ibriendose. Por 10 tanto, la cJase PuertaElevador necesila lIna operaci6n paru ubrirsc. Colocamos la aperaclon abrirPuerta en el tercer compnrtimienlo de esta clase. La frasc "cierrn la puertn [del elevadorJ" indica que la clnse PuertaElevador necesita una operacion para cerrarsc, pOl' 10 que colocamos l'l operacion oerrarPuerta en el mismo compurtimiento,
16. EI iuuilisis verbal es un simple medio para ioentificar compomunienlos. En la industria es comun utillzar metoQos m,ls rigu· rosas, como los prescntos por el Proceso unificado de Rational (RUP).

l~ nil de software, pet» tiene


de dividir
IllS

00 EI proceso

Observacion de ingenieria de software 6.9


programas I'niluidillos de lina mlilwra ordenada y jenirquica fomenu: la buena ingeniee 1111 precio.

Tip de rendimiento 6.4


~ ~ Un pragrama COli tnuchos modulos rcnlt:a un numero potenciulmente grande de llamadas a los metodos, Io cuul COIiSlime tiempo tie ejecllcioll y espucio ell el(los) procestuloties) de IIlla compuuulora. Las nuiquinas virtuale; de lava de la actunlulad son capoces de ellminar IlIlIIayor parte de la sobrew/'gll generadu pOI' las llunuulas a lilt'· todas adicumules de programa.l' Call muchos nuululos.

Use modules en sus programas can rnoderacion, teniendo siempre en mente el delicado balance entre el rendimiento y la buena ingenierfa de software.

6.15(Ej~mpj(,)i:>ractiCci()pcIOnCtI)Acercc:ide v>; ..las,op~raci()ne~ql?lq§ clqsl?s7

losObjE:lfos:C6r1'ioldentificar

En las secciones "Acerca de los objetcs" al final de los capftulos 3, 4 Y 5, realizarnos los prirneros pasos en cl diserio orientado a objetos de IlUestra simulacion de elcvudor. En el capitulo 3 identificarnos las clnses que necesitabamos implementar y creamos nuestro primer diagrama de dases. En el capitulo 4 modelamos los atrie butas de las cluses. En el capitulo 5, exuminnmos el estado de los objetos; adcmlis, modelamos las actividades de los objctos y las transiciones de estndo. En esta sccci6n nos concentrarcmos en deten,ninar las operaciones (0 cOlllportamielllOs) ncccsarias para implemcntar la simulacion del elevador. Una operncion cs un servicio que los objetos de una clase proporcionan a los "clientes" (usuarios) de esos objetos. Considel'c Ius opemciones de algunos objetos del mundo real. Las operaciones de un radioincluyen ~iltstar su estacion y volumen (que son invocados general mente por una persona que ajusta los con troles dell'a· dio). Las opel'Uciones de un auto incluycn acelerar (operacion invocada pOl' el conductor que optime el pedul del acclerudor), dcsacelerar (operacion invocuda pOl' el conductor que oprime el pedal del freno 0 que suelta el pedal del ncelcrador), voltear y cambiar velocidades. Podcmos derivar lIluchus de las operaciones de cada claso directamcnte del enunciado del problema. Para ella, examinamos los verbos y frases verbales en el emmciado. Luego relacionamos cada uno de ellos con las

228

Metodos

Capnulo 6

capRulo 6

Metodos

229

una persona que la puerta se hu abicrto. (La persona cntonces entra 0 sale del elevador.) Colocarnos la operaci6n j;luertaAbierta en cl compartimiento inferior para la clase Persona. Adermis, la PuertaElevador abre y cierra Ia PuertaPiso, por 10que asignamos abrirPuerta y cerrarPuerta ul compartimiento inferior de la clase PuertaPiso. Por ahara no tenemos que preocupamos can los partimetros de las operaciones 0 lOB tipos de valores de retorno; trutnremos de obtener s610 una comprension biisica de las operaciones de cada clase, A medida que continuemos por nuestro proceso de disefio, el numero de operaciones que pertenezcan a cada clase podni variar (tal vez dcscubramos que se necesitan nuevas operadones, 0 que algunas operuciones actuates son innecesarias), y podnumos determinar que algunas de Ins operaciones de nuestras closes necesitan ciertos tipos de valares de retorno espccfficos.

RESUMEN
• La mejor mancra de desarrollur y mantener un programs extenso es dividirlo en vurios modules pcquenns, En Java los modulos se escriben como clases y metodos. • Un metoda es una unidud ejecutable, invocada par la llumada a ese metodo, La llamada ul metoda menciona su nombre y proporciona argumentos entre parcntesis, los cuales son requeridos par el metoda llarnudo para renllzar su tarca, Si el metodo esta siendo llamado 11 un objeto, la Hamada debe ir precedidu por el nombre de una rcfcrencia y un pun to. Si el metoda es static, debe antcponerse elnombre una clase un punta. de y • Cada uno de los argurnentos de un metoda puede ser una constante, una variable
0

una expresion,

• Una variable local se conoce solamentc en el metodo que declare a esa variable. No se permitc a los rnetodos conoccr los detalles de implcmcntacion de nlngiln otro metoda.

Figura 6.20 Closes alrlbulos operaclones. con y

• EI area visual en pantalln para un objeto de la clase JApplet tienc un panel de contenido, a1 cual deben adjuntarse los componentes de la OUI, de manera que puedun mostrarse en tiempo de ejccucion. EI panel de contenido es un objeto de la clase Container que so encuentra en el paquetc java. awt. EI rnetodo getContentpane de JApplet devuelve una refcrcnciu al panel de contenido del applet. • EI formate basico de la dcclaracion de un rnetndo es

La clase ConductoElevador tiene his frases verbales "apagu la luz" y "enciende la luz", par 10 que creamos las operaciones apagarLuz y encenderLuz, y las enlistamns bajo la close Luz. L~ frase "restablece el boron del piso" implica que el elevador indica 01boron del piso que se restablezca, Por 10 tanto, la close BotonPiso necesita una operacion restablecerBoton. La frase "caminu en el piso" enlistadu por la clase Persona no es una cperacion, yo que una persona decide caminar por el piso par su propia iniciativa. Sin embargo, las frases "oprimc el boron del piso" y "oprime el boton del elevador'' son operaciones que corresponden a las cluses de los botones. Por 10 tanto, colocamos la operacion oprimirBoton bajo las cluses BotonPiso y BotonElevador en nuestro dlagrama de clases (figura 6.20i. La frase"viaja en el elevador'' implica que Elevador necesita una operacion que permita a una persona viajar en el elevador, por 10 que colocamos la opcraci6n viaj ar en el compartimiento inferior de Elevador. Las Irases"entra 01 elevador" y "sale del elevador", enlistadas con In clase Persona, sugieren que In clase Elevador necesita operaciones que correspondan a estas acclones." Colocamos las operaciones entrarElevador y salirElevador en el compartimiento inferior de In clase Elevador. La frase "solicita el elevador" enlistada bajo In clase BotonPiso implica que la clase Elevador necesita una operacion Bolici tarElevador. La frnse "indica ul elevador que vaya al piso opuesto" cnlistada can In clase BotonElevador implica que BotonElevador indica a Elevador que se vaya. Por 10 tanto, el Elevador necesita proporcionar un servicio de "partida"; colocarnos una operacion partidaElevador en el compartimiento inferior de Elevador. Las frases enlistadas con las clases PuertaPiso y PuertaElevador mencionan que las puertas (al abrirse) indican a un objeto Persona que entre 0 salga del elevador, Especfficamente, una puerta informa a

tipo-de-vaior-de-retomo nombre-del-metodo;
{ declaracumes e instrucciones

puttimetrul, pardme/IV2, .... pllrcime/roN)

El tipo-de-vator-de-retorno especifica el tlpo de Villar que se devuelvc al metoda que hizo Ia llamada. Si un metoda no devuelve un valor, entonces su tipo-de-valor-de-retomo es void. EI nombre-del-metodo puede ser cualquier identificadar valido, Los panimetros sc dcclaran ell una lista separada por comus (la lista de pardmetros) encerruda entre parentesis, IIIeual declara el tipo y nornbre de cada parametro, Sl un metoda no uceptu ningiin valor, lu lista de parametres debe estar vacia. El cuerpo del metoda es un bloque de declaraciones e instrucciones que constituyen II esc metoda. • Los argumentos que se pusan II un metoda deben concordar en numero, tipo y orden can los panimetros en la declaracion del metoda. • Cuando un programa encuentru In llamada II un metoda, el control se transfiere desde el punta de III invocaci6n hasta el metoda Hamada, el metoda se ejecuta y el control regresa al metodo que hizo III Hamada. Un metoda lIamado puede devolvcr cl control al solicitante en una de tres formus. Si tin metoda tiene tin tipo de valor de retorno void, el control regresa a la llavc dcrechu de terminucien del metodo, a mediante In ejecucion de la instrucciou return; Si el metoda devuelve un valor, In instruccion return expresioll;

17. En este punto s\110podemos adlvinur 10 que estus operaclones hacen. Par ejemplo, tal yez estas operaciones mudelen los elevadores reales, algunos de los cuales tlenen sensores que detectan cuando entran y salon los pasajeros. Por ahara, simplemente enlisturemos esUls opemciones. Mus adelunte descubriremos. en todo cuso. que "ccioncs realizan estas operllcioncs II uledidu que avallcemos por nuestro proceso de disena.

devuelve el valor de la expreskm. , Exlsten tres formes de llamnr a un metoda: usando cl nombre del metoda pOl' sf solo; usando una referencia a un objeto, seguida de un punta ( .) y el nombre del metodo; y usando el nombre de ulla clase, seguido de un punto (, ) y el nombre del metoda. La ultima sintaxis es para metodos static.

230

Metodos

Capffulo 6

capftulo6

Metodos

231

• En muchos casas, los val ores de los argumentos que no corresponden precisumente a los tipos de los purametros en In dcclnrucion del rnetodo se convierten ul tipo upropiudo ames de llurnar al metoda. Esto puede provocar errores de compilacion, si se quebrantan Ius reglas de promocion de Java. • EI metodo Math_random genera un valor double de 0.0 husta, pero sin incluir a, 1.0. Los val orcs producidos Math. random pueden escalurse y dcspluzarse para producir val ores en un rango dado. • Lu ecuacion general para escular y desplazar un numero aleatoric es n = vo!orDespillwmie/l(o
+ ( int

el metoda sahe como realizar; y una version ligeramente mds pequefia del problema original. Como este nuevo problema se ve lguul que el problema original, el metodo haec una llumada recurs iva para trabujur en el problema mas pequefio. • Para que lu recursividad terrrtine, la secuencia de problemas nuis y mas pequenos debe convergir en el caso base, Cuando el metodo reconoce el caso base, el resultado se devuelve a la llamada anterior al metoda, y se origina una secuencia de resultados de vuelta husta la llamadu original, hasta que esta devuelve el resultado original. • 811116todo in~ t de un upplct se llama una vez por el contcnedor de applets, cuundo se curga un applet pura ejeeurarse. Ilste 1l1et0l1olIeva a cabo la inlciallzacion de un applct. EI metoda start del npplet se llumu despues de que el metodo ini t terrnlnu de ejecutarse, y carla vcz que el usuurio del navegador regresa a la puglna de HTML en la que reside el up" plet (dCSpllCSde navegur en otra pagiun de HTML). • E1111elodo paint de un applet se llama despues de que 01 metoda start applet, Tambien So llama cuda vez que el applet nceesitu volver a pintarse, ha empezado a ejecutarse, para dibujar en cl cuando el usuurio

por

) ( llIath.random()

* jac(orSscaia

)I

• Una clase puede heredar los atributos y comportamientos (campos y metodos) exlstentes de otra cluse que se especiflque a lu dcrecha de lu palabra clave extends en IIIdeclaracion de lu clase, Adenuis, una cluse puede lmplementnr una a Olds interfuces, Una interfaz especifica uno 0 mas metodos que se deben declarar en la cluse implementadoru. • La interfaz ActionListener mucstra a continuaci6n: public especifica que una clase debe implemcntar ActionEvent
U

un metodo con la primera linea que se )

void actionPerformed(

actionEvent

• E1111ctodo stop de un upplet se llama cuando eI applet debe suspender su ejccucion; gcneralmente, delnavegador sale de lu pagina de HTML en In que reside cl applct.

• EI metoda actionPerformed procesa lu imeraccion de un usuurio con un componente de lu aUI que genera un evento de accion, EI metoda He llama en respuesta a In lnteruccion del usuario, A este proceso se Ie conoce como munejo de eventos. EI metodo actionPerformed es un munejador de eventos, Este estilo de programacion se conoce como programacion controluda por cventos. • La pulabra clave final declara variables constantes, que deben inicializurse una vcz antes de utilizarse en un programa, Las variables constantes tambien sc conocen como constantcs, constantes con nombre 0 variables de s610 lccturn. • Un objeto de Ia clase JLabel contlcne una cudcna de caractcres que se van a mostrar en lu pantalla. Par 10 general, un objeto JLabel indica el proposiro de otro clemente de la QUr en lu pantalla, • Los objetos de la cluse JTextField obticnen informacion del usuario
0

• EI mctouo destroy de un applet sc llama cuundo cl applet se va a quitar de la memoria: gcnernlmentc, cuando el usuurio del navcgador sale de In sesi6n de navegucion. • EI metoda repaint puedc llamnrsc en un applet para ocasicnur una llarnudu nueva a paint. EI metoda repaint llama a otro metodo, de nombre update. y le pasa el objeto Graphics. EI metodo update llama al rnetodo paint y Ie rasa cl objeto Graphics. • La sobrccargu de metodos ocurrc cuuudo los metodos tienen el mismo nombre, pero distintas listas de parametres, Cunndo se rculiza una llamuda a un metodo sobrecargudo, cl compllador selecclonu 01 metodo upropiado cxaminundo los nrgumentos en lu llumada. Los mctodos sobrecurgudos deben tener listas de paramctros distintus.

muestran informacion en la pantalln. ' responde realizundo una tureu.

• Cuundo el usuario oprime un objeto JButton, 01 programn generalmentc

TERMINOLOGfA
ActionEvent, cluse ActipnListener, interfuz l\ctionPer~ormed, metou() de lIctionListener alcance API de Java (bibliotecu de cluses de Java) urgumento en la lIamada a un metodo bloque caso base en la rccursividnd clase coercion de argumentos constunte constante con nombre copiu de un valor declaraciun de un metodo desplnzar destroy, metoda de la chlse JApplet devolver divide y vcnceras c1cmento de UZilr escalill' e~presi<ln de tipo mixto Unal firma firmll de un 1I1ctodo FlowLayout, c1ase genera cion de numerus alentorios ingeniena de software ini t, metodo de la cluse JApplet intcrfaz invocar a un metodo iterucion JBut ton, c1ase JLabel, clasc JTextField lIamadu a un metodo lIamudu recursiva lIamar a un metoda Math, clusc Math.E Math.PI Math. random, metoda metoda metoda definido (lor el progrmnador metoda tilctorinl metoda lIamado metodo que haee la lIumada (salicitantei metodo recnrsivo paint, miltorio de la c1asc JApplet pardmctro en In dcclarncion de un metoda puso de recurslvidad prograrna modular progrumnclon controladu por eventos recursividad reglas de prornocion repaint, metoda de lu clase JApplet reutilizacion de software setLayout, metoda de la c1ase JApplet showStatus, metoda de la c1ase JApplet simuluci6n sobrecarga de un metoda start, metoda de III c1ase JApplet stop, mctouo de la c1use JApplet this tipa de valor de retorno dpos de referencias update, metoda de la c1ase JAJ;lplet vuriable constante vuriable de solo leumru vuriable local void

• EI metoda setLayout de In clase Container especifica cl ndministrador de csquemas para In interfuz de usuario del upplet. Los administrudores de esqucmas se proporcionan para ordcnur los compnnentes de la QUI en un objeto Container. puru presernurlos cn lu puntallu. En un esquema FlowLayout, los componentes de In aUI sc colocan en un objeto Container de izquierdu a dcrecha en el orden en cl que se adjunuron al objeto Container con el metodo add. Cuando se llegu al borde del contenedor, los componentes deben continuarse en In siguiente lfneu, • Antes de poder procesar cuulquier evento, cuda componente de III GUI debe saber emil es el nbjcto en el programa que contiene el metoda manejudor de eventos que se llumani cuundo ocurra un evento. EI metoda addActionLiatener se utilizu para registrar un evento para un objeto JButton 0 JTextField. Para responder a un evento de aeddn, una cluse debe implementur a ActionListener y·ul metouo actionPerformed. • EI metoda showStatus muestra una cadena cn labarra de estado del ct)l1tenedor de applets. • EI illcance de una decluracion cs In pordon de un progruma que puede hucer referencia a lu cntidlld en III dec!uraci6n, par su nombre. • EI a!cance de In dednraci6n de un parametro os el ouerpo del metoda en el que uparecc IIIdeclaracion. en el bloque, hasta

• EI aicance de la declaraci6n de una variable local cs desde el punto en eI que aparcce la dcdnraci6n ellinal de esc bloque.

• EI alcance de una etiqucta cn una instruccion break 0 continue etiquctada cs In instrucci6n cnccrrada por hi ins truccion etiquetada (es oecir, cl cucrpa de la instruccion ctiquctadn). • EI a!cnnce de In dcdaruci6n de una VIlriuble local que ilpareee cn la secdon de inicializucidn del encabezlldo de unll inslrllccion for es el cuerpo de la instruccion for y Ius dCl11uScxprcsiones en el cncabezado. • EI a!canee de un metodo () campo de una clase es todo el cuerpo de In c1use. Esto pcrmite a los mctotlas de una c1use utilizur nombres simples para lIamar a Ius demas metouos declamdos en Iii c1aso 0 heredlldas por esu c1ase, y les pennite tum bien utiliznr los campus declarados cn la c1use. • Un metodo recllrsivo es un metoda que se llama a sf misITlo, ya sea directa () indlrectamenle. • Si un metoda recllrsivo es lIamado con un casu buse. el metodo devuclve inmediat~mente un resultado. SI cI metoda es lIamado con un problema mas complejo, cl metoda divide eI problema en dos 0 mih; piezas conceptuaies: una piezll que

232

Melodos

Cap~ulo6 .

capuulo 6

Melodos

233

EJERCICIOS DE AUTOEVALUACION
6.1
Complete las siguientes oraciones: a) Un metoda se invoca con unru) _ b) A una variable que se conoce solo dentro del metoda en el que csui declarada, se le llama _ c) La instruccion en un metodo llamado puede usurae pura pasar el valor de una exprcsion, de vuelta III metoda que hizo la llamada, d) La palubra clave indica que un metoda no dovuelve niugtin valor. e) EI de una declaracion es In pnrcion de un programs que puede hacer referenda a la entklud en la declaracion, por su nombre, f) Lilli tres Iormas de regresar el control de un metoda llamado a un solicitante SOli Y g) El metoda se llama una vez cuando un upplet empieza II ejecuturse, h) EI metoda produce mimeros aleatorics. i) EI metoda se llama cada vez que cl usuario de un navegudor vuelve a visltar IIIpaginu de HTML en la que reside el upplct. j) EI metoda so invoca puru dibujar en un upplet, k) El metodo invoca al mctoda update de un applet, el cuul a su vez lnvoca al metoda paint del applet, I) EI metoda se invoca para un applet cada vez que el usuario de un nuvcgudor sale de una paginu de HTML en la que reside el applet. m) Un metoda que se llama a si mismo, yo sea directa 0 indirectamente, es un metoda _ n) Un metodo recursive generalmente tiene dos componcnres: uno que proporciona el media para que termine In recursividad, evaluando un caso , Y uno que expresa el problema como una llumada recursiva para un problema ligcramente mas simple que cl de la Hamada original. 0) En Java. es posiblc tener varies metodos can el mismo nombrc, en los que cada uno opera distintos tipos a mimeres tic argumentos, Esta caructeristica se conoce como de mctodos. p) EI modiflcador se utiliza para declarar variables constantes. 6.2 Para el siguicnte progrumu, indiquc cl alcance de cada una de Ius siguientes entidudes: a) La variable x. b) La variable y. c) El metoda cube, d) El rnetodo paint. e) La variable yPaa.

a) El metoda hipotenuaa. que toma dos argumentos de punta tlotante can doble precision, llamados ladol y lado2, y que devuelve un resultudo de punto flotante, con doble precision. b) El metoda meaor, que toma tres enteros x, y y z. y devuelve un entero, c) EI metoda instrucciones. que no toma urgumentos y no devuelve ningun valor. (Nota: Estes metodos se utilizan cnrminmente para mostrar instrucciones a un usuurio.) d) El metoda intAFloat, que toma un argumento entero llamudo numero y devuelve un resultado de punto flotnntc, 6.5 Enouentre el error en cada uno de los aiguicntes segmentos de prognnnas. Explique como sa puede corregir eJ error.

IIi Int

g{) (

aystem.out.println( "Dentro del metodo g" ); int h{) { Syatem.out.println( "Dentro del metoda h"l;

b) int

suma( int x, int y I ( int resultado; resultado ; x + y;


suma ( int

c) int

if else

n) ( n "'~ 0 ) t'eturn 0; n + suma( n - 1 I;

d) void

f ( float a ); float a; System.out.println{

a I;

e) void produato () ( int a • 6, b = 5, c '" 4, reaultado; resultado ; a • b • c; System.out.println( "El resultado es " + resultado return resultado; 6.6

);

1
2 3 4 5
6

public class int XI public

PruebaCubo extends

JApplet

Escriba un applet complete en Java que pidu al usuario el radio tipo double de una esfcra, y que llarne al metoda volumenEsfera puru calcular y mostrur el volurnen de esa esfcra, urilizundo la asignucion volumen

=(

4.0 / 3.0 I • Math.PI • Math.pow ( radio,


UII

3)

void paint{

Graphics

gI

EI usuario debe introducir el radio mediante

objeto JTextField.

{
int yPos = 25; for ( x = 1; x <= 10; XH I ( g.drawString( cuba ( x ), 25, yPos +=15;

7
8

RESPUESTAS A LOS EJERCICIOS DE AUTOEVALUACION


6.1 yPos I; 6.2 6.3
a) Llamada a un metoda.

9 10 11 12
13 14 publIc

expresion; j) paint.

h) Variable local. c) return. d) void. e) Alcancc, I) t'eturn; return encontrar In llave derccha de cierre de un metoda. g) init. h) Math. random. i) start. k) repaint. I) stop. m) Recursive. n) Base. 0) Sobrecarga. p) final. d) El

a) El cuerpo de la clase. b) El bloque que define el cuerpo del metoda cuba. c) El cuerpo de lu clase, cuerpo de IIIclase, c) EI bloquc que define el cuerpo del metoda paint. La siguiente soluciou demuestra el uso de los mctodos de In clase Math de III figuru 6.2:

Int

cuba ( int y

15 16 17 18
6.3 6.4

(
return

y • y;

1 2 3
4

1/ Ejercicio 6.3: Pru~baMath.java 1/ Prueba de los metodos de la clase public class Pruebahath {

Math.

Eseriba una aplicacion que pruebe si los ejemplos de las ilamudas u los metodos de la biblioteca de matematicas mostradas en In figura 6.2 realmente produccn 108 resultados indlcados. Proporcione cl encabezado para cada uno de los siguientes rnetodos:

5 6 7 8

puhl i c static
{

void main ( String


"Math.abs(

!Jxgs [1 23.7
, t

System.out.println(

Math.abal

23.7

I;

234 Meledes

Copfiule 6 6.4
u) double hipotenuea ( double ladol, double b) int manor ( int x, int y, int z I cJ void instrucciones() d) float intoFloat ( int numero I

Meledos
lado2 )

235

9 10 11 12 13 14 15 16 18 19 20 21 22

17

23

24 25 26 27 28 29 30
31

32 33 34 35 36 38 40 41

37 39
//

System.out.println( "Math.abs( 0.0 I - " + Math.abs( 0.0 I I; syatem.out ipr int ln t "Math.abs( -23.7 I - "> Math.abs( -23.7 I I; Systeln.Dut.println( "Math. ceil ( 9.2 I - " + Hath.ceil( 9.2 I I; System.out.println( "Math.ceil( -9.8 I "+ Math.ceil( -9.B I I; System.Dut.println( "Math.cDs( 0.0 + Math.cos( 0.0 I I; Sys t.ern.ou t pr i.nt.In t "Math.exp( 1.0 ) Math.exp( 1.0 I I; System.out,println( "Math.Bxp( 2.0 It Math.exp( 2.0 I I; syatem.out pr int lnj "Math. floor ( 9.2 I "+ Math.floor( 9.2 I I; System.out.println( "Math. floor ( -9.8 I + Math. floor ( -9.8 ) I; System.out.println( "Math.log( Math.E -" + Math.log( Math.E I I; System.out.pl"intln( "Math.log( Math.E • Math.E 11ath.log( l1ath.E * Math.E I I; System.out.println( "11ath.max( 2.3, 12.7 I Hath.max( 2.3, 12.7 ) I; System.out.println( "Math.max( -2.3, -12.7 Math.max( -2.3, -12.7 I I; System.out.println( "Hath.min( 2.3, 12.7 ) Hath.min( 2.3, 12.7 I ); System.out.println( "Math.min( -2.3, -12.7 Math.min( -2.3, -12.7 ) I; System. out .pr irit l n ( "Math.povl( 2. 0, 7.0 Hath. pow ( 2.0, 7.0 I I; System.out.println( "Math.pow( 9.0, 0.5 Math.pow! 9.0, 0.5 ) I; System.out.println( "Math.sin( 0.0 I - " + Math.sin( 0.0 I I; System.out.println( "Math.sql:t( 900.0 I " " + Math.sqrt( 900.0 I; System.out.println( "Math.sqrt( 9.0 I • " + Hath.sqrt( 9,0 I ) i System.out.pl'intln( "Math.tan( 0.0 I ; " + Math.tan( 0.0 I I;
i i

6.5

u) Error: el merodo h eSl4 declarado dcntro del metoda g. Correccion: mueva In declurncion de h fuera de la declaracion de g. b) EITOr: se supone que el metodo debe devolver un entero, pCI'O no es asf. Correccion: elimine la variable ~esul tado, y coloque la instrucclon return x + YI en el metodo, 0 agregue In siguiente instruccion al final del cuerpo del metodo: return resultadol c) Err~r: este metodo recursive no devuelve el resuhado de n + Burna ( n - 1 ), 10 que produce un error de sin" taxis, Correccidn; modlfique hI instruccion en In clausula else para que quede como return n + suma( n - 1 II d) Error: el punto y coma que va despue; del parcntcsis de In lista de parametros est,! incorrecto y cl panirnetro a no debe volver a declurarse en el metoda. . Correccion. elimine el punto y cornu que va despues del parentesis derecho de lu lista de punimetros y elimine In decluracion float ar. ' e) EITor: el metodo devuelve un valor cuando no debe hacerlo. Correccion; camble el tipo de valor de retorno de void a into La slguiente solucion cal cui a el volumen de una esfera, utilizundo el radio introducido por 01 usuario: 1 /1 Ejercicio 6.6: PruebaEseera.java / I Calcula el vo lumen de una esfera , import java .awt;.·; Import; java. awt. event. * ; import iavax.swiQ'J.*; JApplet implements ActionListener (

6.6 2 3 4 5 6
7

II fin

fin

de main PruebaMach

de la clase

8 public class pruebaEsEera extends 9 JLabel indicadOl"Etiqueta; 10 JTextpield entradaCampo; 11 12 1/ crear GUI
13 publ ic void ini t
{

14 15 16 18 19 20 21 22 23
24

(I

17

Containe.r cont.enedor = getContentPane (I; ccnt.enedcr . setLayout ( new FlowLayout (I I; indicadorEtiqueta _ new JLabel( "Escriba entradaCampo = new JTextField( 10 I; entradaCampo.addActionLiatener( this Ii contenedor.add( indicadorEtiqueta I; contenedor.add( entradaCampo ); el radio de la esfera: " I;

25 26 27 28 29 30

I I fin del metcdo init I I caLcul ar el volumen de la esfera


entradaCampo public void actionPerformed(
{

cuanda

al usuario )

oprima

Intra

en

ActionEvent

actionEvent

31
32

double radio • Douhl e ,parseDouble showstatus ( 'El

( actionEvent.

getActionCommand () I; I );

volumen ea " + vol.umenltarera ( radio

236

Metodos

Capijulo 6

capftulo 6

Metodos

237

33 34

) / / fIn del metoda action~erformed

35
36

37 38 39

II calcu1ar y devolver 81 va lumen de la esfera public double volumenEsfera ( double radio I


(

double volumen = ( 4.0 / 3.0 return volumen;

I * Math.PI

'Math.pow(

radio"

3 I;

a) redondearAIntegar ( numero ) b) redondearADecimaa ( numero ) c) redondearACenteaimae( numero d) redondearA1lileB~maB ( numero ) Paru cuda valor lefdo, su progrnma debe mostrar el valor original, el numero redondeado al entcro rruis cere ano, el numero redoudeado a la decirna mils cercana, el mimero redondeado a In centesimu Inas cercana y el mimero redondeado u III mllesima mas ccrcana, 6.11 Responda a cada una de Ius siguientes preguntas: a) LQue significa elegir numerus "al aznr"? b) I,Por que es el metoda Math. random util para sirnular juegos al uzar? c) l.1'or que es a menudo necesario escalar a desplazar los valores producidos por Math. random'! d) &Por que es In simulucidn computurizadn de Ius situaciones reules una tecnica titil? Escriba instrucciones que usigncn entcros nleatorios a lu variable
a) I :5n:s2
/I

40
41

42
43 44 45
/ / fin del met.odo esferaVolumen / / fin de 1a class ~ruebaEsfera 6.12

en los siguientes ranges:

b) 1:5 n :s 100 0:5 n :s 9 d) 1000:511 $1112 e) -I :511$1 t) -3:5 n s 11


c)

6.13

Para cuda uno de los sigulentes conjuntos de enterns, escriba una sola insnuccion que imprima un mimero al aznr del conjunto: ill 2, 4, 6, 8, 10,

EJERCICIOS
6.7
Leudl a) x h) x c) x ~x ~) x es el valor de x despues de que se cjecutu cada una de las siguientes instrucclones? = Math.abs( 7.5 I; • Math. floor ( 7.5 ); • Math.abs( 0.0 ); • Math.ceil( 0.0 ); • Math.abs( -6.4 )1 t) x • Math.ceil( -6.4 ); g) x • Math.ceil( -Math.abs( -8 + Math.floor( -5.5 ) ) ); 6.14

b) 3,5, 7. 9, II.
c) 6, 10, 14, 18,22.

Escriba un metoda llamado enteroPotencia

( base,

exponente

) qu~ dcvuclva el valor de

6.8

Un estacionarniento cobra una cuota mfnirnu de $2.00 por cstacionarsc husta tres horns. EI estacionamiento cobra $0.50 adicionules por cada hora 0 [mccion que se pase de tres horus, EI cargo maximo para cualquier periodo dado de 24 horas es de $\0,00. Suponga que ningun auto se estaciona durante mas de 24 horus a Ia vez. Escriba un upplet qlJe calcule y rnuestre los cargos por estacionamiento para cada cllcntc que se haya cstacionado ayer. Debe lntroducir en un objeto JTextField las horns de estacionarnicnto para cada cliente, EI programa debe mostrar 01cargo para cl cliente actual y debe calcular y mostrar el total corriente de los recibos de ayer, EI programs debe utilizer el metoda calcularCarges para determinar el cargo para cada cliente. Una uplicacion del metoda Math. floor
y

PoreJemplo, enteropotencia ( 3, 4 ) calcuhl3l (0 3 • 3 • 3 * 3 ). Suponga que exponents es un entero positive distinto de cero y que base es un cntero, EI metodo enteroPotencia debe utillzar un ciclo for a while para controlar e! ciilculo. No utillce ningun metodo de la biblloteca de matemntlcas, Incorpore este metodo en un applet que lea valores enteros para base y exponent.a mediante objetos JTextF~ ald. y que reullce el calculo con el rnetodo enteroPotencia. (Nota: Rcglstre e! munejo de eventos s610 para cl segundo objeto JTeztField, EI usuario debe intcracruar con el progrurnu escribiendo numerus en ambos objetos JTextField, peru oprimiendo lntro solamente en el segundo objeto JTextField.) 6.15 Dclina un metoda llumado hipotenusa que calcule In longitud de In hlpntenusa de un triangulo recto, cuundo se proporcioncn Ius longitudesde los otros dos lades, (Utllice los datos de ejemplo de la figura 6.21.) EI metoda debc tomar dos argumentos de tipo double y devolvcr IIIhipotcnusa como un valor double, Incorpnre estc metodo en un applet que lea los valorcs para ladol y lado2 mediante objetos JTextField, y que malice el calcu10 con el metoda hipotenusa. Determine III longitud de la hipotenusa para cada uno de los truingulos de In figura 6.21. (Nota: Registre el manejo de eventos solo para el segundo objeto JTelttField, EI usuario debe interactuar con el programa escribiendo rnimeros en ambos objetos JTextField, pero oprimicndo Ill/IV solamentc en el segundo objeto JTextField.) Escriba un metodo llamado mul tiple que determine, para un par de enteros, si el segundo entcro es rmlltiplo del primero. EI metodo debe tomar dos urgumentos enteros y devolvcr true si cl segundo es multiple del primero, y false en casu contrario. Incorpore este metodu en un applet que reciba como entrada una seric de pares de en-

6.9

es redondear un valor al siguiente entero. La instruccion

Math. floor

( x + 0.5 ); 6.16

rcdondea el numero x al entero mas ccrcano y asigna el resultado a y. Escriba un applet que lea valores double y que utilice In instruccion anterior para redondcar cada uno de los mimeros a su entero mas cercano, Para cuda mlrnero procesado, muestre tanto 01 ruimero original como el redondendo. 6.10 Math. floor puede utilizarsc para redondenr un rnimero hasta un lugur decimal especffico, La lnstruccion ( x * 10 +

y = Math. floor

a.s )

I 10;

Triangulo

Lode 1 3.0

Lado2 4.0 12.0 15.0

redondeu x en la posicion de las ddcimaa (es dccir, lu primera posicion a In derecha del punto decimal), La lnstrucclon y

!>lath. floor

(x

100 + 0.5 ) / 100;

5,0 8.0

redoudea x en lu posicion de lns centcsimns (es decir, la segundu posicion a la derccha del pumo decimal), Escribu un upplct que definu cuatro metodos paru redondear un numero x en varlas formus:

Figura 6.21 Valores para los lodes de los trl6ngulos del eJerclclo 6,15,

238

Metodos

Capuulo6

Capnulo 6
[Nora: Estc upplet requerini dos objetos JTextllield

Metodos

239

teras (un par a lu vez, usundo objctos JTextField). (Nula: Rcgistre el mnnejo de eventos solo para el segundo objcto JTextField. EI usuario debe interactuar can el programn escribiendo numerus en ambos objctos JTextField. pero oprimiendo Intra solamente en el segundo objeto JTextField.) 6.17 Escriba un metoda llamudo esPar que utillce el opcrador residue (%) para determinur si un cntero dado es par. EI metoda debe tomnr un urgumento entero y devolver true si el entero es pur. y false en O;ISO contrurlo. Incor, pore este rnetodo en un upplet que reciba como entrada una sccuencia de enteros (uno a la vez, utiliznndo un objeto JTextField). Escriba un metoda llamudo cuadradoDeAsteri scos que muestrc un cuadrudo relleno (el mismo ruirnero de filus y columnus) de asteriscos clIyo lado sea espccificado en el pnnimctro entero lado. Por ejernplo, si Lado es 4. el metoda debe mostrnr cl patron de asteriscos que se muestru a contlnuacion.

que tengan eventos de nccian registrados, Cuundo se llama a actionPerfo:rmed. el purtimetro ActionEvent cuentu con cl metoda getSource ( ) para deterrninur can emil componente de In GUI lmeractue el usuurio. Su metoda actionPerformed debe contener una instruccion if ... else de la forma if ( actionEvent.getsource() II procesar le interacci6n

==

entradal ) { de entradal aqui

6.18

els9

( II actionEvent.getsource() entrada2 II procesar la interacci6n de entrada2 aqui

.=

* •••
*.,,** *.;\0*
**'11* Incorpore este metodo en un upplet que reciba como entrada par parte del usuario un valor enteropara Lade, y que realice el dibujo con cl metoda clladradoDeAate:riscos. Observe que cstc metodo debe llnmursc desde el metodo paint del applct, y que debe rceibir el objeto Graphics de paint. 6.19 Modifiquc el metoda creado en el ejercicio 6.18 para formur cl cuadrado de cualquier cunicter que estc contcnldo en 01 panimetro tipo canicter caracterRelleno. Por cjernplo, si lado es 5 y caracterRelleno cs "#", el metoda debe imprimir ##### ##### ###11# ##### ##### 6.2Q 6.21 Escriba un applet que utilice un metodo llnrnndo circuloA:rea, que pida al usuurio el radio de lin ctrculo y calcule e imprima el area de esc cfrculo,
qUG

en donde entradal y entrada2 son referencias a objetos JTextField.j 6.24 Escribn un metoda llamudo minimo3 que devuelva el menor de tres numeros de punta flotanre, Use cI metodo Math.min pura irnplerncntar minimo3. lncorpore el metoda en un upplet que recibu como entrada los valores par parte del usuurio, y determine el valor menor, Muestre el resultado en In barra de estudo. Se dice que un mirnero entero es lin mimera petfecu: sl SIIS fuctorcs, incluyendo I (pero no el mlmero entero), al sumurse dan como resultado cl mimcro entero. Por ejernplo, 6 es un mimero perfecto ya que 6 = I + 2 + 3. Escriba un metoda llamudo perfecto que determine si cl panimetro numaro es un numero perfecto. Use este metodo en un npplet que determine y mucstre todos los numeros perfectos entre I y 1000. Imprima los factures de cada nilmero perfecto para confirmar que el numero sea reulrncnte perfecto. Ponga a prueba el poder de su computadora, cvaluando mimeros mas grandes que 1000. Muestre los resultados en un objeto JTextA:rea que tonga funcionalidud de desplazamienro. So dice que lin entero as primo si puedc dividirse solamerne por I y pOI' sf mismo, Por ejemplo, 2, 3. 5 y 7 son primos, pera 4. 6. 8 Y 9 no. a) Escriba un metoda que determine sl lin nurnero es prime. bJ Use este metodo en till upplet que determine e irnprima todos los mimeros primos mcnorcs que 10,000. ;,ClItlntos mimcros hasta 10.000 tiene que probnr para uscgurarse de encontrur todos los primos? Muestre los resultados en un objeto JTextArea que tenga funeionalidud de dcsplazamiento. c) Al principio podriu pensarse que 11/2 as cl lfmite superior para evaluar si un ruimero es prime, pero 10 maximo que se necesitu es hastu Iu rafz cundradu de II. ;,Por que'! Vuelva a.escribir el programu y ejecutelo de ambas formas, Ruga una estimuclon de In mejom en rendimiento. Escrlbu un metodo que tome un valor entcro y dcvuelvn cl mimcro can sus digitus invertidus, Por ejcmplo, pam el mimero 7631, el metoda debe regresur 1367. Incorpore el metoda en un upplct que recibn como entrada UII valor del usuurio. Muestre el resultado tie esc metodo en III bUlTU de estudo. E1l/uitimo cOllllin divisor (MeD) de dos cnteros es el entero mas grande que puede dividir a cada uno de los dos mimeros, Escribu un metodo llumudo mcdque dcvuelva 01 maximo conuin divisor de dos enteros. Incorpore el metodu en lin applet que rccibu COl1l0entrada des valores del usuario. Muestrc 01 resultudo del mctodo en It! barru de estado, Escriba un metoda llamadu puntosCalidad que recibu como entrada 01 promedio de un estudiunte y devuelva 4 si el promedio se encucntm entre 90 y 100, 3 si el promedio sc eneuentra entre 80 y 89, 2 si cl promedio se cncucntra entre 70 y 79. 1 si 01 promodio se cnetlentra entre 60 y 69, Y a si el promedio es menor de 60. Incorpore clmetodo en un applet que reciba eOlllo entrada un valor del usuario. Muestrc el resultudo del metodo en In barm dc dcsplazamicnto. Escriblilln applet que simule e1Ianzumicnto de monedas. Deje que el programa lunce una moneda cada vcz que el usuario oprima 01 buton "Lanzar". Cuente el numero de veces que aparezcu cada !100 de los lados de la monetin. Muestre los resultados. EI progmma debe lIamar a un metoda scparado, Jlamlldo tirar. que no tome argumeOlos y t1evuelvu false en casu de cara. y true en casu de cruz, (Nota: 5i desea que el prognunu simule en fOlTIla rcalista el lanzamiento de monedns, cada lado de In monedu debe uparecer nproximadamente In mitlld del ticmpo.) Las computadoras estan tomando un papel cada vez mas importante en la educnci6n. Escliba un programa que nyude a un estudiante de eseueln primarill. pant que aprenda a multiplicar. Use el metoda Math. random para produeir dos enteros [lositlvos de un dfgito. EI prugrama debe einonces mostrur una pregunta en lu bUlTa de esuldo, C01110 lCllanto es 6 par 7? El estudiante entonces debe eseribir la respuesta en un objeto JTextF.ield. Luego. el progrnmu debe verificar la I'espuesta del estudlante. Si es correcta, dibllje la cadena" l14uy bien I " en el upplet y hagll otrt! preguntu de multipllcaei6n. Si In rcspuesta cs ineorreeta. dibuje la cadena "No. par favor intenta de nuevo." en el applet

6.25

6.26

Modifique el programs del ejercicio 6.18 para dibujar un cuadrado relleno can el metodo fillRect de lu clasc Graphics. EI rnetodo fillRect requiere dos argumentos: coordenadar, coordenadu j, unchura y altura. Usted debe permitir que el usuario introduzca las coordcnadas en las que debe apurecer el cuudrado, y lu longitud de uno de sus lados. Escriba segmentos de programas que rculieen cnda UOlI de Ius siguientes tarens: a) Calcular lu purte cnteru del ccciente, cuando el entero a se divide entre el entero b. b) Calcular el residue entcro cuando el entcro a se divide entre el entero b. c) Utilizar las piczas de los programus desarrollndos en las partes (a) y (b) para escribir UII metodo llamudo moatrarDigitos, que reeiba un entero entre 1 y 99999, Y que 10 muestrc como una secuenciu de dfgitos, separundo cada pur de dfgHas por dos espacins. POI' ejcmplo. el cntero 4562 debe apareccr como
462

6.27

6.22

6.28

6.29

d) Incorpore el metoda desarrollado en la parte (e) en un applet que reeiba como entrada un entero mediante un campo de tcxto. y que lIame nl metodo mostrarDigi toa pusundole a cste metodo el entero introducido. Muestre los resultados en lin segundo campo de texta.

6.30

6.23

Implemente los siguientes metodos cnteros: n) EI mctodo centigradoa que devuelve la equivalenciu en grados Centfgrados de IIna temperatura en grados Fnhrcllheit, utilizando d caJculo C

= =

5.0 I 9.0 • ( F ~ 3. );

b) EI metodo fahrenheit qlle devuelve III equivalenehl en grados Fahrenheit de una temperatura en grados Ccntfgrados, utilizundo el c:ileulo F 9.0 I 5.0 • C + 32;

6.31

c) Utiliee los metodos de las partes (a) y (b) pura cseribir un applet que permite alllsuario, ya sea escribir una tem. peratura en grados Fnhrellhcit y mostrar BU equivalente en grndos Centfgrados, {]escribir una temperatura en grados Centlgrados y mostrar BU equivalente en grados Fahrenheit.

240

Melodos

Copftulo6

capnulo 6

Melodos

241

y deje que el estudlunte intente la misma pregunta varies veces, hasta que este correcta. Debe utilizarse un metoda
sepurado para gencrar cada prcgunta nueva. Este metodo debe llamarse una vez cuando el upplet ernpiece a ejecutnrse, y cada vez qlle el usuario respondu correctamente a In pregonta. Todo el proceso de dibujar en cl applet debe rcalizarse por el metodo paint. 6.32 El uso de las computadoms en lu educacion se conoce como instruccitm asistida por compuuultnu (CAl). Un problema que se desarrolla en los entornos CAl es la fatiga de los cstudiantes, Este problema puede eliminarse sl se varia el diulogo de la computadora para mantener la utencion del estudianre. Modifique el progra01a del ejereicio 6.31 de rnunera que los diversos comentarios sc imprimun para cadu respuesta correcta e incorrecta, de [a siguiente munera: Contestaciones a una respuesta correctu: jMuy bienl jExce1entet jBuen trabajo! jSigue asil Contestaciones a una respuestu lncorrecu: una de nuevo. ve~ mas.

6,37

(Torres de Hunoi.; Todo cienufico computacionui en ciernes debe hacer frente a ciertos problemas clasicos, y el de las Torres de Hanoi (veu In figura 6.22) es uno de los mas famosos. Cuenta lu leyenda que, en un temple del Lejano Oriente, los sacerdotes traran de mover una pila de discos de una estaca a otra, La estaca inicial tiene 64 discos ensartados y ordenados, de abajo hacla arriba, en orden de tamufio decreciente, Los sacerdotes intentan mover lu pila de esta estaca hacia una segunda estaca, can las restriccinnes de mover s610 un disco a la vez, y que ningun disco mas grande debe colocarse encima de uno mas pequcrio, Una terccra estaca estu disponible para alojar discos temporalmente, En teorfu el mundo se acabara cuando los sucerdotes completen su tarea, por 10 que no hay muchos incentives para que nosotros les facilitemos su trnbajo. Vamos a suponer que los sacerdotes intentan mover los discos de la estaca I a la 3. Queremos desarrollar un algoritmo que despliegue IIIsecuencia precisa correspondiente a la transferencia de discos de una estaca a otra. Si fuerarnos a resolver cste problema con los metodos convencionules, nos encontranernos nipidamente 11 nosotros mismos involucrados en el rnnnejo de los discos. En cambio, si atacarnos el problema can lu rccursividaden mente, este se vuelvc inmediutamcnte manejable. EI proceso de mover n discos puede considerarse en terminos de mover solarnentc n - I discos (es decir, con recurslvidad) de ln siguiente forma:
11) Mover II - 1 discos de la estaca I a lu 2. utilizando In estaca 3 como un area de almaccnumiento b) Mover el ultimo disco (el mas grande) de la estaca I ala 3. c) Mover los II - Idiscos de la estaca 2 a la 3. utilizando la estaca I como area de almacenamlento

temporal. temporal.

No. Por favor intenta Incorrecto. Intenta iNo te :dndas I No. Sigue intentando.

Use In generuclon de ruimeros aleatorios para elegit un mimcro entre I y 4 que se utilice para seicccionar una contcstacion apropiadu a cada respuesta. Use una instruccion switch en el metoda paint para ernitir las contestaclones. 6.33 Los' sistemas de instrucciou asistida por cornputadora rnas sefisticndos supervisan el rendimiento del estudinnte durante cierto tiempo. La decision de empezur un nuevo tema se busa 11 menudo en cl exito del estudiante call los temas anteriorcs. Modiflque el programa del ejercicio 6.32 puru contnr el mlmcro de rcspuestas correctas e incorrectas por parte del estudiante. Una vez que el estudiante escriba 10 respuestas, su programa debe culcular 01 porcentnje de respucstas correctas, Si cste es mcnor del 75%. imprima Por favor pida ayuda adiciona1 a 81< ina true tor y reinicie cl programa, para que otro estudiunte pueda probarlo. Eseriba un upplet que juegue a "adivina el mimero" de la siguiente munera: su programa elige el numero a adlvlnur, seleccionando un entero uleatorio ell el fango de I a tOOO. EI upplet muestra el indlcador Adi vine un numero entre 1 y 1000 enseguidu de un objeto J'l'extFie1d. EI jugador escribe su primer intento en el objeto J'l'extFie1d y oprime lntro. Si lu respuesta del jugador es incorrecta, su prograrna debe mostrar el mensaje Demasiado alto. Intente de nuevo. 0 Demasiado bajo. Intente de nuevo. en la burra de estado, pam ayudur a que el jugador "se acerque" a lu respuesta correcta, EI progrnma debe bcrrur el objeto J'l'extFie1d de munera que cl uSliariu puedu escribir su siguiente intcnto. CUllndo el usuario escriba III respucstu correcta. mucstre el mensaje I Felicidades. Adi vine e1 nu.mero t en la barra de estado y borre el objcto J'l'extFie1d de mnnera que el usuario purtla jugur nlra vez. (Nota: La tecnica pllru adivinur emplcada encslc problcmn es similar a una btisf/ueda biliuria.) Moditique cl programu del ejercicio 6.34 pura con tar el numero de intcntos que bagu el jllgador. Si el m\mero es 10 0 menos, imprimu el mensaje i0 ya sabia usted e1 secreto. 0 tuvo suerte I Si el jugudor udivina elmimero en 10 intemos, imprima el mensaje IAj Ii! I Sabia usted e1 secreto! Si el jugudor haee mas de 10 intentos, imprima el mensaje iDeberia haber10 hecho mejor I iPor que no se debcn rcqucrir mus de to intcntos? Bueno, en cada "buen intento", el jugador debe poder eliminar la mitad de los numeros. Ahara muestre por que cuulquicr mimcro de I u 1000 puede adivinarse en 10 0 menos intentos. E5cribn \In metodo recursivo llamado potencia mdo de
bl1seJ!.rpol1~mt:

EI proccso tcrmina cuando la ultima tarea involucra mover el disco n = I (es decir, moviendo sirnplernente cl disco, sin necesidad de usur un area de almaceaamiento Escriba \111 applet para resolver el problema de las Torres de Hanoi. Debe permitir de discos ell un objeto J'l'e:x:tField. Use un metodo recursive llnmado torre,
II) El ruunero de discos a mover.

el cuso base). Esta tareu se logra temporal. al usuario introducir el mimero can cuatro purametros:

b) La estaca en In que estanin ensartados inicialrnente estes discos. c) La estaca a la que Be movera esta pila de discos. d) La estaca que se va a utillznr como area temporal de almacenumiento. Su progrumu debe mostrar en un objcto J'l'extArea, can funcionatidad de dcsplazamlento, Ius insuuccioncs precisas que se necesitaran para mover los discos desde la estuca inicial hnsta la estaca linal. Par ejemplo, para mover una estaell de ues discos desde la estaca I hasta la estaca 3, su programu debe imprimir la siguiente serie de movimiemos: 1 -t J (1M. norncion signlflca "mover un disco de IIIestaca I a la 3"".) 1-t2 3-t2 1-t3 2-t1 2-t3 1-t3 6.38 Cuulquier program a que puetlu implementarsc en forma recursiva. puede implemcntarse en forma iterativu, aunque algunas veces con mayor diticultad y mcnos cJaridud. Intcnte escribir una version iterutiva de Ius Torres de Hanoi. Estoco I Esloco 2 Esloco 3

6.34

6.35

6.36

( base.

exponente

) que, uI ser llnmado, devuell'iI el roslll-

Por ejcmplo, potencia ( 3,4 ) = 3 * 3 * 3 * 3. Suponga que exponente rellcia: El puso de recllrsividad debe utilizar lu relaci6n

es un cntero mayor a iguul a l. (SlIge-

y Ju condici6n de lerminuci6n ocurre cuando exponente


basel = hase

es igual a 1. ya que Figura 6.22 Los Torres de Honol pora el coso con cualro discos.

lucorpore este metodo en un applet que penn ita IU usuario introducir In base

y el exponente.)

242

Metodos

Capftulo 6

capftulo 6

Metodos

243

Sl tiene exito, compare su version iterativa can In version recursiva que desarrnlld en el ejercicio 6.37. Invcstigue cuestioncs de rendimiento, claridad y su hnbilidad para demostrar que los progrnmas scan correctos, 6.39 (Visuali7,ucirJn de la reclIrsMdad.) Es intcresantc observar a la recursivldad "en acclon". Modlflque e! metodo factorial de lu figuru 6.15 para que imprima su variable local y el punhnetro de III llamuda recursive. Por cada llamadn recursiva, muestre los resultados en una lfnea separada y agregue un nivel de sangrfa, Haga su mejor esfuerzo para que los resultados sean clams, interesantes y utiles, Su objetivo aquf es disenar e lmplementur un formuto paru los resultados que uyude a tina persona a cornprender rnejor IIIrecursividud, Tal vez quiera agregar dlchua capacidudes de despliegue a Ius muchos otros ejemplos y ejercicios de recursividud que contlene este llbro. EI nuiximo cormin divisor de los enteros x y y es el entero mas grande que puede dividir tanto a x como a y. Escribu un metodo recursive llarnado mcd que devuelva cl maximo comun divisor de x y y. EI mod de x y y sc define recurslvumentc de la siguiente manera: si y es igual a 0, cntonces mcd ( x, y ) es x; de no scr asf, mad ( x, y ) es mad ( y, x % Y ), en donde % es 01 opcrador residue. Utilice este mctodo para reernpluzar It I que escribi6 cn el applet del ejercicio 6.28. En los ejercicios 6.3 I a 6.33 se desarrollo Uti programa de instrucci6n asistida por computadoru para enseiiur a un estudiunte de escucla primura como multlplicar, Realice las siguientes rnejorns: a) Modifique el programu para que permita ul usuurio introducir un nivel de eapacidad escolar, Un nivel de 1 sig. nifica que el programa debe usar s610 ruimeros de un dfgito en los problemas, un nivel 2 significa que el pro. grama debe utilizar mimeros de dos digitos maximo, etcetera, b) Modifique el programa pura permitir al usuurio que eliju el tipo de problemas aritmeticos que desea cstudiur; Una opci6n de 1 signiflca problemas de suma solumcnte, 2 significu problemas de resta, 3 significa problemas de multiplicaclen, 4 significu problemas de division y 5 significa una mezcla aleatoriu de problemas de todos estes tipos. Escriba un metoda llurnado distancia. para calcular la distancia entre dos pUtHOS (xl •.vIi y (x2•.v2). Todos los numeros y valores de retorno deben ser de tipo double.lncorpore este metoda en un upplet que pennitu ul usuario introducir las coordenadus de los puntos.

saldoBanoo, compruebe si saldoBanao se hit vuelto cero y. de ser ast, imprima el mensajc "La sianto. 1Se <;[1led6 sin fondos 1n A rnedida que el juego progreso. imprimu varies mensajes para crcar algo de "charla", como "Oh, se eeta yendo a la quiebra, .verdad?",o "Oh, vamos, 1arrieegueee!", 0 "La hizo en grande. iAbora es tiempo de cambiar sus fiohas p~r efeativo I", Implementc la "charla" como un metodo separado que seleccione en forma aleutoria la cadenu It mostrnr,

6.40

6.41

6.42

6.43

l.Quc haec 01siguientc metoda?


II El parametro b debe ser II positivo para evitar la public int mi~terio( int a,
{

un entero recursivida.d int b )

infinita

if el~e

(b return return

==

1) a; a + misterio( a, b - 1);

6.44

Una ve: que determine 10 que haec el prograrnn del ejercicio 6.43. modifique el metodo para que opere npropiadumente, sin la restriccion de que el segundo urgumento debe ser no negative. Adernds, incorpore el rnetodo en un applet que permita al usuario introducir dos emeros, Pruebe el metoda. Encuentre el error en el siguiente metoda recursive, y expiiquc como corregirlo: public
{

6.45

int (n return return

suma(

int

n)

if else

==

0)

0; n • suma( n );

6.46

Modifique el progruma Craps de la tigura 6,9 para permitir apucstas, Inicialice In variable saldoBanco can $1000, Plda al jugudor que introduzca una apuesta, Comprucbe que esa apuesta sea menoro igual al saldoBanco y. ai no 10 es, haga que el usuario vuelva it lntroducir la apuastia hasra que se intruduzca un valor valido. Despues de esto, comicnce un juego de craps, Si el jugudor gana, ngregue In apueata al saldoBanco e imprima el nuevo aardoaanoo. Si el jugudor pierde, reste la apuesta al sal.doasnco, imprima el nuevo

Das könnte Ihnen auch gefallen