nivel 3: manejo de grupos de atributos

Post on 25-Nov-2021

4 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Nivel3:ManejodeGruposdeAtributos

240

1.ObjetivosPedagógicosAlfinaldeestenivelellectorserácapazde:

Utilizarlasestructurascontenedorasdetamañofijocomoelementosparamodelarunacaracterísticadeunelementodelmundoquepermitenalmacenarunasecuenciadevalores(simplesuobjetos).Utilizarlasestructurascontenedorasdetamañovariablecomoelementosdemodeladoquepermitenmanejaratributoscuyovaloresunasecuenciadeobjetos.Utilizarlasinstruccionesiterativasparamanipularestructurascontenedorasyentenderquedichasinstruccionessepuedenutilizarenotrotipodeproblemas.CrearunaclasecompletaenJavautilizandoelambientededesarrolloEclipse.Entenderladocumentacióndeunconjuntodeclasesescritasporotrosyutilizardichadocumentaciónparapoderincorporaryusaradecuadamentedichasclasesenunprogramaqueseestáconstruyendo.

ObjetivosPedagógicos

241

2.MotivaciónCuandonosenfrentamosalaconstruccióndelmodeloconceptualdelmundodelproblema,enmuchasocasionesnosencontramosconelconceptodecolecciónogrupodecosasdelamismaclase.Porejemplo,siretomamoselcasodeestudiodelempleadopresentadoenelnivel1ylogeneralizamosalaadministracióndetodoslosempleadosdelauniversidad,esclaroqueenalgunapartedeldiagramadeclasesdebeaparecerelconceptodegrupodeempleados.Además,cuandoplanteemoslasolución,tendremosquedefinirunmétodoenalgunaclaseparaañadirunnuevoelementoaesegrupo(ingresóunnuevoempleadoalauniversidad)ounmétodoparabuscarunempleadodelauniversidad(porejemplo,quiéneselempleadoquetienemayorsalario).Demanerasimilar,siretomamoselcasodeestudiodelnivel2sobrelatienda,lonaturalesqueunatiendamanipuleunnúmeroarbitrariodeproductos,ynosólocuatrodeelloscomosedefinióenelejemplo.Enesecaso,latiendadebepoderagregarunnuevoproductoalgrupodelosqueyavende,buscarunproductoensucatálogo,etc.

Enestecapítulovamosaintroducirdosconceptosfundamentalesdelaprogramación:

1. Lasestructurascontenedoras,quenospermitenmanejaratributoscuyovalorcorrespondeaunasecuenciadeelementos.

2. Lasinstruccionesrepetitivas,quesoninstruccionesquenospermitenmanipularloselementoscontenidosendichassecuencias.

Además,enestenivelestudiaremoslamaneradecrearobjetosyagregarlosaunacontenedora,lamaneradecrearunaclasecompletaenJavaylaformadeleerladescripcióndeunconjuntodeclasesdesarrolladasporotros,parasercapacesdeutilizarlasennuestrosprogramas.

Vamosatrabajarsobrevarioscasosdeestudioqueiremosintroduciendoalolargodelnivel.

Motivación

242

3.CasodeEstudioNº1:LasNotasdeunCursoConsidereelproblemadeadministrarlascalificacionesdelosalumnosdeuncurso,enelcualhaydoceestudiantes,decadaunodeloscualessetienelanotadefinitivaqueobtuvo(unvalorentre0,0y5,0).

Sequiereconstruirunprogramaquepermita:

1. Cambiarlanotadeunestudiante.2. Calcularelpromediodelcurso.3. Establecerelnúmerodeestudiantesqueestáporencimadedichopromedio.

Enlafigura3.1aparecelainterfazdeusuarioquesequierequetengaelprograma.

Fig.3.1Interfazdeusuariodelprogramadelprimercasodeestudio

Enlaventanadelprogramaaparecelanotadecadaunodelosdoceestudiantesdel

CasodeEstudioNº1:LasNotasdeunCurso

243

curso.Lanotaconlaquecomienzanessiemprecero.Conelrespectivobotónesposiblemodificarlanota.Aloprimirlo,apareceunaventanadediálogoenlaquesepidelanuevanota.Enlapartedeabajodelaventanaseencuentranlosbotonesqueimplementanlosrequerimientosfuncionales:calcularelpromedioeindicarelnúmerodeestudiantesqueestánporencimadedichanota.

3.1.ComprensióndelosRequerimientosRequerimientofuncional1

Nombre R1–Cambiarnota.

Resumen Cambialanotadeunodelosestudiantesquepertenecealalistadelcurso.

Entradas (1)Númerodelestudiante,(2)notadelestudiante

ResultadoSemuestralanuevanotadelestudiante.Encasodequenocumplaelformatodenúmerodecimalconpuntocomoseparador,semuestraunmensajedeerror.

Requerimientofuncional2

Nombre R2–Calcularpromediodenotas.

Resumen Calculaelpromediodenotasdelalistadeestudiantes.

Entradas Ninguna.

Resultado Semuestraunmensajeconelpromediocalculado.

Requerimientofuncional3

Nombre R3–Calcularlacantidaddeestudiantesporencimadelpromedio.

Resumen Calculalacantidaddeestudiantesquetienenunanotaregistradamayoralpromediocalculado.

Entradas Ninguna.

Resultado Semuestraunmensajeconlacantidaddeestudiantesporencimadelpromedio.

3.2.ComprensióndelMundodelProblema

CasodeEstudioNº1:LasNotasdeunCurso

244

Dadoelenunciadodelproblema,elmodeloconceptualsepuededefinirconunaclasellamadaCurso,lacualtendríadoceatributosdetipodoublepararepresentarlasnotasdecadaunodelosestudiantes,talcomosemuestraenlafigura3.2.

Fig.3.2Modeloconceptualdelascalificacionesdelosestudiantes

CasodeEstudioNº1:LasNotasdeunCurso

245

CasodeEstudioNº1:LasNotasdeunCurso

246

Aunqueestemodeladoescorrecto,losmétodosnecesariospararesolverelproblemaresultaríanexcesivamentelargosydispendiosos.Cadaexpresiónaritméticaparacalcularcualquiervalordelcursotomaríamuchaslíneasdecódigo.Además,imaginesienvezde12notastuviéramosquemanejar50ó100.Terminaríamosconalgoritmosimposiblesdeleerydemantener.Necesitamosunamaneramejordehacerestemodeladoyéstaeslamotivacióndeintroducirelconceptodeestructuracontenedora.

CasodeEstudioNº1:LasNotasdeunCurso

247

4.ContenedorasdeTamañoFijoLoideal,enelcasodeestudio,seríatenerunsóloatributo(llamadoporejemplonotas),endondepudiéramosreferirnosaunodelosvaloresindividualesporunnúmeroquecorrespondaasuposiciónenelgrupo(porejemplo,laquintanota).Esetipodeatributosquesoncapacesdeagruparunasecuenciadevaloressedenominancontenedorasylaideaseilustraenlafigura3.3.ValelapenaaclararquelasintaxisusadaenlafiguranocorrespondealasintaxisdeUML,sinoquesolamentelausamosparailustrarlaideadeunaestructuracontenedora.

Fig.3.3Modeloconceptualdelascalificacionesconunacontenedora

ContenedorasdeTamañoFijo

248

Enlugardetener12atributosdetiporeal,vamosatenerunsóloatributollamado"notas"elcualcontendráensuinteriorlas12notasquequeremosrepresentar.Cadaunodeloselementosdelatributo"notas"sepuedereferenciarutilizandolasintaxisnotas[x],dondexeselnúmerodelestudianteaquiencorrespondelanota(comenzandoen0).Conestarepresentaciónpodemosmanejardemaneramássimpleygeneralelgrupodenotasdelosestudiantes.

ContenedorasdeTamañoFijo

249

UnobjetodelaclaseCursoseveríacomoapareceenlafigura3.4.Allísepuedeapreciarquelasposicionesdentrodeunacontenedorasecomienzananumerarapartirdelvalor0yqueloselementosindividualessereferencianatravésdesuposición.Cadanotavaenunaposicióndistintadelacontenedoradetipodoublellamadanotas.

Fig.3.4–Representacióngráficadeunarreglo

Enlasseccionesquesiguenveremoslamaneradedeclarar(enUMLyenJava)unatributoquecorrespondaaunacontenedora,yamanipularlosvaloresallíincluidos.

4.1DeclaracióndeunArregloEnJava,lasestructurascontenedorasdetamañofijosedenominanarreglos(arrayseninglés),ysedeclarancomosemuestraenelejemplo1.Losarreglosseutilizanparamodelarunacaracterísticadeunaclasequecorrespondeaungrupodeelementos,deloscualesseconocesunúmero.Sinosupiéramos,porejemplo,elnúmerodeestudiantesdelcursoenelcasodeestudio,deberíamosutilizarunacontenedoradetamañovariable,queeseltemadeunasecciónposteriordeestecapítulo.

Ejemplo1

Objetivo:MostrarlasintaxisusadaenJavaparadeclararunarreglo.

ContenedorasdeTamañoFijo

250

Enesteejemplosehaceladeclaracióndelarreglodenotas,comopartedelaclaseCursodelcasodeestudio.

publicclassCurso

{

//-----------------------------------

//Constantes

//-----------------------------------

publicfinalstaticintTOTAL_EST=12;

//-----------------------------------

//Atributos

//-----------------------------------

privatedouble[]notas;

...

}

Esconvenientedeclararelnúmerodeposicionesdelarreglocomounaconstante(TOTAL_EST).Esofacilitarealizarmástardemodificacionesalprograma.Sienvezde12hayquemanejar15estudiantes,bastaríaconcambiardichovalor.Enelmomentodedeclararelatributo"notas",usamoslasintaxis"[]"paraindicarquevaacontenerungrupodevalores.Eltamañodelarregloserádeterminadoenelmomentodelainicializacióndelarreglo,enelmétodoconstructor.Porahoranohayquedecirnadaalrespecto.Enladeclaraciónledecimosalcompiladorquetodosloselementosdelarreglosondetipodouble.Recuerdequeloselementosdeunarreglosecomienzanareferenciarapartirdelaposición0.

4.2InicializacióndeunArregloAligualqueconcualquierotroatributodeunaclase,esnecesarioinicializarlosarreglosenelmétodoconstructorantesdepoderlosutilizar.Parahacerlo,sedebedefinireltamañodelarreglo,esdecirelnúmerodeelementosquevaacontener.Estainicializaciónesobligatoria,puestoqueesenesemomentoqueledecimosalcomputadorcuántosvaloresdebemanejarenelarreglo,loquecorrespondealespacioenmemoriaquedebereservar.Veamosenelejemplo2cómosehaceestoparaelcasodeestudio.

Sitratamosdeaccederaunelementodeunarregloquenohasidoinicializado,vamosaobtenerelerrordeejecución:java.lang.NullPointerException

Ejemplo2

ContenedorasdeTamañoFijo

251

Objetivo:MostrarlamaneradeinicializarunarregloenJava.

Enesteejemplomostramos,enelcontextodelcasodeestudio,lamaneradeinicializarelarreglodenotasdentrodelconstructordelaclaseCurso.

publicCurso()

{

notas=newdouble[TOTAL_EST];

}

Seutilizalainstrucciónnewcomoconcualquierotroobjeto,peroseleespecificaelnúmerodevaloresquedebecontenerelarreglo(TOTAL_EST,queesunaconstantedevalor12).Estaconstrucciónreservaelespacioparaelarreglo,peroelvalordecadaunodeloselementosdelarreglosiguesiendoindefinido.Estoloarreglaremosmásadelante.

EllenguajeJavaproveeunoperadorespecial(length)paralosarreglos,quepermiteconsultarelnúmerodeelementosqueéstoscontienen.Enelcasodeestudio,laexpresiónnotas.lengthdebedarelvalor12,independientementedesilosvaloresindividualesyahansidoonoinicializados,puestoqueenelmétodoconstructordelaclasesereservódichoespaciodememoria.

4.3.AccesoalosElementosdelArregloUníndiceesunvalorenteroquenossirveparaindicarlaposicióndeunelementoenunarreglo.Losíndicesvandesde0hastaelnúmerodeelementosmenos1.Enelcasodeestudio,laprimeranotatieneelíndice0ylaúltima,elíndice11.Paratomaromodificarelvalordeunelementoparticulardeunarreglonecesitamosdarsuíndice,usandolasintaxisqueapareceenelsiguientemétododelaclaseCursoyque,enelcasogeneral,sepuederesumircomo<arreglo>[<índice>].

ContenedorasdeTamañoFijo

252

publicvoidnoHaceNadaUtil(doublevalor)

{

intindice=10;

notas[0]=3.5;

if(valor<2.5&&notas.length==TOTAL_EST)

{

notas[indice]=notas[0];

notas[0]=valor+1.0;

}

else

{

notas[indice]=notas[0]-valor;

}

}

EstemétodosóloloutilizamosparailustrarlasintaxisqueseutilizaenJavaparamanipularloselementosdeunarreglo.Paraasignarunvaloraunacasilladelarreglo,usamoslasintaxisnotas[x]=valor,dondexeselíndicequenosindicaunaposición.Paraobtenerelvalordeunacasilla,usamoslamismasintaxis(notas[x])yparaconocerelnúmerodecasillasdelarreglousamosnotas.length.

Deestamanerapodemosasignarcualquiervalordetipodoubleacualquieradelascasillasdelarreglo,otomarelvalorqueallíseencuentra.

Cuandodentrodeunmétodotratamosdeaccederunacasillaconuníndicenoválido(menorque0omayoroigualqueelnúmerodecasillas),obtenemoselerrordeejecución:java.lang.ArrayIndexOutOfBoundsException

Esimportantedestacarque,hastaestemomento,loúnicoquehemosganadoconlaintroduccióndelosarreglosesnotenerqueusaratributosindividualespararepresentarunacaracterísticaqueincluyeungrupodeelementos.Esmáscómodotenerunsóloatributocontodosesoselementosensuinterior.Lasverdaderasventajasdeusararregloslasveremosacontinuación,alintroducirlasinstruccionesrepetitivas.

ContenedorasdeTamañoFijo

253

5.InstruccionesRepetitivas

5.1.IntroducciónEnmuchosproblemasnotamosunaregularidadquesugierequesusoluciónpuedelograrserepitiendounpasoquevayatransformandogradualmenteelestadodelmundomodeladoyacercándosealasolución.Instintivamenteesloquehacemoscuandosubimosunasescaleras:repetimoselpasodesubirunescalónhastaquellegamosalfinal.Otroejemploposibleessisuponemosquetenemosenunahojadepapelunalistadepalabrassinningúnordenynospidenbuscarsilapalabra"casa"estáenlalista.Elalgoritmoqueseguimospararealizarestátareapuedeserdescritodelasiguientemanera:

1. Verifiquesilaprimerapalabraesiguala"casa".2. Siloes,nobusquemás.Sinoloes,busquelasegundapalabra.3. Verifiquesilasegundapalabraesiguala"casa".4. Siloes,nobusquemás.Sinoloes,busquelatercerapalabra.5. Repitaelprocedimientopalabraporpalabra,hastaquelaencuentreohastaqueno

hayamáspalabrasparabuscar.

Tarea1

Objetivo:Explicarelsignificadodelainstrucciónrepetitivayusarlaparadefinirunalgoritmoqueresuelvaunproblemasimple.

Supongaqueenelejemploanterior,yanoqueremosbuscarunapalabrasinocontarelnúmerototaldeletrasquehayentodaslaspalabrasdelahoja.

Escribaelalgoritmopararesolverelproblema:

InstruccionesRepetitivas

254

5.2.CalcularelPromediodelasNotasPararesolverelsegundorequerimientodelcasodeestudio(R2-calcularelpromediodelasnotas),debemoscalcularlasumadetodaslasnotasdelcursoparaluegodividirloporelnúmerodeestudiantes.Estosepuedehacerconelmétodoquesemuestraacontinuación:

publicdoublepromedio()

{

doublesuma=notas[0]+notas[1]+notas[2]+

notas[3]+notas[4]+notas[5]+

notas[6]+notas[7]+notas[8]+

notas[9]+notas[10]+notas[11];

returnsuma/TOTAL_EST;

}

Primerosumamoslasnotasdetodoslosestudiantesyguardamoselvalorenlavariablesuma.Elpromediocorrespondeadividirdichovalorporelnúmerodeestudiantes,representadoconlaconstanteTOTAL_EST.

Siplanteamoselproblemademaneraiterativa,podemosescribirelmismométododelasiguientemanera,enlacual,encadapaso,acumulamoselvalordelsiguienteelemento:

InstruccionesRepetitivas

255

publicdoublepromedio()

{

doublesuma=0.0;

intindice=0;

suma+=notas[indice];

indice++;

suma+=notas[indice];

indice++;

suma+=notas[indice];

indice++;

suma+=notas[indice];

indice++;

suma+=notas[indice];

indice++;

suma+=notas[indice];

indice++;

suma+=notas[indice];

indice++;

suma+=notas[indice];

indice++;

suma+=notas[indice];

indice++;

suma+=notas[indice];

indice++;

suma+=notas[indice];

indice++;

suma+=notas[indice];

returnsuma/TOTAL_EST;

}

Estasolucióntambiéncalculaelpromediodelcurso,peroenlugardehacerreferenciadirectaalasdocecasillasdelarreglo,utilizauníndicequevadesplazandodesde0hasta11.Porsupuestoqueesmásclaralasoluciónanterior,peroqueremosutilizaresteejemploparaintroducirlasinstruccionesiterativas,queexpresanestamismaideade"desplazar"uníndice,perousandounasintaxismuchomáscompacta.Loprimeroquedebemosnotaresquevamosaejecutar12veces(TOTAL_ESTvecesparaserexactos)ungrupodeinstrucciones.Esegrupodeinstruccioneses:suma+=notas[indice];indice++;Despuésdeejecutar12vecesesasdosinstrucciones,enlavariablesumatendremoselvalortotal,listoparadividirloporelnúmerodeestudiantes.Elíndicecomienzateniendoelvalor0yterminateniendoelvalor11.Deestamanera,cadavezquehacemosreferenciaalelementonotas[indice],estamoshablandodeunacasilladistintadelarreglo.

InstruccionesRepetitivas

256

Allírepetimos12vecesunaparejadeinstrucciones,unavezporcadaelementodelarreglo.Bastaunpocodereflexiónparaverqueloquenecesitamosespoderdecirqueesasdosinstruccionessedebenrepetirtantasvecescomonotashayaenelarreglo.Lasinstruccionesrepetitivasnospermitenhaceresodemanerasencilla.Enelsiguientemétodoseilustraelusodelainstrucciónwhileparaelmismoproblemadelcálculodelpromedio.

publicdoublepromedio()

{

doublesuma=0.0;

intindice=0;

while(indice<TOTAL_EST)

{

suma+=notas[indice];

indice++;

}

returnsuma/TOTAL_EST;

}

Laestructuradelmétodosiguesiendolamisma,conlaúnicadiferenciadequeenlugarderepetir12veceslaparejadeinstrucciones,lasincluimosdentrodelainstrucciónwhile,queseencargadeejecutarrepetidamentelasinstruccionesquetieneensuinterior.Lainstrucciónwhilesirveparadecirlealcomputadorque"mientrasque"unacondiciónsecumpla,sigaejecutandolasinstruccionesqueestánpordentro.Lacondiciónenelejemploesindice<TOTAL_EST,queequivaleadecirleque"mientrasque"elíndicenolleguea12,vuelvaaejecutarlaparejadeinstruccionesquetieneasociadas.

Ahoraveremoslaspartesdelasinstruccionesrepetitivasysusignificado.

5.3.ComponentesdeunaInstrucciónRepetitivaLafigura3.5ilustralamaneraenqueseejecutaunainstrucciónrepetitiva.Primero,yporunasolavez,seejecutanlasinstruccionesquevamosallamardeinicioopreparacióndelciclo.Allíseledaelvalorinicialalíndiceyalasvariablesenlasquequeremosacumularlosvaloresduranteelrecorrido.Luego,seevalúalacondicióndelciclo.Siesfalsa,seejecutanlasinstruccionesqueseencuentrandespuésdelciclo.Siesverdadera,seejecutanlasinstruccionesdelcuerpodelcicloparafinalmentevolverarepetirelmismoproceso.Cadarepetición,queincluyelaevaluacióndelacondiciónylaejecucióndelcuerpodelciclo,recibeelnombredeiteraciónobucle.

InstruccionesRepetitivas

257

Fig.3.5Ejecucióndeunainstrucciónrepetitiva

Usualmenteenunlenguajedeprogramaciónhayvariasformasdeescribirunainstrucciónrepetitiva.EnJavaexistenvariasformas,peroenestelibrosólovamosapresentardosdeellas:lainstrucciónforylainstrucciónwhile.

5.3.1.LasInstruccionesforywhile

Unainstrucciónrepetitivaconlainstrucciónwhileseescribedelasiguientemanera:

<inicio>

while(<condición>)

{

<cuerpo>

<avance>

}

Lasinstruccionesdepreparacióndelciclovanantesdelainstrucciónrepetitiva.Lacondiciónqueestablecesisedeberepetirdenuevoelciclovasiempreentreparéntesis.Elavancedelcicloesunaparteopcional,enlacualsemodificanlosvaloresdealgunosdeloselementosquecontrolanlasalidadelciclo(avanzarelíndiceconelque

InstruccionesRepetitivas

258

serecorreunarregloseríapartedeestasección).

Unainstrucciónrepetitivaconlainstrucciónforseescribedelasiguientemanera:

<inicio1>

for(<inicio2>;<condición>;<avance>)

{

<cuerpo>

}

Eliniciovaseparadoendospartes:enlaprimera,valadeclaraciónylainicializacióndelasvariablesquevanaserutilizadasdespuésdeterminadoelciclo(lavariablesuma,porejemplo,enelmétododelpromedio).Enlasegundapartedelazonadeiniciovanlasvariablesqueseránutilizadasúnicamentedentrodelainstrucciónrepetitiva(lavariableíndice,porejemplo,quesólosirveparadesplazarserecorriendolascasillasdelarreglo).Lasegundapartedelinicio,lomismoqueelavancedelciclo,seescribenenelencabezadodelainstrucciónfor.

Ejemplo3

Objetivo:Mostrarlamaneradeutilizarlainstruccióniterativafor.

Enesteejemplosepresentaunaimplementacióndelmétodoquecalculaelpromediodenotasdelcasodeestudio,enlacualseutilizalainstrucciónfor.

publicdoublepromedio()

{

doublesuma=0.0;

for(intindice=0;indice<TOTAL_EST;indice++)

{

suma+=notas[indice];

}

returnsuma/TOTAL_EST;

}

Puestoquelavariable"suma"seráutilizadaporfueradelcuerpodelciclo,esnecesariodeclararlaantesdelfor.Lavariable"indice"esinternaalciclo,poresosedeclaradentrodelencabezado.Elavancedelcicloconsisteenincrementarelvalordel"indice".Enesteejemplo,loscorchetesdelforsonopcionales,porquesólohayunainstruccióndentrodelcuerpodelciclo.

InstruccionesRepetitivas

259

Vamosaverenmásdetallecadaunadelaspartesdelainstrucciónylasilustraremosconalgunosejemplos.

5.3.2.ElIniciodelCiclo

Elobjetivodelasinstruccionesdeinicioopreparacióndelcicloesasegurarnosdequevamosaempezarelprocesorepetitivoconlasvariablesdetrabajoenlosvalorescorrectos.Ennuestrocaso,unavariabledetrabajolautilizamoscomoíndiceparamovernosporelarregloylaotraparaacumularlasumadelasnotas:

Lasumaantesdeempezarelciclodebesercero:doublesuma=0.0;Elíndiceapartirdelcualvamosaiterardebesercero:intindice=0;

5.3.3.LaCondiciónparaContinuar

Elobjetivodelacondicióndelcicloesidentificarelcasoenelcualsedebevolverahacerunanuevaiteración.Estacondiciónpuedesercualquierexpresiónlógica:sisuevaluacióndaverdadero,significaquesedebenejecutardenuevolasinstruccionesdelciclo.Siesfalsa,elcicloterminaysecontinúaconlainstrucciónquesiguedespuésdelainstrucciónrepetitiva.

Típicamente,cuandoseestárecorriendounarregloconuníndice,lacondicióndelciclodicequesedebevolveraiterarmientraselíndiceseamenorqueelnúmerototaldeelementosdelarreglo.Paraindicarestenúmero,sepuedeutilizarlaconstantequedefinesutamaño(TOTAL_EST)oeloperadorquecalculaelnúmerodeelementosdeunarreglo(notas.length).

Dadoquelosarregloscomienzanen0,lacondicióndelciclodebeusareloperador<yelnúmerodeelementosdelarreglo.Sonerrorescomunescomenzarlosciclosconelíndiceen1otratardeterminarconlacondiciónindice<=notas.length.

5.3.4.ElCuerpodelCicloElcuerpodelciclocontienelasinstruccionesquesevanarepetirencadaiteración.Estasinstruccionesindican:

Lamanerademodificaralgunasdelasvariablesdetrabajoparairacercándosealasolucióndelproblema.Porejemplo,sielproblemaesencontrarlasumadelasnotasdetodoslosestudiantesdelcurso,conlainstrucciónsuma+=notas[indice]agregamosunnuevovaloralacumulado.Lamanerademodificarloselementosdelarreglo,amedidaqueelíndicepasaporcadacasilla.Porejemplo,siqueremossumarunadécimaatodaslasnotas,lo

InstruccionesRepetitivas

260

hacemosconlainstrucciónnotas[indice]+=0.1.

5.3.5.ElAvancedelCicloCuandoserecorreunarreglo,esnecesariomoverelíndicequeindicalaposiciónenlaqueestamosenunmomentodado(indice++).Enalgúnpunto(enelavanceoenelcuerpo)debehaberunainstrucciónquecambieelvalordelacondiciónparaquefinalmenteéstaseafalsaysedetengaasílaejecucióndelainstruccióniterativa.Siestonosucede,elprogramasequedaráenuncicloinfinito.

Siconstruimosuncicloenelquelacondiciónnuncaseafalsa(porejemplo,siolvidamosescribirlasinstruccionesdeavancedelciclo),elprogramadarálasensacióndequeestábloqueadoenalgúnlado,opodemosllegaralerror:java.lang.OutOfMemoryError

Tarea2

Objetivo:Practicareldesarrollodemétodosquetenganinstruccionesrepetitivas.

ParaelcasodeestudiodelasnotasdelosestudiantesescribalosmétodosdelaclaseCursoqueresuelvenlosproblemasplanteados.

Calcularelnúmerodeestudiantesquesacaronunanotaentre3,0y5,0:

publicintcalcularCantidadAprobados()

{

}

Calcularlamayornotadelcurso:

InstruccionesRepetitivas

261

publicdoublecalcularMayorNota()

{

}

Contarelnúmerodeestudiantesquesacaronunanotainferioraladelestudiantequeestáenlaposicióndelarregloqueseentregacomoparámetro.SupongaqueelparámetropPosEsttieneunvalorcomprendidoentre0yTOTAL_EST–1.

publicintcalcularCantidadNotasInferioresA(intpPosEst)

{

}********

Aumentarel5%todaslasnotasdelcurso,sinqueningunadeellassobrepaseelvalor5,0:

publicvoidhacerCurva()

{

}

InstruccionesRepetitivas

262

5.4.PatronesdeAlgoritmoparaInstruccionesRepetitivasCuandotrabajamosconestructurascontenedoras,lassolucionesdemuchosdelosproblemasquedebemosresolversonsimilaresyobedecenaciertosesquemasyaconocidos(¿cuántaspersonasnohabránresueltoyalosmismosproblemasqueestamosaquíresolviendo?).Enestasecciónpretendemosidentificartresdelospatronesquemásserepitenenelmomentodeescribirunciclo,yconloscualessepuedenresolvertodoslosproblemasdelcasodeestudioplanteadoshastaahora.Loidealseríaque,alleerunproblemaquedebemosresolver(elmétodoquedebemosescribir),pudiéramosidentificarelpatrónalcualcorrespondeyutilizarlasguíasqueexistenpararesolverlo.Esosimplificaríaenormementelatareadeescribirlosmétodosquetienenciclos.

Unpatróndealgoritmosepuedevercomounasolucióngenéricaparauntipodeproblemas,enlacualelprogramadorsólodeberesolverlosdetallesparticularesdesuproblemaespecífico.

Enestasecciónvamosaintroducirtrespatronesquesediferencianporeltipoderecorridoquehacemossobrelasecuencia.

5.4.1.PatróndeRecorridoTotal

Enmuchasocasiones,pararesolverunproblemaqueinvolucraunasecuencia,necesitamosrecorrertodosloselementosqueéstacontieneparalograrlasolución.Enelcasodeestudiodelasnotastenemosvariosejemplosdeesto:

Calcularlasumadetodaslasnotas.Contarcuántosenelcursoobtuvieronlanota3,5.Contarcuántosestudiantesaprobaronelcurso.Contarcuántosenelcursoestánpordebajodelpromedio(conociendoestevalor).Aumentaren10%todaslasnotasinferioresa2,0.

¿Quétienenencomúnlosalgoritmosqueresuelvenesosproblemas?Larespuestaesquelasoluciónrequieresiempreunrecorridodetodoelarregloparapodercumplirelobjetivoqueseestábuscando:debemospasarunavezporcadaunadelascasillasdelarreglo.Estosignifica:

1. Queelíndiceparainiciarelciclodebeempezarencero.2. Quelacondiciónparacontinuaresqueelíndiceseamenorquelalongituddelarreglo.3. Queelavanceconsisteensumarleunoalíndice.

InstruccionesRepetitivas

263

Esaestructuraqueserepiteentodoslosalgoritmosquenecesitanunrecorridototalesloquedenominamoselesqueletodelpatrón,elcualsepuederesumirconelsiguientefragmentodecódigo:

for(intindice=0;indice<arreglo.length;indice++)

{

<cuerpo>

}

Escomúnqueenlugardelavariable"indice"seutiliceunavariablellamada"i".Estohaceelcódigounpocomáscompacto.Enlugardeloperador"length",sepuedeutilizartambiénlaconstantequeindicaelnúmerodeelementosdelarreglo.Loscorchetesdel"for"sólosonnecesariossielcuerpotienemásdeunainstrucción.

Loquecambiaencadacasoesloquesequierehacerenelcuerpodelciclo.Aquíhaydosvariantesprincipales.Enlaprimera,algunosdeloselementosdelarreglovanasermodificadossiguiendounaregla(porejemplo,aumentaren10%todaslasnotasinferioresa2,0).Loúnicoquesehaceenesecasoesreemplazareldelesqueletoporlasinstruccionesquehacenlamodificaciónpedidaaunelementodelarreglo(elqueseencuentraenlaposiciónindice).Esavarianteseilustraenelejemplo4.

Ejemplo4

Objetivo:Mostrarlaprimeravariantedelpatrónderecorridototal.

EnesteejemplosepresentalaimplementacióndelmétododelaclaseCursoqueaumentaen10%todaslasnotasinferioresa2,0.

publicvoidhacerCurva()

{

for(inti=0;i<notas.length;i++)

{

if(notas[i]<2.0)

{

notas[i]=notas[i]*1.1;

}

}

}

Elesqueletodelpatróndealgoritmoderecorridototalsecopiadentrodelcuerpodelmétodo.Sereemplazaelcuerpodelpatrónporlainstruccióncondicionalquehacelamodificaciónpedida.

InstruccionesRepetitivas

264

Enelcuerposeindicalamodificaciónquedebesufrirelelementoqueestásiendoreferenciadoporelíndiceconelqueserecorreelarreglo.

Lasegundavariantecorrespondeacalcularalgunapropiedadsobreelconjuntodeelementosdelarreglo(porejemplo,contarcuántosestudiantesaprobaronelcurso).Estavarianteimplicacuatrodecisionesquedefinenlamaneradecompletarelesqueletodelpatrón:

1. Cómoacumularlainformaciónquesevallevandoamedidaqueavanzaelciclo.2. Cómoinicializardichainformación.3. Cuáleslacondiciónparamodificardichoacumuladoenelpuntoactualdelciclo.4. Cómomodificarelacumulado.

Enelejemplo5seilustraestavariante.

Ejemplo5

Objetivo:Mostrarlasegundavariantedelpatrónderecorridototal.

Enesteejemplosepresentalaaplicacióndelpatróndealgoritmoderecorridototal,paraelproblemadecontarelnúmerodeestudiantesqueaprobaronelcurso.

¿Cómoacumularinformación?

VamosautilizarunavariabledetipoenterollamadavanAprobando,quevallevandoduranteelcicloelnúmerodeestudiantesqueaprobaronelcurso.

¿Cómoinicializarelacumulado?

LavariablevanAprobandosedebeinicializaren0,puestoqueinicialmentenohemosencontradotodavíaningúnestudiantequehayapasadoelcurso.

¿Condiciónparacambiarelacumulado?

Cuandonotas[indice]seamayoroiguala3,0,porquequieredecirquehemosencontradootroestudiantequepasóelcurso.

¿Cómomodificarelacumulado?

Elacumuladosemodificaincrementándoloen1.

InstruccionesRepetitivas

265

publicintdarCantidadAprobados()

{

intvanAprobando=0;

for(inti=0;i<notas.length;i++)

{

if(notas[i]>=3.0)

{

vanAprobando++;

}

}

returnvanAprobando;

}

Lascuatrodecisionestomadasanteriormentevanadefinirlamaneradecompletarelesqueletodelalgoritmodefinidoporelpatrón.Lasdecisiones1y2defineneliniciodelciclo.Lasdecisiones3y4ayudanaconstruirelcuerpodelmismo.

Acontinuaciónsemuestracómoseríaelmétodoanteriorutilizandolainstrucciónfor-each.

publicintdarCantidadAprobados()

{

intvanAprobando=0;

for(Doublenota:notas)

{

if(nota>=3.0)

{

vanAprobando++;

}

}

returnvanAprobando;

}

Enresumen,sielproblemaplanteadocorrespondealpatrónderecorridototal,sedebeidentificarlavarianteyluegotomarlasdecisionesquedefinenlamaneradecompletarelesqueleto.

Tarea3

Objetivo:Generarhabilidadenelusodelpatróndealgoritmoderecorridototal.

EscribalosmétodosdelaclaseCursoqueresuelvenlossiguientesproblemas,loscualescorrespondenalasdosvariantesdelpatróndealgoritmoderecorridototal.

InstruccionesRepetitivas

266

Escribaunmétodoparamodificarlasnotasdelosestudiantesdelasiguientemanera:atodoslosqueobtuvieronmásde4,0,lesquita0,5.Atodoslosqueobtuvieronmenosde2,0,lesaumenta0,5.Atodoslosdemás,lesdejalanotasinmodificar:

publicvoidcambiarNotas()

{

}

Escribaunmétodoqueretornelamenornotadelcurso:

publicdoubledarMenorNota()

{

}

Escribaunmétodoqueindiqueencuálrangoseencuentralamayoríadelasnotasdelcurso.Losrangosestándefinidosdelasiguientemanera:rango1de0,0a1,99,rango2de2,0a3,49,rango3de3,5a5,0.Elmétododeberetornarelnúmerodelrango.

InstruccionesRepetitivas

267

publicintdarRangoConMasNotas()

{

}

5.4.2.PatróndeRecorridoParcial

Enalgunosproblemasdemanejodesecuenciasnoesnecesariorecorrertodosloselementosparalograrelobjetivopropuesto.Pienseenlasolucióndelossiguientesproblemas:

Informarsialgúnestudianteobtuvolanota5,0.Buscarelprimerestudianteconnotaigualacero.Indicarsimásde3estudiantesperdieronelcurso.Aumentarel10%enlanotadelprimerestudiantequehayasacadomásde4,0.

Entodosesoscasoshacemosunrecorridodelarreglo,peroéstedebeterminartanprontohayamosresueltoelproblema.Porejemplo,elmétodoqueinformasialgúnestudianteobtuvocincoenlanotadelcursodebesalirdelprocesoiterativotanprontolocaliceelprimerestudianteconesanota.Sólosinoloencuentra,vaallegarhastaelfinaldelasecuencia.

Unrecorridoparcialsecaracterizaporqueexisteunacondiciónquedebemosverificarencadaiteraciónparasabersidebemosdetenerelcicloovolverarepetirlo.

Enestepatrón,debemosadaptarelesqueletodelpatrónanteriorparaquetengaencuentalacondicióndesalida,delasiguientemanera:

InstruccionesRepetitivas

268

booleantermino=false;

for(inti=0;i<arreglo.length&&!termino;i++)

{

<cuerpo>

if(<yasecumplióelobjetivo>)

{

termino=true;

}

}

Primero,declaramosunavariabledetipobooleanparacontrolarlasalidadelciclo,ylainicializamosenfalse.Segundo,enlacondicióndelciclousamoselvalordelavariablequeacabamosdedefinir:sisuvaloresverdadero,nodebevolveraiterar.Tercero,enalgúnpuntodelcicloverificamossielproblemayahasidoresuelto(siyasecumplióelobjetivo).Siéseeselcaso,cambiamoselvalordelavariableaverdadero.

for(inti=0;i<arreglo.length&&!<condición>;i++)

{

<cuerpo>

}

Estepatróndeesqueletoesmássimplequeelanterior,perosólosedebeusarsilaexpresiónqueindicaqueyasecumplióelobjetivodelcicloessencilla.

Cuandoseaplicaelpatrónderecorridoparcial,elprimerpasoquesedebeseguiresidentificarlacondiciónqueindicaqueelproblemayafueresuelto.Conesainformaciónsepuedetomarladecisióndecuálesqueletodealgoritmoesmejorusar.

Ejemplo6

Objetivo:Mostrarelusodelpatrónderecorridoparcialpararesolverunproblema.

Enesteejemplosepresentantressolucionesposiblesalproblemadedecidirsialgúnestudianteobtuvocincoenlanotadelcurso.

InstruccionesRepetitivas

269

publicbooleanhayAlguienConCinco()

{

booleantermino=false;

for(inti=0;i<notas.length&&!termino;i++)

{

if(notas[i]==5.0)

{

termino=true;

}

}

returntermino;

}

Lacondiciónparanoseguiriterandoesqueseencuentreunanotaiguala5,0enlaposicióni.Alfinaldelmétodo,seretornaelvalordelavariable"termino",queindicasielobjetivosecumplió.Estofuncionaenestecasoparticular,porquedichavariabledicequeenelarregloseencontróunanotaigualalvalorbuscado.

publicbooleanhayAlguienConCinco()

{

inti=0;

while(i<notas.length&&notas[i]!=5.0)

{

i++;

}

returni<notas.length;

}

Estaeslasegundasoluciónposible,yevitaelusodelavariable"termino",perotienevariasconsecuenciassobrelainstruccióniterativa.Enlugardelainstrucciónforesmásconvenienteusarlainstrucciónwhile.Lacondicióndecontinuaciónenelcicloesquelai-ésimanotaseadiferentede5,0.Elmétododeberetornarverdaderosilavariableinollegóhastaelfinaldelarreglo,porqueestoquerríadecirqueencontróendichaposiciónunanotaigualacinco.

InstruccionesRepetitivas

270

publicbooleanhayAlguienConCinco()

{

for(inti=0;i<notas.length;i++)

{

if(notas[i]==5.0)

{

returntrue;

}

}

returnfalse;

}

Estaeslatercerasoluciónposible.Sidentrodelcicloyatenemoslarespuestadelmétodo,enlugardeutilizarlacondiciónparasalirdelciclo,lausamosparasalirdetodoelmétodo.Enlaúltimainstrucciónretornafalso,porquesillegaaesepuntoquieredecirquenoencontróningunanotaconelvalorbuscado.Estamaneradesalirdeunciclo,terminandolaejecucióndelmétodoenelqueésteseencuentra,sedebeusarconalgúncuidado,puestoquesepuedeproducircódigodifícildeentender.

Haymuchassolucionesposiblespararesolverunproblema.Unpatróndealgoritmosóloesunaguíaquesedebeadaptaralproblemaespecíficoyalestilopreferidodelprogramador.

Paraelpatrónderecorridoparcialaparecenlasmismasdosvariantesqueparaelpatrónderecorridototal(verejemplo7):

Enlaprimeravariantesemodificanloselementosdelarreglohastaqueunacondiciónsecumpla(porejemplo,encontrarlastresprimerasnotascon1,5yasignarles2,5).Enesecaso,enelcuerpodelmétodovalamodificaciónquehayquehacerlealelementoqueseencuentraenelíndiceactual,perosedebecontrolarquecuandohayallegadoalaterceramodificacióntermineelciclo.Enlasegundavariante,sedebentomarlasmismascuatrodecisionesquesetomabanconelpatrónderecorridototal,respectodelamaneradeacumularlainformaciónparacalcularlarespuestaqueestábuscandoelmétodo.

Ejemplo7

Objetivo:Mostrarelusodelpatrónderecorridoparcial,ensusdosvariantes.

EnesteejemplosepresentandosmétodosdelaclaseCurso,encadaunodeloscualesseilustraunadelasvariantesdelpatrónderecorridoparcial.

InstruccionesRepetitivas

271

Encontrarlasprimerastresnotasigualesa1,5yasignarles2,5:

publicvoidsubirNotas()

{

intnumNotas=0;

for(inti=0;i<notas.length&&numNotas<3;i++)

{

if(notas[i]==1,5)

{

numNotas++;

notas[i]=2,5;

}

}

}

Estemétodocorrespondealaprimeravariante,porquehaceunamodificacióndeloselementosdelarreglohastaqueunacondiciónsecumpla.Enelmétododelejemplo,debemoscontarelnúmerodemodificacionesquehacemos,paradetenernosalllegaralatercera.

Retornarlaposiciónenlasecuenciadelaterceranotaconvalor5,0.Sidichanotanoaparecealmenos3veces,elmétododeberetornarelvalor–1:

publicintdarTercerCinco()

{

intcuantosCincos=0;

intposicion=-1;

for(inti=0;i<notas.length&&posicion==-1;i++)

{

if(notas[i]==5,0)

{

cuantosCincos++;

if(cuantosCincos==3)

{

posicion=i;

}

}

}

returnposicion;

}

¿Cómoacumularinformación?Enestecasonecesitamosdosvariablesparaacumularlainformación:laprimeraparallevarelnúmerodenotasigualesa5,0quehanaparecido(cuantosCincos),lasegundaparaindicarlaposicióndelaterceranota5,0(posicion).¿Cómoinicializarelacumulado?LavariablecuantosCincosdebecomenzaren0.Lavariableposiciondebecomenzarenmenos1.

InstruccionesRepetitivas

272

¿Condiciónparacambiarelacumulado?Silanotaactuales5,0debemoscambiarnuestroacumulado.¿Cómomodificarelacumulado?DebecambiarlavariablecuantosCincos,incrementándoseen1.Sieseltercer5,0delasecuencia,lavariableposiciondebecambiarsuvalor,tomandoelvalordelíndiceactual.

Tarea4

Objetivo:Generarhabilidadenelusodelpatróndealgoritmoderecorridoparcial.

EscribalosmétodosdelaclaseCursoqueresuelvenlossiguientesproblemas,loscualescorrespondenalasdosvariantesdelpatróndealgoritmoderecorridoparcial.

Reemplazartodaslasnotasdelcursopor0,0,hastaqueaparezcalaprimeranotasuperiora3,0.

publicvoidcambiarNotasACero()

{

}

Calcularelnúmeromínimodenotasdelcursonecesariasparaquelasumasupereelvalor30,recorriéndolasdesdelaposición0enadelante.Sialsumartodaslasnotasnosellegaaesevalor,elmétododeberetornar–1.

publicintsumadasDanTreinta()

{

}

InstruccionesRepetitivas

273

5.4.3.PatróndeDobleRecorrido

Elúltimodelospatronesquevamosaverenestecapítuloeseldedoblerecorrido.Estepatrónseutilizacomosolucióndeaquellosproblemasenloscuales,porcadaelementodelasecuencia,sedebehacerunrecorridocompleto.Pienseenelproblemadeencontrarlanotaqueapareceunmayornúmerodevecesenelcurso.Lasoluciónevidenteestomarlaprimeranotayhacerunrecorridocompletodelarreglocontandoelnúmerodevecesqueéstavuelveaaparecer.Luego,haríamoslomismoconlosdemáselementosdelarregloyescogeríamosalfinalaquéllaqueaparezcaunmayornúmerodeveces.

Elesqueletobásicodelalgoritmoconelqueseresuelvenlosproblemasquesiguenestepatróneselsiguiente:

for(intindice1=0;indice1<arreglo.length;indice1++)

{

for(intindice2=0;indice2<arreglo.length;indice2++)

{

<cuerpodelciclointerno>

}

<cuerpodelcicloexterno>

}

Elciclodeafueraestácontroladoporlavariable"indice1",mientrasqueelciclointernoutilizalavariable"indice2".Dentrodelcuerpodelciclointernosepuedehacerreferenciaalavariable"indice1".

Lasvariantesylasdecisionessonlasmismasqueidentificamosenlospatronesanteriores.Laestrategiadesoluciónconsisteenconsiderarelproblemacomodosproblemasindependientes,yaplicarlospatronesantesvistos,talcomosemuestraenelejemplo8.

Ejemplo8

Objetivo:Mostrarelusodelpatróndealgoritmoderecorridototalcondoblerecorrido.

EnesteejemplosemuestraelmétododelaclaseCursoqueretornalanotaqueapareceunmayornúmerodeveces.Paraescribirloprocederemosporetapas,lascualessedescribenenlapartederecha.

InstruccionesRepetitivas

274

publicdoubledarNotaMasRecurrente()

{

doublenotaMasRecurrente=0.0;

for(inti=0;i<notas.length;i++)

{

for(intj=0;j<notas.length;j++)

{

//Porcompletar

}

}

returnnotaMasRecurrente;

}

Primeraetapa:armarlaestructuradelmétodoapartirdelesqueletodelpatrón.Utilizamoslasvariablesiyjparallevarlosíndicesencadaunodelosciclos.DecidimosqueelresultadolovamosadejarenunavariablellamadanotaMasRecurrente,lacualretornamosalfinaldelmétodo.Unavezconstruidalabasedelmétodo,identificamoslosdosproblemasquedebemosresolverensuinterior:(1)contarelnúmerodevecesqueapareceenelarregloelvalorqueestáenlacasillai;(2)encontrarelmayorvalorentrelosquesoncalculadosporelprimerproblema.

publicdoubledarNotaMasRecurrente()

{

doublenotaMasRecurrente=0.0;

for(inti=0;i<notas.length;i++)

{

doublenotaBuscada=notas[i];

intcontador=0;

for(intj=0;j<notas.length;j++)

{

if(notas[j]==notaBuscada)

{

contador++;

}

}

//Porcompletar

}

returnnotaMasRecurrente;

}

InstruccionesRepetitivas

275

Segundaetapa:Resolvemoselprimerodelosproblemasidentificados,usandoparaesoelciclointerno.Parafacilitareltrabajo,vamosadejarenlavariablenotaBuscada,lanotaparalacualqueremoscontarelnúmerodeocurrencias.Dichavariablelainicializamosconlanotadelacasillai.Usamosunasegundavariablellamadacontadorparaacumularallíelnúmerodevecesqueaparezcaelvalorbuscadodentrodelarreglo.DichovalorseráincrementadocuandonotaBuscada==notas[j].Alfinaldelciclo,enlavariablecontadorquedaráelnúmerodevecesqueelvalordelacasillaiapareceentodoelarreglo.

publicdoubledarNotaMasRecurrente()

{

doublenotaMasRecurrente=0.0;

intcantidadOcurrencias=0;

for(inti=0;i<notas.length;i++)

{

doublenotaBuscada=notas[i];

intcontador=0;

for(intj=0;j<notas.length;j++)

{

if(notas[j]==notaBuscada)

{

contador++;

}

}

if(contador>cantidadOcurrencias)

{

notaMasRecurrente=notaBuscada;

cantidadOcurrencias=contador;

}

}

returnnotaMasRecurrente;

}

Terceraetapa:Usamoselcicloexternoparaencontrarlanotaquemásvecesaparece.Usamosparaesodosvariables:notaMasRecurrentequeindicalanotaquehastaelmomentomásvecesaparece,ycantidadOcurrenciasparasabercuántasvecesaparecedichanota.Luegodefinimoselcasoenelcualdebemoscambiarelacumulado:siencontramosunvalorqueaparezcamásvecesqueelqueteníamoshastaelmomento(contador>

InstruccionesRepetitivas

276

cantidadOcurrencias)debemosactualizarlosvaloresdenuestrasvariables.

Engeneral,estepatróndicequepararesolverunproblemaqueimpliqueundoblerecorrido,primerodebemosidentificarlosdosproblemasquequeremosresolver(unoconcadaciclo)y,luego,debemostratarderesolverlosindependientemente,usandolospatronesderecorridototaloparcial.

Sipararesolverunproblemasenecesitauntercercicloanidado,debemosescribirmétodosseparadosqueayudenaresolvercadaproblemaindividualmente,talcomoseplanteaenelnivel4,porquelasolucióndirectaesmuycomplejaypropensaaerrores.

Tarea5

Objetivo:Generarhabilidadenelusodelpatróndealgoritmodedoblerecorrido.

EscribaelmétododelaclaseCursoqueresuelveelsiguienteproblema,quecorrespondealpatróndealgoritmodedoblerecorrido.

Calcularunanotadelcurso(sihayvariasquelocumplanpuederetornarcualquiera)talquelamitaddelasnotasseanmenoresoigualesaella.

publicdoublenotaMediana()

{

}

InstruccionesRepetitivas

277

6.CasodeEstudioNº2:ReservasenunVueloUnclientequierequeconstruyamosunprogramaparamanejarlasreservasdeunvuelo.Sesabequeelavióntiene50sillas,delascuales8sondeclaseejecutivaylasdemásdeclaseeconómica.Lassillasejecutivasseacomodanenfilasdecuatro,separadasenelmedioporelcorredor.Lassillaseconómicasseacomodanenfilasdeseis,tresacadaladodelcorredor.

Cuandounpasajerollegaasolicitarunasilla,indicasusdatospersonalesysuspreferenciasconrespectoalaposicióndelasillaenelavión.Losdatosdelpasajeroqueleinteresanalaaerolíneasonelnombreylacédula.Paradarlaubicacióndeseada,elpasajeroindicalaclaseylaubicacióndelasilla.Estapuedeser,enelcasodelasejecutivas,ventanaypasillo,yeneldelaseconómicas,ventana,pasilloycentro.Laasignacióndelasillaenelaviónsehaceenordendellegada,tomandoencuentalaspreferenciasanterioresylasdisponibilidades.

Lainterfazdeusuariodelprogramaalaquesellegódespuésdenegociarconelclientesemuestraenlafigura3.6.

CasodeEstudioNº2:ReservasenunVuelo

278

Fig.3.6Interfazdeusuarioparaelcasodeestudiodelavión

Enlapartesuperiordelaviónaparecenlas8sillasejecutivas.Enlaparteinferior,aparecenlas42sillaseconómicas,conuncorredorenlamitad.Seofrecenlasdistintasopcionesdelprogramaatravésdelosbotonesquesepuedenobservarenlapartesuperiordelaventana.Cuandounasillaestáocupada,éstaapareceráindicadaeneldibujodelaviónconuncolorespecial.Cadasillatieneasignadounnúmeroqueesúnico.Lasilla7,porejemplo,estáenprimeraclase,enelcorredordelasegundafila.

CasodeEstudioNº2:ReservasenunVuelo

279

6.1.ComprensióndelosRequerimientosNosvamosaconcentrarenelsiguienterequerimientofuncional:

Nombre R1-Asignarunasillaaunpasajero.

Resumen Asignaunasillaaunpasajerosegúnsuspreferencias.Estassonclase(EjecutivaoEconómica)yubicación(Ventana,CentrooPasillo).

Entradas (1)nombredelpasajero,(2)céduladelpasajero,(3)clasedelasilla,(4)ubicacióndelasilla.

ResultadosSemarcacomoasignadaunadelassillasdisponiblesenelavión,dependiendodelaclaseyubicaciónelegida.Encasodequetodaslassillasesténasignadas,semuestraunmensajedeerror.

6.2.ComprensióndelMundodelProblemaPodemosidentificartresentidadesdistintasenelmundo:avión,sillaypasajero.Locualnosllevaaldiagramadeclasesquesemuestraenlafigura3.7.

Fig.3.7Diagramadeclasesparaelcasodeestudiodelavión

CasodeEstudioNº2:ReservasenunVuelo

280

Enestediagramasepuedeleerlosiguiente:

Unasillapuedeserejecutivaoeconómica(unenumeradorconlasdosconstantesdefinidasparalaposibleclasedelaSilla),puedeestarlocalizadaenpasillo,corredorocentro(unenumeradorcontresconstantesdefinidasparalaposibleubicacióndelaSilla),ytieneunidentificadorúnicoqueesunvalornumérico.EntreSillayPasajerohayunaasociaciónopcional(0..1).Silaasociaciónestápresenteseinterpretacomoquelasillaestáocupadayseconoceelpasajeroqueallíseencuentra.Sinoestápresente(valenull)seinterpretacomoquelasillaestádisponible.Unpasajeroseidentificaconlacédulaytieneunnombre.Unavióntiene8sillasejecutivas(constanteSILLAS_EJECUTIVASdelaclaseAvion)y42sillaseconómicas(constanteSILLAS_ECONOMICASdelaclaseAvion).FíjesecómoseexpresalacardinalidaddeunaasociaciónenUML.

6.3.DiseñodelaSoluciónVamosadividirelproyectoen3paquetes,siguiendolaarquitecturaplanteadaenelprimerniveldellibro.Lospaquetesson:

uniandes.cupi2.avion.interfaz

uniandes.cupi2.avion.test

uniandes.cupi2.avion.mundo

Laprincipaldecisióndediseñodelprogramaserefierealamaneraderepresentarelgrupodesillasdelavión.Paraestovamosamanejardosarreglosdeobjetos.Unocon8posicionesquetendrálosobjetosdelaclaseSillaquerepresentanlassillasdelaclaseejecutiva,yotroarreglode42posicionesconlosobjetospararepresentarlassillaseconómicas.

Enlasseccionesquesiguenpresentaremoslasdistintasclasesdelmodelodelmundoqueconstituyenlasolución.Comenzamosporlaclasemássencilla(laclasePasajero)yterminamosporlaclasequetienelaresponsabilidaddemanejarlosgruposdeatributos(laclaseAvion),endondetendremoslaoportunidaddeutilizarlospatronesdealgoritmovistosenlasseccionesanteriores.

6.4.LaClasePasajeroTarea6

Objetivo:HacerladeclaraciónenJavadelaclasePasajero.

CasodeEstudioNº2:ReservasenunVuelo

281

CompleteladeclaracióndelaclasePasajero,incluyendosusatributos,elconstructorylosmétodosqueretornanlacédulayelnombre.Puedeguiarseporeldiagramadeclasesqueapareceenlafigura3.7.

publicclassPasajero

{

//-----------------------------------

//Atributos

//-----------------------------------

//-----------------------------------

//Constructor

//-----------------------------------

publicPasajero(StringpCedula,StringpNombre)

{

}

//-----------------------------------

//Métodos

//-----------------------------------

publicStringdarCedula()

{

}

publicStringdarNombre()

{

CasodeEstudioNº2:ReservasenunVuelo

282

}

}

6.5.LaClaseSilla

Tarea7

Objetivo:CompletarladeclaracióndelaclaseSilla.

CompletelasdeclaracionesdelosatributosylasenumeracionesdelaclaseSillaydesarrollelosmétodosqueselepidenparaestaclase.

CasodeEstudioNº2:ReservasenunVuelo

283

publicclassSilla

{

//-------------------------------------------

//Enumeraciones

//-------------------------------------------

/**

*Enumeradoresparalasclasesdesilla.

*/

publicenumClase

{

/**

*Representalaclaseejecutiva.

*/

EJECUTIVA,

/**

*Representalaclaseeconómica.

*/

ECONOMICA

}

/**

*Enumeradoresparalasubicacionesdelassillas.

*/

publicenumUbicacion

{

/**

*Representalaubicaciónventana.

*/

VENTANA,

/**

*Representalaubicacióncentro.

*/

/**

*Representalaubicaciónpasillo.

*/

}

...

}

Sedeclaraunenumeradorcondosconstantesparaelatributoclasedelasilla(EJECUTIVA,ECONOMICA).Sedeclaraunenumeradorcontresconstantespararepresentarlastresubicacionesposiblesdeunasilla(VENTANA,CENTRAL,PASILLO).

CasodeEstudioNº2:ReservasenunVuelo

284

publicclassSilla

{

...

//-------------------------------------------

//Atributos

//-------------------------------------------

privateintnumero;

privateClaseclase;

privateUbicacionubicacion;

privatePasajeropasajero;

...

}

Sedeclaranenlaclasecuatroatributos:(1)elnúmerodelasilla,(2)laclasedelasilla,(3)suubicacióny(4)elpasajeroqueopcionalmentepuedeocuparlasilla.Elatributo"pasajero"debetenerelvalornullsinohayningúnpasajeroasignadoalasilla.

publicSilla(intpNumero,ClasepClase,UbicacionpUbicacion)

{

numero=pNumero;

clase=pClase;

ubicacion=pUbicacion;

pasajero=null;

}

Enelconstructorseinicializanlosatributosapartirdelosvaloresqueserecibencomoparámetro.Seinicializaelatributopasajeroennull,paraindicarquelasillaseencuentravacía.

CasodeEstudioNº2:ReservasenunVuelo

285

publicclassSilla

{

...

publicvoidasignarPasajero(PasajeropPasajero)

{

}

...

}

Asignalasillaalpasajero"pPasajero".

publicclassSilla

{

...

publicvoiddesasignarSilla()

{

}

...

}

Quitaalpasajeroqueseencuentraenlasilla,dejándoladesocupada.

CasodeEstudioNº2:ReservasenunVuelo

286

publicclassSilla

{

...

publicbooleansillaAsignada()

{

}

...

}

Informasilasillaestáocupada.

publicclassSilla

{

...

publicintdarNumero()

{

}

...

}

Retornaelnúmerodelasilla.

CasodeEstudioNº2:ReservasenunVuelo

287

publicclassSilla

{

...

publicClasedarClase()

{

}

...

}

Retornalaclasedelasilla.

publicclassSilla

{

...

publicUbicaciondarUbicacion()

{

}

...

}

Retornalaubicacióndelasilla.

publicclassSilla

{

...

publicPasajerodarPasajero()

{

}

...

}

Retornaelpasajerodelasilla.

6.6.LaClaseAvion

CasodeEstudioNº2:ReservasenunVuelo

288

Ejemplo9

Objetivo:MostrarlasdeclaracionesyelconstructordelaclaseAvion.

EnesteejemplosepresentanlasdeclaracionesdelosatributosylasconstantesdelaclaseAvion,lomismoquesumétodoconstructor.

publicclassAvion

{

//--------------------------------------------

//Constantes

//--------------------------------------------

publicfinalstaticintSILLAS_EJECUTIVAS=8;

publicfinalstaticintSILLAS_ECONOMICAS=42;

...

}

Condosconstantesrepresentamoselnúmerodesillasdecadaunadelasclases.

publicclassAvion

{

...

//--------------------------------------------

//Atributos

//--------------------------------------------

privateSilla[]sillasEjecutivas;

privateSilla[]sillasEconomicas;

...

}

LaclaseAviontienedoscontenedorasdetamañofijodesillas:una,de42posiciones,conlassillasdeclaseeconómica,yotra,de8posiciones,conlassillasdeclaseejecutiva.Sedeclaranlosdosarreglos,utilizandolamismasintaxisqueutilizamosenelcasodelasnotasdelcurso.Laúnicadiferenciaesque,enlugardecontenervaloresdetiposimple,vanacontenerobjetosdelaclaseSilla.

Acontinuaciónapareceunfragmentodelconstructordelaclase.Enlasprimerasdosinstruccionesdelconstructor,creamoslosarreglos,informandoelnúmerodecasillasquedebencontener.Paraesousamoslasconstantesdefinidasenlaclase.

CasodeEstudioNº2:ReservasenunVuelo

289

Despuésdehaberreservadoelespacioparalosdosarreglos,procedemosacrearlosobjetosquerepresentancadaunadelassillasdelaviónylosvamosponiendoenlarespectivacasilla.

Estainicializaciónsepodríahaberhechoconvariosciclos,peroelcódigoresultaríaunpocodifícildeexplicar.

publicAvion()

{

sillasEjecutivas=newSilla[SILLAS_EJECUTIVAS];

sillasEconomicas=newSilla[SILLAS_ECONOMICAS];

//Creacióndelassillasdeclaseejecutiva

sillasEjecutivas[0]=newSilla(1,Clase.EJECUTIVA,Ubicacion.VENTANA);

sillasEjecutivas[1]=newSilla(2,Clase.EJECUTIVA,Ubicacion.PASILLO);

sillasEjecutivas[2]=newSilla(3,Clase.EJECUTIVA,Ubicacion.PASILLO);

sillasEjecutivas[3]=newSilla(4,Clase.EJECUTIVA,Ubicacion.VENTANA);

sillasEjecutivas[4]=newSilla(5,Clase.EJECUTIVA,Ubicacion.VENTANA);

sillasEjecutivas[5]=newSilla(6,Clase.EJECUTIVA,Ubicacion.PASILLO);

sillasEjecutivas[6]=newSilla(7,Clase.EJECUTIVA,Ubicacion.PASILLO);

sillasEjecutivas[7]=newSilla(8,Clase.EJECUTIVA,Ubicacion.VENTANA);

//Creacióndelassillasdeclaseeconómica

sillasEconomicas[0]=newSilla(9,Clase.ECONOMICA,Ubicacion.VENTANA);

sillasEconomicas[1]=newSilla(10,Clase.ECONOMICA,Ubicacion.CENTRAL);

sillasEconomicas[2]=newSilla(11,Clase.ECONOMICA,Ubicacion.PASILLO);

...

}

Yaconlasdeclaracioneshechasyconelconstructorimplementado,estamoslistosparacomenzaradesarrollarlosdistintosmétodosdelaclase.Peroantesdeempezar,queremoshablarunpocodelasdiferenciasqueexistenentreunarreglodevaloresdetiposimple(comoeldelcasodeestudiodelasnotas)yunarreglodeobjetos(comoeldelcasodelavión).

Paraempezar,enlafigura3.8asemuestraunainstanciadelaclaseSillaocupadaporunpasajero.Enlafigura3.8bsemuestraunobjetodelaclaseSillaqueseencuentravacía.Enlafigura3.8cseilustraunposiblecontenidodelarreglodesillasejecutivas(usandoundiagramadeobjetos).

CasodeEstudioNº2:ReservasenunVuelo

290

Fig.3.8Ejemplodelcontenidodelarreglodesillasejecutivas

Figura3.8a:enlasilladeprimeraclasenúmero6,situadaenelcorredor,estásentadoelSr.JoséSánchezconcédulaNo.1234.Figura3.8b:lasilladeclaseeconómicanúmero10,situadaenelcentro,estádesocupada.

CasodeEstudioNº2:ReservasenunVuelo

291

Figura3.8c:cadacasilladelarreglotieneunobjetodelaclaseSilla(inclusosilasillaestádesocupada).Lassillasocupadastienenunaasociaciónconelobjetoquerepresentaalpasajeroquelaocupa.*Enlosarreglosdeobjetossealmacenanreferenciasalosobjetos,enlugardelosobjetosmismos.ConlasintaxissillasEjecutivas[x]podemoshacerreferenciaalobjetodelaclaseSillaqueseencuentraenlacasillax.Siqueremosllegarhastaelpasajeroqueseencuentraenalgunapartedelavión,debemossiemprepasarporlasillaqueocupa.Nohayotramanerade"navegar"hastaél.

Yateniendounavisualizacióndeldiagramadeobjetosdelcasodeestudio,esmásfácilcontestarlassiguientespreguntas:

¿Cómosellamaun

métododeunobjetoqueestáenunarreglo?

Porejemplo,dentrodelaclaseAvion,parapreguntarsilasillaqueestáenlaposición0delarreglodesillasejecutivasestá

ocupada,seutilizalasintaxis:sillasEjecutivas[0].sillaAsignada().Estasintaxisessólounaextensióndelasintaxisqueya

veníamosutilizando.Loúnicoquesedebetenerencuentaesquecadavezquehacemosreferenciaaunacasilla,estamos

hablandodeunobjeto,másquedeunvalorsimple.

¿Losobjetosqueestánenunarreglosepuedenguardarenunavariable?

Tantolasvariablescomolascasillasdelosarreglosguardanúnicamentereferenciasalosobjetos.Sisehacelasiguienteasignación:SillasillaTemporal=sillasEjecutivas[0];tantolavariablesillaTemporalcomolacasilla0delarregloestaránhaciendoreferenciaalmismoobjeto.Debequedarclaroqueelobjetonoseduplica,sinoqueambosnombreshacenreferenciaalmismoobjeto.

¿Quépasaconelobjetoqueestásiendoreferenciadodesdeunacasillasiasignonullaesaposicióndelarreglo?

Siguardóunareferenciaaeseobjetoenalgúnotrolado,puedeseguirusandoelobjetoatravésdedichareferencia.Sinoguardóunareferenciaenningúnlado,elrecolectordebasuradeJavadetectaqueyanoloestáusandoyrecuperalamemoriaqueelobjetoestabautilizando.¡Adiósobjeto!

Ejemplo10

Objetivo:Mostrarlasintaxisqueseusaparamanipulararreglosdeobjetos.

EnesteejemplosemuestraelcódigodeunmétododelaclaseAvionquepermiteeliminartodaslasreservasdelavión.Noformapartedelosrequerimientosfuncionales,peronosvaapermitirmostrarunaaplicacióndelpatrónderecorridototal.

CasodeEstudioNº2:ReservasenunVuelo

292

publicvoideliminarReservas()

{

for(inti=0;i<SILLAS_EJECUTIVAS;i++)

{

sillasEjecutivas[i].desasignarSilla();

}

for(inti=0;indice<SILLAS_ECONOMICAS;i++)

{

sillasEconomicas[i].desasignarSilla();

}

}

Estemétodoeliminatodaslasreservasquehayenelavión.Notequepodemosutilizarlamismavariablecomoíndiceenlosdosciclos.Larazónesqueenlainstrucciónfor,alterminardeejecutarelciclo,sedestruyenlasvariablesdeclaradasdentrodeély,porestarazón,podemosvolverautilizarelmismonombreparalavariabledelsegundociclo.Elmétodoutilizaelpatrónderecorridototaldosveces,unaporcadaunodelosarreglosdelavión.

Yavimostodalateoríaconcernientealmanejodelosarreglos(estructurascontenedorasdetamañofijo).Loquesigueesaplicarlospatronesdealgoritmoquevimosunasseccionesatrás,paraimplementarlosmétodosdelaclaseAvion.

Tarea8

Objetivo:DesarrollarlosmétodosdelaclaseAviónquenospermitanimplementarlosrequerimientosfuncionalesdelcasodeestudio.

Paracadaunodelosproblemasqueseplanteanacontinuación,escribaelmétodoqueloresuelve.Noolvideidentificarprimeroelpatróndealgoritmoquesenecesitayusarlasguíasquesedieronenseccionesanteriores.

Calcularelnúmerodesillasejecutivasocupadasenelavión:

CasodeEstudioNº2:ReservasenunVuelo

293

publicintcontarSillasEjecutivasOcupadas()

{

}

Localizarlasillaenlaqueseencuentraelpasajeroidentificadoconlacédulaqueseentregacomoparámetro.Sinohayningúnpasajeroenclaseejecutivaconesacédula,elmétodoretornanull.

publicSillabuscarPasajeroEjecutivo(StringpCedula)

{

}

Localizarunasillaeconómicadisponible,enunalocalizacióndada(ventana,centroopasillo).Sinoexisteninguna,elmétodoretornanull:

publicSillabuscarSillaEconomicaLibre(UbicacionpUbicacion)

{

}

CasodeEstudioNº2:ReservasenunVuelo

294

Asignaralpasajeroqueserecibecomoparámetrounasillaenclaseeconómicaqueestélibre(enlaubicaciónpedida).Sielprocesotieneéxito,elmétodoretornaverdadero.Encasocontrario,retornafalso:

publicbooleanasignarSillaEconomica(UbicacionpUbicacion,PasajeropPasajero)

{

}

Anularlareservaenclaseejecutivaqueteníaelpasajeroconlacéduladada.Retornaverdaderosielprocesotieneéxito:

publicbooleananularReservaEjecutivo(StringpCedula)

{

}

Contarelnúmerodepuestosdisponiblesenunaventana,enlazonaeconómicadelavión:

CasodeEstudioNº2:ReservasenunVuelo

295

publicintcontarVentanasEconomica()

{

}

Informarsienlazonaeconómicadelaviónhaydospersonasquesellamenigual.Patróndedoblerecorrido:

publicbooleanhayDosHomonimosEconomica()

{

}

6.7.Lainstrucciónfor-eachElesqueletodelpatrónderecorridototaltambiénpuededefinirseconlainstrucciónfor-each,lacualesunavariacióndelainstrucciónforquesepuederesumirenelsiguientefragmentodecódigo:

for(NombreClaseelemento:arreglo)

{

<cuerpo>

}

Lainstrucciónfor-eachpermiterecorrertodosloselementosdeunarreglo.Deestamanera,paracadaobjetoexistenteenelarreglo,seejecutanlasinstruccionesqueseencuentranenelcuerpodelciclo.Encadaiteración,lavariableelementovaareferenciaralobjetoactual,

CasodeEstudioNº2:ReservasenunVuelo

296

permitiendoquesehaganlasoperacionesnecesariassobreeste.Caberesaltarqueenelfor-eachnoesnecesarioutilizaruníndice,yaquelainstrucciónseencargadepasarporcadaunodeloselementosdeformaautomática.Esporestoquelainstrucciónfor-eachseutilizaprincipalmenteenproblemasquerequieranunrecorridosobretodosloselementosdelarreglo(recorridototal).

Ejemplo11

Objetivo:Mostrarlasintaxisqueseusaparalainstrucciónfor-each.

EnesteejemplosemuestraelcódigodeunmétododelaclaseAvion,elcualpermitecontarlacantidaddesillaseconómicasocupadas,conelfinmostrarunaaplicacióndelpatrónderecorridototalutilizandolainstrucciónfor-each.Sinohayningunasillaeconómicaocupada,elmétodoretornacero.

Acontinuaciónsemuestraelmétodoutilizandolainstrucciónfor:

publicintcontarSillasEconomicasOcupadas()

{

intcontador=0;

Sillasilla=null;

for(inti=0;i<SILLAS_ECONOMICAS;i++)

{

silla=sillasEconomicas[i];

if(silla.sillaAsignada())

{

contador++;

}

}

returncontador;

}

Laimplementacióndelmétodoutilizandolainstrucciónfor-eacheslasiguiente:

publicintcontarSillasEconomicasOcupadas()

{

intcontador=0;

for(SillasillaEconomica:sillasEconomicas)

{

if(sillaEconomica.sillaAsignada())

{

contador++;

}

}

returncontador;

}

CasodeEstudioNº2:ReservasenunVuelo

297

Tarea9

Objetivo:DesarrollarlosmétodosdelaclaseAviónquenospermitanimplementarlosrequerimientosfuncionalesdelcasodeestudioutilizandolainstrucciónfor-each.

Paracadaunodelosproblemasqueseplanteanacontinuación,escribaelmétodoqueloresuelve.Entodosloscasossonproblemasquerequierenunrecorridototalyquesedebenresolverutilizandolainstrucciónfor-each.

Calcularelnúmerodesillaseconómicaslibresenelavión:

publicintcontarSillasEconomicasLibres()

{

}

Contarelnúmerodepuestosdisponiblesenelpasillo,enlazonaejecutivadelavión:

publicintcontarPasilloEjecutivas()

{

}

Desocuparavión.Seencargadedesocupartodaslassillasdelavíon:

CasodeEstudioNº2:ReservasenunVuelo

298

publicvoiddesocuparAvion()

{

}

CasodeEstudioNº2:ReservasenunVuelo

299

7.CasodeEstudioNº3:TiendadeLibrosSequiereconstruirunaaplicaciónquepermitaadministrarunatiendadelibros.Latiendatieneuncatálogodelibros,quesonloslibrosquedeseaponeralaventa.Laaplicaciónpermiteabastecerlatiendaconejemplaresdeloslibrosdelcatálogoyvenderlos.Adicionalmentepermitesabercuántodinerosetieneencaja,empezandoconunainversióninicialde$1.000.000.

Decadalibroseconoce:

ISBN.Identificadordellibro.NopuedenexistirdoslibrosenlatiendaconelmismoISBN.Título.Elnombredellibro.Imagen.Laimagendellibro.Preciodecompra:Valorpagadoporlacompradecadaejemplarenlatienda.Preciodeventa:Valorporelcualsevendecadaejemplardellibro.Cantidadactual.Cantidadactualdeejemplaresquetienelatienda.Solopuedesermodificadamediantelaventaoelabastecimiento.

Adicionalmente,decadalibroseconocentodaslastransaccionesquesehanrealizadosobreél.Decadatransacciónseconoce:

Eltipodetransacción.Puedeserventaoabastecimiento.Lafechaderealización.Lacantidaddeejemplaresincluidosenlatransacción.

Elabastecimientodelibrospermiteaumentarlacantidadactualdeejemplaresdellibroyregistrarunatransaccióndetipoabastecimiento.

Laventadelibrospermitedisminuirlacantidadactualdeejemplaresdellibroyregistrarunatransaccióndeventa.Estatransacciónsolosepodrárealizarsilacantidadactualdeejemplaresesmayoralacantidadquesequierevender.

Enlafigura3.9aparecelainterfazdeusuarioquesetieneprevistaparaelprogramaquesevaaconstruir.

CasodeEstudioNº3:UnaTiendadeLibros

300

Fig.3.9Interfazdeusuariodelatiendadelibros

Lainterfazestádivididaencuatrozonas:unaparamostrareldineroquehayenlacaja,unaparaqueelusuariopuedaverellistadodelibrosdisponiblesenelcatálogo(dondetambiénpuederegistrarnuevoslibros),unaparamostrarlainformacióndeunlibrodelcatálogo,yunaparalasbúsquedasyconsultasrealizadassobreelcatálogodelibros.Enlaimagendelejemplo,aparecentreslibrosenelcatálogo.Paraagregarlibrosalatienda,seusaelbotónRegistrar.AlabastecimientodelibrosehaceatravésdelbotónAbastecer,laventadelibrosatravésdelbotónVenderylaeliminacióndeunlibroatravésdelbotónEliminar.EnlazonadeconsultasybúsquedassepuedebuscarunlibroporISBNotítulo,yconsultarellibromáseconómico,elmáscostosoyelmásvendido.

7.1.ComprensióndelosRequerimientosLosrequerimientosfuncionalesdeestecasodeestudioson10:

CasodeEstudioNº3:UnaTiendadeLibros

301

1. Registrarunlibroenelcatálogo.2. Eliminarunlibrodelcatálogo.3. Buscarunlibroportítulo.4. BuscarunlibroporISBN.5. Abastecerejemplaresdeunlibro.6. Venderejemplaresdeunlibro.7. Calcularlacantidaddetransaccionesdeabastecimientodeunlibroparticular.8. Buscarellibromáscostoso.9. Buscarellibromenoscostoso.10. Buscarellibromásvendido.

Tarea10

Objetivo:Entenderelproblemadelcasodeestudio.

Leadetenidamenteelenunciadodelcasodeestudioycompleteladocumentacióndelosprimerostresrequerimientosfuncionales.

Requerimientofuncional1

Nombre R1-Registrarunlibroenelcatálogo.

Resumen

Registraunlibroenelcatálogoconsutítulo,códigoISBN,preciodecompraypreciodeventa.Lacantidadactualdeejemplaresenelmomentoderegistroesceroyellibrosecreasintransaccionesregistradas.Elresultadoeselnuevolibrocreadoencasodequesisehayapodidoregistrar,encasocontrario,elresultadodebeseresnulo.

Entradas (1)títulodellibro,(2)ISBNdellibro,(3)preciodecompradellibro,(4)preciodeventadellibro,(5)imagendellibro.

Resultado Elcatálogohasidoactualizadoycontieneelnuevolibro.

Requerimientofuncional2

CasodeEstudioNº3:UnaTiendadeLibros

302

Nombre

Resumen

Entradas

Resultado

Requerimientofuncional3

CasodeEstudioNº3:UnaTiendadeLibros

303

Nombre

Resumen

Entradas

Resultado

7.2.ComprensióndelMundodelProblemaEnelmundodelproblemapodemosidentificartresentidades(verfigura3.10):

Latiendadelibros(claseTiendaDeLibros)Unlibro(claseLibro)Unatransacción(claseTransaccion)

Todaslascaracterísticasdelasentidadesidentificadasenelmodeloconceptualsepuedenmodelarconloselementosquehemosvistohastaahoraenellibro,conexcepcióndelgrupodelibrosdelcatálogoyellistadodetransaccionesdeunlibro.Ladificultadquetenemosesquenopodemospredecirlacardinalidaddedichogrupodeelementosy,porestarazón,elmodeladoconarreglospuedenoserelmásadecuado.

CasodeEstudioNº3:UnaTiendadeLibros

304

¿Enquésediferenciadelcasodelavión?Ladiferenciaradicaenqueelavióntieneunasdimensionespredefinidas(42sillasenclaseeconómicay8enclaseejecutiva)quenovanacambiardurantelaejecucióndelprograma(noexisteunrequerimientodeagregarunasillaalavión).Enelcasodelatiendadelibros,seplanteaqueelcatálogopuedetenercualquiercantidaddelibrosyqueunlibropuedetenercualquiercantidaddetransacciones.Siusáramosarreglospararepresentardichainformación,¿dequédimensióndeberíamoscrearlos?¿Quéhacemossisellenaelarreglodelibrosdelcatálogo?

Fig.3.10Modeloconceptualparaelcasodeestudiodelatiendadelibros

Lasoluciónaeseproblemaseráeltemadeestapartefinaldelnivel,enlacualpresentamoslascontenedorasdetamañovariable,lamaneraenqueseusananiveldemodeladodelmundoylaformaenqueseincorporanenlosprogramasescritosenJava.

Porahoradémosleunamiradaaldiagramadeclasesdelafigura3.10yrecorramoscadaunadelasentidadesidentificadas:

Unatiendadelibrostieneuncatálogo(asísellamalaasociación),quecorrespondeaungrupodelongitudindefinidadelibros(representadoporel*).Unlibrotienecincoatributos:untítulo,unISBN,unpreciodecompra,unpreciodeventayunaimagen.Unlibrotieneungrupodetransacciones(asísellamalaasociación)delongitud

CasodeEstudioNº3:UnaTiendadeLibros

305

indefinida.Cadatransacciónesdetipoabastecimientooventa.Cadatransaccióntieneeltipo(abastecimientooventa),lacantidaddeejemplaresylafecha.

CasodeEstudioNº3:UnaTiendadeLibros

306

8.ContenedorasdeTamañoVariableEnmuchosproblemasnecesitamosrepresentargruposdeatributosparaloscualesnoconocemossutamañomáximo.Enelcasodelatiendadelibros,porejemplo,elcatálogopodríatener100ó10.000librosdistintos.Parapoderrepresentarymanejaresetipodecaracterísticas,tenemoslascontenedorasdetamañovariable.

EneldiagramadeclasesdeUML,lasasociacionesquetienendichacaracterísticaserepresentanconunacardinalidadindefinida,usandolossímbolos*o0..N,talcomosemostróenlafigura3.10.

ParaimplementarlasenJava,noexistenelementosenellenguajecomolosarreglos,sinoqueesnecesarioutilizaralgunasclasesquefueronconstruidasconestefin.

¿Cuálesladiferencia?Laprincipaldiferenciaesqueparamanipularlascontenedorasdetamañovariabledebemosutilizarlamismasintaxisqueutilizamosparamanejarcualquierotraclase.Nohayunasintaxisespecialparaobtenerunelemento(como[]enlosarreglos),nicontamosconoperadoresespeciales(length).

EnJavaexistenvariasclasesquenospermitenmanejarcontenedorasdetamañovariable,todasellasdisponiblesenelpaquetellamadojava.util.EnestelibrovamosautilizarlaclaseArrayList,queeseficienteeincluyetodalafuncionalidadnecesariaparamanipulargruposdeobjetos.Lamayorrestricciónquevamosaencontraresquenopermitemanejargruposdeatributosdetiposimple,sinoúnicamentegruposdeobjetos.Enestenivelvamosaestudiarúnicamentelosprincipalesmétodosdeesaclase,aquéllosqueofrecenlasfuncionalidadestípicasparamanejarestaclasedeestructuras.Sideseaconocerladescripcióndetodoslosmétodosdisponibles,loinvitamosaconsultarladocumentaciónqueapareceenelsitiowebdellenguajeJava.

Porsimplicidad,vamosallamarvectoracualquierimplementacióndeunaestructuracontenedoradetamañovariable.

Aligualqueconlosarreglos,comenzamosahoraelrecorridoparaestudiarlamaneradedeclararunatributodelaclaseArrayList,lamaneradeteneraccesoasuselementos,laformademodificarlo,etc.Paraestoutilizaremoselcasodeestudiodelatiendadelibros.

8.1.DeclaracióndeunVector

ContenedorasdeTamañoVariable

307

PuestoqueunvectoresunaclasecomúnycorrientedeJava,lasintaxisparadeclararloeslamismaquehemosutilizadoenlosnivelesanteriores.Enelejemplo11seexplicanlasdeclaracionesdelasclasesTiendaLibrosyLibro.

Ejemplo12

Objetivo:MostrarlasintaxisusadaenJavaparadeclararunvector.

EnesteejemplosemuestranlasdeclaracionesdelasclasesTiendaLibrosyLibro,lascualescontienenatributosdetipovector.

packageuniandes.cupi2.tiendadelibros.mundo;

importjava.util.*;

publicclassTiendaDeLibros

{

//----------------------------------

//Atributos

//----------------------------------

privateArrayList<Libro>catalogo;

privatedoublecaja;

...

}

ParapoderusarlaclaseArrayListesnecesarioimportarsudeclaración,indicandoelpaqueteenelqueéstaseencuentra(java.util).EstosehaceconlainstrucciónimportdeJava.Dichainstrucciónvadespuésdeladeclaracióndelpaquetedelaclaseyantesdesuencabezado.EnlaclaseTiendaDeLibrossedeclarandosatributos:elcatálogo,queesunvector,yeldineroquehayenlacaja,queesdetipodouble.Aldeclararunvector,seindicaeltipodeobjetosquesevanaguardarenél,usandolasintáxis<NombreDeLaClase>.Enelcasodelcatálogo,seindicaqueelcatálogoesunvectordelibros.

ContenedorasdeTamañoVariable

308

packageuniandes.cupi2.tiendadelibros.mundo;

importjava.util.*;

publicclassLibro

{

//----------------------------------

//Atributos

//----------------------------------

privateArrayList<Transaccion>transacciones;

...

}

EnlaclaseLibrosedeclaraelgrupodetransaccionescomounvector.SedebedenuevoimportarelpaqueteendondeseencuentralaclaseArrayList,usandolainstrucciónimport.Fíjesequeladeclaracióndeunvectorutilizalamismasintaxisqueseusaparadeclararcualquierotroatributodelaclase.

8.2InicializaciónyTamañodeunVectorEnelconstructoresnecesarioinicializarlosvectores,aligualquehacemoscontodoslosdemásatributosdeunaclase.Haydosdiferenciasentrecrearunarregloycrearunvector:

Enlosvectoresseutilizalamismasintaxisdecreacióndecualquierotroobjeto(newArrayList<NombreDeLaClase>())teniendoqueagregarelnombredelasclasealaquepertenecenlosobjetosquesevanaagregaralvector,mientrasquelosarreglosutilizanlos[]paraindicareltamaño(newNombreDeLaClase[TAMANIO]).Enlosvectoresnoesnecesariodefinirelnúmerodeelementosquevaatener,mientrasqueenlosarreglosesindispensablehacerlo.

Ejemplo13

Objetivo:Mostrarlamaneradeinicializarunvector.

EnesteejemplosemuestranlosmétodosconstructoresdelasclasesTiendaLibrosyLibro,lascualescontienenatributosdetipovector.

publicTiendaDeLibros()

{

catalogo=newArrayList<Libro>();

}

ContenedorasdeTamañoVariable

309

Nohaynecesidaddeespecificarelnúmerodeelementosqueelvectorvaacontener.

publicLibro()

{

transacciones=newArrayList<Transaccion>();

}

Alcrearunvectorsereservaunespaciovariableparaalmacenarloselementosquevayanapareciendo.Inicialmentehay0objetosenél.

DosmétodosdelaclaseArrayListnospermitenconocerelnúmerodeelementosqueenunmomentodadohayenunvector:

isEmpty():esunmétodoqueretornaverdaderosielvectornotieneelementosyfalsoencasocontrario.Porejemplo,enlaclaseLibro,despuésdellamarelconstructor,lainvocacióndelmétodotransacciones.isEmpty()retornaverdadero.size():esunmétodoqueretornaelnúmerodeelementosquehayenelvector.Paraelmismocasoplanteadoanteriormente,transacciones.size()esiguala0.

Siadaptamoselesqueletodelospatronesdealgoritmoparaelmanejodevectores,loúnicoquevaacambiareslacondiciónparacontinuarenelciclo.Enlugardeusarlaoperaciónlengthdelosarreglos,debemosutilizarelmétodosize()delosvectores,talcomosemuestraenelsiguientefragmentodemétododelaclaseTiendaDeLibros.

publicvoidesqueleto()

{

for(inti=0;i<catalogo.size();i++)

{

//cuerpodelciclo

}

}

Lasposicionesenlosvectores,aligualqueenlosarreglos,comienzanen0.

Lacondiciónparacontinuarenelcicloseescribeutilizandoelmétodosize()delaclaseArrayList,enlugardeloperadorlengthdelosarreglos.Notequelosparéntesissonnecesarios.

Lasiguientetablailustraelusodelosmétodosdemanejodeltamañodeunvectorenelcasodeestudio:

ContenedorasdeTamañoVariable

310

Clase Expresión Interpretación

TiendaDeLibros catalogo.size()Númerodelibrosdisponiblesenelcatálogo.

TiendaDeLibros catalogo.size()==

10¿Hay10librosenelcatálogo?

TiendaDeLibros catalogo.isEmpty() ¿Estávacíoelcatálogo?

Libro transacciones.size(

)Númerodetransaccionesdellibro.

Enestepuntoesimportanterecordarquelainstrucciónfor-eachparalosvectoresfuncionadeformasimilarqueparalosarregloscomosemuestraenelsiguientefragmentodecódigo.

publicvoidesqueleto()

{

for(Librolibro:catalogo)

{

//cuerpodelciclo

}

}

8.3.AccesoalosElementosdeunVectorLoselementosdeunvectorsereferencianporsuposiciónenlaestructura,comenzandoenlaposicióncero.Paraestoseutilizaelmétodoget(pos),querecibecomoparámetrolaposicióndelelementoquequeremosrecuperarynosretornaelobjetoqueallíseencuentra.

Ejemplo14

Objetivo:Ilustrarelusodelmétodoquenospermiterecuperarunobjetodeunvector.

Enesteejemploseilustraelusodelmétododeaccesoaloselementosdeunvector.VamosasuponerqueenlaclaseLibroexisteelmétododarPrecioVenta(),queretornaelpreciodeventadellibro.Estemétodosumaelpreciodeventadetodosloslibrosdelcatálogo.

ContenedorasdeTamañoVariable

311

publicintinventario()

{

intsumaPrecios=0;

for(inti=0;i<catalogo.size();i++)

{

Librolibro=catalogo.get(i);

sumaPrecios+=libro.darPrecioVenta();

}

returnsumaPrecios;

}

Conlainstrucciónget(i)delosvectoressepuedeaccederalareferenciadelobjetodelvectorqueseencuentraenlaposicióni.

Esunabuenaideaguardarsiempreenunavariabletemporallareferenciaalobjetorecuperado,parasimplificarelcódigo.

Cuandodentrodeunmétodotratamosdeaccederunaposiciónenunvectorconuníndicenoválido(menorque0omayoroigualqueelnúmerodeobjetosqueenesemomentoseencuentrenenelvector),obtenemoselerrordeejecución:java.lang.IndexOutOfBoundsException.

Recuerdequealutilizarelmétodoget(pos),loúnicoqueestamosobteniendoesunareferenciaalobjetoqueseencuentrareferenciadodesdelaposiciónposdelvector.Nosehaceningunacopiadelobjeto,nidesplazaelobjetoaningúnlado.

8.4.AgregarElementosaunVectorLoselementosdeunvectorsepuedenagregaralfinaldelmismooinsertarenunaposiciónespecífica.Losmétodosparahacerlosonlossiguientes:

add(objeto):esunmétodoquepermiteagregaralfinaldelvectorelobjetoquesepasacomoparámetro.Noimportacuántoselementoshayaenelvector,elmétodosiempresabecómobuscarespacioparaagregarunomás.

add(indice,objeto):esunmétodoquepermiteinsertarunobjetoenlaposiciónindicadaporelíndiceespecificadocomoparámetro.Estaoperaciónhacequeelelementoqueseencontrabaenesaposiciónsedesplacehacialaposiciónsiguiente,lomismoqueelrestodelosobjetosenlaestructura.

Ejemplo15

Objetivo:Mostrarelusodelmétodoqueagregaobjetosaunvector.

ContenedorasdeTamañoVariable

312

Enesteejemploseilustraelusodelosmétodosquepermitenagregarelementosaunvector.ElsiguienteesunmétododelaclaseTiendaDeLibrosqueañadetreslibrosalcatálogo.

publicvoidagregarTresLibros()

{

Librolb1=newLibro("título1","0011",1000,1200,"RutaImagen1");

Librolb2=newLibro("título2","0012",2000,2400,"RutaImagen2");

Librolb3=newLibro("título3","0013",3000,3600,"RutaImagen3");

catalogo.add(lb2);

catalogo.add(lb3);

catalogo.add(0,lb1);

}

Enelmétodosecreaninicialmentelostreslibros.Luegoseagregaelsegundodeloslibros(lb2).Comoelvectorestabavacío,elnuevoelementoquedaenlaposición0delcatálogo.Despuésseañadeeltercerlibro(lb3),quequedaenlaposición1.Finalmenteseinsertaelprimerlibro(lb1)enlaposición0,loquedesplazaellibro2alaposición1yellibro3alaposición2.

ContenedorasdeTamañoVariable

313

Enestediagramadeobjetossepuedeapreciarelestadodelcatálogodespuésdeejecutarestemétodo.Siusamoselmétodosize()paraelcatálogo,deberesponder3.Eneldibujodejamosengrislascasillasposterioresala2,paraindicarqueelvectorlaspuedeocuparcuandolasnecesite.

8.5.ReemplazarunElementoenunVectorCuandosequierereemplazarunobjetoporotroenunvector,seutilizaelmétodoset(),querecibecomoparámetroselíndicedelelementoquesedebereemplazaryelobjetoquedebetomarahoraesaposición.

Estemétodoesmuyútilparaordenarunvectoroparaclasificarbajoalgúnconceptoloselementosqueallíseencuentran.Enelejemplo15apareceunmétododelaclaseTiendaDeLibrosquepermiteintercambiardoslibrosdelcatálogo,dadassusposicionesenelvectorqueloscontiene.

Ejemplo16

Objetivo:Mostrarlamaneradereemplazarunobjetoenunvector.

Enesteejemploseilustraelusodelmétodoquereemplazaunobjetoporotroenunvector.ElmétododelaclaseTiendaLibrosrecibelasposicionesenelcatálogodeloslibrosquedebeintercambiar.

publicvoidintercambiar(intpPosicion1,intpPosicion2)

{

Librolibro1=catalogo.get(pPosicion1);

Librolibro2=catalogo.get(pPosicion2);

catalogo.set(pPosicion1,libro2);

catalogo.set(pPosicion2,libro1);

}

Cuandoseintercambianloselementosencualquierestructuraesindispensableguardaralmenosunodeellosenunavariabletemporal.Enestemétododecidimosusardosvariablesporclaridad.Enestemétodosuponemosquelasdosposicionesdadassonválidas(quesonposicionesentre0ycatalogo.size()-1).

Elmétodoset()nohacesinoreemplazarlareferenciaalobjetoqueseencuentraalmacenadaenlacasilla.Sepuedeversimplementecomolamaneradeasignarunnuevovaloraunacasilla.

ContenedorasdeTamañoVariable

314

Lareferenciaqueallíseencontrabasepierde,amenosquehayasidoguardadaenalgúnotrolugar.

8.6.EliminarunElementodeunVectorDelamismamaneraqueesposibleagregarelementosaunvector,tambiénesposibleeliminarlos.Pienseenelcasodelatiendadelibros.Sielusuariodecidieraeliminarunlibrodelcatálogolatienda,nosotrosenelprogramadebemosquitarlodelrespectivovectorelobjetoquelorepresentaba.Despuésdeeliminadalareferenciaaunobjeto,estaposiciónesocupadaporelelementoqueseencontrabadespuésdeélenelvector.

ElmétododelaclaseArrayListqueseusaparaeliminarunelementosellamaremove()yrecibecomoparámetrolaposicióndelelementoquesequiereeliminar(unvalorentre0yelnúmerodeelementosmenos1).Alusarestaoperación,sedebetenerencuentaqueeltamañodelaestructuradisminuyeen1,porloquesedebetenercuidadoenelmomentodedefinirlacondicióndecontinuacióndelosciclos.

Esimportanterecalcarqueelhechodequitarunobjetodeunvectornoimplicanecesariamentesudestrucción.Loúnicoqueestamoshaciendoeseliminandounareferenciaalobjeto.Siqueremosmantenerlovivo,bastaconguardarsureferenciaenotrolado,porejemploenunavariable.

Ejemplo17

Objetivo:Mostrarlamaneradeutilizarelmétodoqueeliminaunobjetodeunvector.

EnesteejemplopresentamosunmétododelaclaseTiendaDeLibrosqueeliminaelprimerlibrodelcatálogo.Ilustramoselresultadousandoeldiagramadeobjetosdelejemplo14.

publicvoideliminarPrimerLibro()

{

catalogo.remove(0);

}

Estemétodoeliminadelcatálogolareferenciaalprimerlibrodelatienda.Despuésdesuejecución,todosloslibrossemuevenunaposiciónhacialaizquierdaenelcatálogo.

ContenedorasdeTamañoVariable

315

Siejecutamosestemétodosobreeldiagramadeobjetosdelejemplo14,obtenemoseldiagramaqueapareceenestafigura.Ellibroqueestabaenlaposición1pasaalaposición0,yellibrodelaposición2pasaalaposición1.Ahoracatalogo.size()esiguala2.

Yaquehemosterminadodeverlosprincipalesmétodosconlosquecontamosparamanejarloselementosdeunvector,vamosacomenzaraescribirlosmétodosdelaclasedelcasodeestudio.Comenzamosconlasdeclaracionesdelasclasessimplesyseguimosconlosmétodosquemanejanlosvectores.

8.7.ConstruccióndelProgramadelCasodeEstudio

8.7.1.LaClaseLibro

LaclaseLibroesresponsabledemanejarsusseisatributos,abastecerejemplares,venderejemplaresyretornarellistadodetransacciones.Paraestocuentaconunmétodoconstructor,cincométodosanalizadoresydosmétodosmodificadores:

ContenedorasdeTamañoVariable

316

Libro(StringpTitulo,StringpISBN,doublepPrecioCompra,

doublepPrecioVenta,StringpRutaImagen) Métodoconstructor.

StringdarTitulo()Retornaeltítulodellibro.

StringdarIsbn()RetornaelISBNdellibro.

doubledarPrecioCompra()Retornaelpreciodecompradellibro.

doubledarPrecioVenta()Retornaelpreciodeventadellibro.

StringdarCantidadActual()Retornalacantidaddeejemplaresdellibro.

StringdarRutaImagen()Retornalarutadelaimagendellibro.

voidvender(intpCantidad,StringpFecha)Vendeejemplaresdellibro.

voidabastecer(intpCantidad,StringpFecha)Abasteceejemplaresdellibro.

ArrayList<Transaccion>darTransacciones()Retornalastransaccionesdellibro.

Laclaselibroesresponsabledeabasteceryvenderejemplaresdellibroasícomoderegistrarunatransacciónporcadaabastecimientooventaquerealiceelusuario.

Aligualqueenelcasodelosarreglos,siantesdeusarunvectornolohemoscreadoadecuadamente,sevaagenerarelerrordeejecución:java.lang.NullPointerException.

8.7.2.LaClaseTransaccion

CadaobjetodelaclaseTransacciontieneeltipodetransacción,lacantidaddeejemplaresylafechaenqueserealizólatransacción.AquíesimportanteresaltarquelosobjetosdelaclaseLibrotendránvariastransacciones,comoseilustraeneldiagramadeobjetosdelafigura3.11.

Losmétodosdeestaclaseseresumenenlasiguientetabla:

ContenedorasdeTamañoVariable

317

Transaccion(TipopTipo,intpCantidad,String

pFecha) Métodoconstructor.

TipodarTipo() Retornaeltipodetransacción.

intdarCantidad()Retornalacantidaddelastransacción.

StringdarFecha()Retornalafechadelatransacción.

Fig.3.11Diagramadeobjetosparailustrarelcasodelatiendadelibros

Enlafigura3.11sepuedeapreciarelcasoenelqueelusuariotieneensucatalogodoslibros.Elprimerlibrotieneunatransacciónyelsegundolibrotienedostransacciones.Enestediagramadecidimosmostrarlosvectorescomoobjetosexternosalasclasesquelosusan.Estarepresentaciónseajustamásalarealidadquelaqueusamosenejemplosanteriores,aunqueesmenossimple.Ambasmanerasdemostrareldiagramadeobjetossonválidas.Observe,porejemplo,queelobjetollamadocatalogoesunaasociaciónhaciaunobjetodelaclaseArrayList,quemantienelasreferenciasalosobjetosquerepresentanloslibros.

ContenedorasdeTamañoVariable

318

8.7.3.LaClaseTiendaDeLibros

Enlatarea11vamosadesarrollaralgunosdelosmétodosdelaclaseTiendaDeLibros.Susprincipalesresponsabilidadesseresumenenlasiguientetabla:

TiendaLibros() Métodoconstructor.

ArrayList<Libro>darCatalogo() Retornaelcatálogodelibros.

doubledarCaja() Retornaelsaldodelacaja.

voidcambiarCaja(doublepCaja) Cambiaelsaldodelacaja.LibroregistrarLibro(StringpTitulo,

StringpIsbn,doublepPrecioVenta,

doublepPrecioCompra,String

pRutaImagen)

Añadeunnuevolibroalcatálogoapartirdelosparámetrosrecibidos.Siellibroyaestáenelcatálogo,elmétodonohacenada.

LibrobuscarLibroPorISBN(StringpIsbn

)

LocalizaunlibrodelcatálogodadosuISBN.Sinoloencuentraretornanull.

LibrobuscarLibroPorTitulo(String

pTitulo)

Localizaunlibrodelcatálogodadosutítulo.Sinoloencuentraretornanull.

booleaneliminarLibro(StringpIsbn)EliminaunlibrodelcatálogodadosuISBN.Sinoloencuentraretornafalse.

booleanabastecer(StringpIsbn,int

pCantidad,StringpFecha)

AbasteceejemplaresdeunlibrodadosuISBN.Sinopuedeabastecerlosejemplaresdellibroretornafalse.

booleanvender(StringpIsbn,int

pCantidad,StringpFecha)

VendeejemplaresdeunlibrodadosuISBN.Sinopuedevenderlosejemplaresdellibroretornafalse.

LibrodarLibroMasCostoso()

Retornaellibroconelpreciodeventamayor.Sinohaylibrosenelcatálogoretornanull.

LibrodarLibroMasEconomico()

Retornaellibroconelpreciodeventamenor.Sinohaylibrosenelcatálogoretornanull.

LibrodarLibroMasVendido()

Retornaellibrodelcuálsehanvendidomásejemplares.Sinohaylibrosenelcatálogoretornanull.

int

darCantidadTransaccionesAbastecimiento(

StringpIsbn)

RetornaelnúmerodetransaccionesdetipoabastecimientoquesehanrealizadoallibroconelISBNrecibidocomoparámetro.Encasodequenoencuentreellibrooqueellibronotengatransacciones,retornacero.

Tarea11

ContenedorasdeTamañoVariable

319

Objetivo:DesarrollarlosmétodosdelaclaseTiendaDeLibrosquenospermitenimplementarlosrequerimientosfuncionalesdelcasodeestudio.

Paracadaunodelosproblemasqueseplanteanacontinuación,escribaelmétodoqueloresuelve.Noolvideidentificarprimeroelpatróndealgoritmoquesenecesitayusarlasguíasquesedieronenseccionesanteriores.

Localizarunlibroenelcatálogo,dadosuISBN.Sinoloencuentra,elmétododeberetornarnull:

publicLibrobuscarLibroPorISBN(StringpIsbn)

{

}

EliminarunlibroenelcatálogodadosuISBN.Siellibronoexisteosilacantidadactualdeejemplaresesmayoraceroretornafalse.Utiliceelmétodoanterior:

publicbooleaneliminarLibro(StringpIsbn)

{

}

Agregarunlibroenelcatálogo,sinoexisteyaunlibroconeseISBN.UtiliceelmétodobuscarLibroPorISBN:

ContenedorasdeTamañoVariable

320

publicLibroregistrarLibro(StringpTitulo,StringpIsbn,doublepPrecioVenta,double

pPrecioCompra,StringpRutaImagen)

{

}

Buscarellibromáscostosodelcatálogo,sielcatálogoestávacíoretornanull:

publicLibrodarLibroMasCostoso()

{

}

Buscarellibrodelcuálsehanvendidomásejemplares.Sinohaylibrosenelcatálogo,retornanull:

publicLibrodarLibroMasVendido()

{

}

ContenedorasdeTamañoVariable

321

RetornaelnúmerodetransaccionesdetipoabastecimientoqueselehanrealizadoallibroconelISBNrecibidocomoparámetro.Encasodequenoencuentreellibrooqueellibronotengatransacciones,retornacero.

publicintdarCantidadTransaccionesAbastecimiento(StringpIsbn)

{

}

Tarea12

Objetivo:DesarrollarlosmétodosdelaclaseLibro.

Paracadaunodelosproblemasqueseplanteanacontinuación,escribaelmétodoqueloresuelve.

Venderlacantidaddeejemplaresdellibrorecibidacomoparámetrosiempreycuandolacantidaddeejemplaresactualseamenoroigualalacantidadavender.Laventaimplicadecrementarelnúmerodeejemplaresdellibro.Adicionalmenteagregaunanuevatransaccióndetipoventaallistadodetransaccionesdellibro:

publicbooleanvender(intpCantidad,StringpFecha)

{

}

Abastecerlacantidaddeejemplaresdellibrorecibidacomoparámetro.Elabastecimientoimplicaincrementarelnúmerodeejemplaresdellibro.Adicionalmenteagregaunanuevatransaccióndetipoabastecimientoallistadodetransaccionesdellibro:

ContenedorasdeTamañoVariable

322

publicvoidabastecer(intpCantidad,StringpFecha)

{

}

ContenedorasdeTamañoVariable

323

9.UsodeCiclosenOtrosContextosAunquehastaestemomentosólohemosmostradolasinstruccionesiterativascomounamanerademanejarinformaciónqueseencuentraenestructurascontenedoras,dichasinstruccionestambiénseusanmuycomúnmenteenotroscontextos.Enelejemplo17mostramossuusoparacalcularelvalordeunafunciónaritmética.

Ejemplo18

Objetivo:Mostrarelusodelasinstruccionesiterativasenuncontextodiferentealdemanipulacióndeestructurascontenedoras.

Enesteejemplopresentamoslamaneradeescribirunmétodoparacalcularelfactorialdeunnúmero.Lafunciónfactorialaplicadaaunnúmeroenteron(enmatemáticasaesevalorselerepresentacomon!)sedefinecomoelproductodetodoslosvaloresenterospositivosmenoresoigualesalvalorencuestión.Planteadodeotramanera,tenemosque:

factorial(0)esiguala1.factorial(1)esiguala1.factorial(n)=n*factorial(n–1).

Porejemplo,factorial(5)=5*4*3*2*1=120

Siqueremosconstruirunmétodocapazdecalculardichovalor,podemosutilizarunainstruccióniterativa,comosemuestraacontinuación.

packageuniandes.cupi2.matematicas;

publicclassMatematica

{

publicstaticintfactorial(intpNum)

{

intacum=1;

if(pNum>0)

{

for(inti=1;i<=num;i++)

{

acum=acum*i;

}

}

}

returnacum;

}

UsodeCiclosenOtrosContextos

324

Elmétodolodeclaramosdemaneraespecial(static)ysumododeusoescomoaparecemásabajoenestemismoejemplo.

Elprimercasoquetenemosesqueelvalordelparámetrosea0.Larespuestaenesecasoes1.Hastaahíesfácil.

Enelcasogeneral,debemosmultiplicartodoslosvaloresdesde1hastaelvalorquerecibimoscomoparámetroeiracumulandoelresultadoenunavariablellamada"acum".Alfinalelmétodoretornadichovalor.

Estasoluciónnoesotraqueelpatrónderecorridototalaplicadoalasecuenciadenúmeros.Aunquenoesténalmacenadosenunarreglo,sepuedenimaginarunodespuésdelotro,conelíndicerecorriéndolosdeizquierdaaderecha.Esteusodelasinstruccionesiterativasnotieneunateoríadistintaalavistaenestecapítulo.

intfact=Matematica.factorial(i);

Lallamadadelmétodosehaceutilizandoestasintaxis.Comoesunafunciónaritméticaquenoestáasociadaconningúnelementodelmundo,debemosusarelnombredelaclaseparahacerlainvocación.

UsodeCiclosenOtrosContextos

325

CreacióndeunaClaseenJava

Tarea13

Objetivo:AgregarunanuevaclaseenunprogramaescritoenJava.

Enestatareavamosaextenderelcasodeestudiodelatiendadelibros,agregandodosclasesnuevas,enunpaquetedistintoalosyadefinidos.Sigalospasosquesedetallanacontinuación:

Esteeseldiagramadeclasesquequeremosconstruir.Haydosclasesadicionales:unaparamodelarlosclientesdelatiendadelibrosyotraconcomentariosquesehacenopcionalmentesobrecadalibro.Tomenotadelasnuevasasociacionesqueaparecen.

1. EjecuteEclipseyabraelproyectodelatiendadelibros.Localiceeldirectorioenelcualseguardanlosprogramasfuente.

2. VamosacrearlosarchivosdelasclasesComentarioyClienteenunnuevopaquetellamadouniandes.cupi2.tiendadelibros.extension.Paraesto,debemoscrearprimeroelpaquete.ParacrearunpaqueteenJava,seleccionelaopciónFile/New/Packagedel

CreacióndeunaClaseenJava

326

menúprincipalolaopciónNew/Packagedelmenúemergentequeaparecealhacerclicderechosobreeldirectoriodefuentes.

3. Unavezcreadoelpaquete,podemoscrearlaclaseallídentro,seleccionandolaopciónFile/New/ClassdelmenúprincipalolaopciónNew/Classdelmenúemergentequeaparecealhacerclicderechosobreelpaquetedeclaseselegido.Enlaventanaqueabreelasistentedecreacióndeclases,podemosvereldirectoriodefuentesyelpaquetedondeseubicarálaclase.Allídebemosteclearelnombredelaclase.AloprimirelbotónFinish,eleditorabrirálaclaseylepermitirácompletarlaconsusatributosymétodos.Siguiendoelprocesoantesmencionado,creelasclasesClienteyComentarioincluyendosusatributos.

4. Elsiguientepasoesagregarlosatributosquevanarepresentarlasasociacioneshaciaesasclases.AbraparaestolaclaseLibro.AgregueelatributodetipovectorquerepresentalaasociaciónhacialaclaseComentariotalcomosedescribeeneldiagramadeclases.¿Porquéelcompiladornoreconocelanuevaclase?Sencillamenteporqueestáenotropaquete,elcualdebemosimportar.Añadalainstrucciónparaimportarlasclasesdelnuevopaquete.EstaimportaciónpuedehacerlamanualmenteoutilizandoelcomandoControl+Mayús+Oparaqueeleditoragregueautomáticamentetodaslasimportacionesquenecesite.

5. AgregueelatributoclientesalaclaseTiendaDeLibros,representándolocomounvector.EsnecesarioqueimportelaclaseClientealmomentodedeclararelvectorpuestoqueeslaprimeravezquehacemosreferenciadirectaaestaclase.

6. EnelconstructordelaclaseTiendaDeLibros,inicialiceelvectordeclientes.7. EnelconstructordelaclaseLibro,inicialiceelvectordecomentarios.8. Lasclasesantesmencionadastambiénsehabríanpodidocreardesdecualquiereditor

detextosimple(porejemplo,elblocdenotas).Bastaconcrearelarchivo,salvarloeneldirectorioquerepresentaelpaquetey,luego,entraraEclipseyutilizarlaopciónRefreshdelmenúemergentequeaparecealhacerclicderechosobreelproyecto.

9. EnlaclaseComentarioagregueelconstructorquerecibecomoparámetroselcontenido,lacalificaciónyelobjetodelclientequerealizóelcomentario.Agreguetresmétodospararecuperarelcontenidodelcomentario,lacalificaciónotorgadayelcliente.

10. EnlaclaseClienteescribaelconstructorquerecibecomoparámetroslacédula,losnombresylosapellidos.Agreguetresmétodospararecuperarlacédula,losnombresylosapellidos.

11. EnlaclaseLibro,añadaunmétodoqueagregueuncomentarioallibroyotroqueretorneelvectorcontodosloscomentariosdellibro.

12. EnlaclaseTiendaDeLibros,añadalossiguientesmétodos:(a)unmétodoparaagregarunnuevocliente,(b)unmétodoparabuscarunclientedadosunúmerodecédula,(c)unmétodoparacalcularlacalificaciónpromediodeunlibrodadosuISBN,(d)unmétodoquecalculeelnúmerototaldelibrosdelcatálogoquetienenalmenos

CreacióndeunaClaseenJava

327

comentario,y(e)unmétodoqueagregueunnuevocomentarioaunlibro.EsteúltimométodorecibecomoparámetroselISBNdellibro,lacéduladelcliente,yelcontenidoylacalificacióndelcomentario.

CreacióndeunaClaseenJava

328

10.HojasdeTrabajo

10.1.HojadeTrabajoNº1:UnParqueaderoDescargueestahojadetrabajoatravésdelossiguientesenlaces:DescargarPDF|DescargarWord.

Enunciado.Analiceelsiguienteenunciadoeidentiqueelmundodelproblema,loquesequierequehagaelprogramaylasrestriccionesparadesarrollarlo.

Sequiereconstruirunaaplicaciónparaadministrarunparqueadero(lugardeestacionamientoparacarros).Dichoparqueaderotiene40puestos,numeradosdel1al40.Encadapuestosepuedeparquearunsólocarro(querepresentaremosconunaclasellamadaCarro),elcualseidenticaporsuplaca.Elparqueaderotieneunatarifaporhoraofraccióndehora,puedesercambiadaporeladministrador.

Decadavehículoaparcadosedebeconocerlahoraenlaqueentró,quecorrespondeaunvalorentre6y21,dadoqueelparqueaderoestáabiertoentre6delamañanay9delanoche.

Seesperaquelaaplicaciónquesequiereconstruirpermitahacerlosiguiente:

1. Ingresaruncarroalparqueadero.Sedebeindicarelpuestoenelquesedebeparquear(sihaycupo).

2. Darsalidaauncarrodelparqueadero.Sedebeindicarcuántodebepagar.

3. Informarlosingresosdelparqueadero.

4. Consultarlacantidaddepuestosdisponibles.

5. Avanzarunahoraenelrelojdelparqueadero.

6. Cambiarlatarifadelparqueadero.

Lasiguienteeslainterfazdeusuariopropuestaparaelprograma,dondelospuestosocupadosdebenaparecenconunvehículo.

Hojasdetrabajo

329

Requerimientosfuncionales.Describalosseisrequerimientosfuncionalesdelaaplicaciónquehayaidenticadoenelenunciado.

RequerimientoFuncional1

Hojasdetrabajo

330

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional2

Hojasdetrabajo

331

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional3

Hojasdetrabajo

332

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional4

Hojasdetrabajo

333

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional5

Hojasdetrabajo

334

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional6

Hojasdetrabajo

335

Nombre

Resumen

Entradas

Resultado

Modelodelmundo.Completeeldiagramadeclasesconlosatributos,lasconstantesylasasociaciones.

Hojasdetrabajo

336

DiagramaUML:Parqueadero

DiagramaUML:Puesto

Hojasdetrabajo

337

DiagramaUML:Carro

Declaracióndearreglos.Paralassiguientesclases,escribaladeclaracióndelosatributosindicadosenelcomentario(comocontenedorasdeltipodado),asícomolasconstantesnecesariasparamanejarlos.

publicclassParqueadero

{

//--------------------------------------------------

//Constantes

//--------------------------------------------------

/**

*Indicaelnúmerodepuestosenelparqueadero

*/

//--------------------------------------------------

//Atributos

//--------------------------------------------------

/**

*Arreglodepuestos

*/

}

Hojasdetrabajo

338

Inicializacióndearreglos.Escribaelconstructordelaclaseparainicializarlascontenedorasdeclaradasenelpuntoanterior.

publicParqueadero()

{

}

Patronesdealgoritmos.DesarrollelossiguientesmétodosdelaclaseParqueadero,identicandoeltipodepatróndealgoritmoalqueperteneceysiguiendolasrespectivasguías

Método1

Contaryretornarelnúmerototaldepuestosocupados.

publicintdarTotalPuestosOcupados()

{

}

Método2

Informarsienelparqueaderohayuncarrocuyaplacacomienceconlaletradadacomoparámetro.

Hojasdetrabajo

339

publicbooleanexistePlacaIniciaCon(charpLetra)

{

}

Método3

Retornarelnúmerodecarrosenelparqueaderoquellegaronantesdelmediodía.

publicintdarTotalCarrosIngresoManana()

{

}

Método4

Retornarelúltimocarroeningresaralparqueadero.Sielparqueaderoestávacío,retornanull.

publicCarrodarCarroLlegadaMasReciente()

{

}

Hojasdetrabajo

340

Método5

Informarsienalgúnlugardelparqueaderohaydospuestoslibresconsecutivos.Estosehacecuandoelvehículoquesequiereaparcaresmuygrande.

publicbooleanhayDosPuestosLibresConsecutivos()

{

}

Método6

Informarsihaydoscarrosenelparqueaderoconlamismaplaca.

publicbooleanhayPlacasRepetidas()

{

}

Hojasdetrabajo

341

10.2HojadeTrabajoNº2:ListadeContactosDescargueestahojadetrabajoatravésdelossiguientesenlaces:DescargarPDF|DescargarWord.

Enunciado.Analiceelsiguienteenunciadoeidentiqueelmundodelproblema,loquesequierequehagaelprogramaylasrestriccionesparadesarrollarlo.

Sequiereconstruirunprogramaparamanejarlalistadecontactosdeunapersona.Uncontactotienenombre,apellido,unadirección,uncorreoelectrónico,variosteléfonosyunconjuntodepalabrasclavequeseutilizanparafacilitarsubúsqueda.Elnombrecompleto(nombre+apellido)decadacontactodebeserúnico.Tantoelnombrecomoelapellidoseusancomopalabrasclaveparalasbúsquedas.

Enelprogramadecontactossedebepoder:

1. Agregarunnuevocontacto.2. Eliminaruncontactoyaexistente.3. Verlainformacióndetalladadeuncontacto.4. Modicarlainformacióndeuncontacto.5. Buscarcontactosusandolaspalabrasclave.

Lasiguienteeslainterfazdeusuariopropuestaparaelprogramadelalistadecontactos.

Hojasdetrabajo

342

Requerimientosfuncionales.Describaloscincorequerimientosfuncionalesdelaaplicaciónquehayaidenticadoenelenunciado.

RequerimientoFuncional1

Hojasdetrabajo

343

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional2

Hojasdetrabajo

344

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional3

Hojasdetrabajo

345

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional4

Hojasdetrabajo

346

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional5

Hojasdetrabajo

347

Nombre

Resumen

Entradas

Resultado

Modelodelmundo.Completeeldiagramadeclasesconlosatributos,lasconstantesylasasociaciones.

Hojasdetrabajo

348

DiagramaUML:ListaDeContactos

DiagramaUML:Contacto

Hojasdetrabajo

349

Declaracióndearreglos.Paralassiguientesclases,escribaladeclaracióndelosatributosindicadosenelcomentario(comocontenedorasdeltipodado).

publicclassContacto

{

//--------------------------------------------------

//Atributos

//--------------------------------------------------

privateStringnombre;

privateStringapellido;

privateStringdireccion;

privateStringcorreo;

/**

*Listadeteléfonosdelcontacto.

*/

/**

*Listadepalabrasclavedelcontacto.

*/

}

publicclassListaDeContactos

{

//--------------------------------------------------

//Atributos

//--------------------------------------------------

/**

*Listadecontactos.

*/

}

Inicializacióndearreglos.Escribaelconstructordelasclasesdadas.

Hojasdetrabajo

350

publicContacto()

{

}

publicListaDeContactos()

{

}

Patronesdealgoritmos.Desarrollelossiguientesmétodosdelaclaseindicada,identicandoeltipodepatróndealgoritmoalqueperteneceysiguiendolasrespectivasguías.

Metodo

Clase:Contacto

Contarelnúmerodepalabrasclavequeempiezanporlaletradadacomoparámetro.

Hojasdetrabajo

351

publicintdarTotalPalabrasInicianCon(charpLetra)

{

}

Metodo2

Clase:Contacto

Informarsielcontactotienealgúnteléfonoquecomienzaporelprejodadocomoparámetro.

Hojasdetrabajo

352

publicbooleanexisteTelefonoIniciaCon(StringpPrefijo)

{

}

Metodo3

Clase:Contacto

Retornarlaprimerapalabraclavequeterminaconlacadenadada.

publicStringdarPalabraTerminaCon(StringpCadena)

{

}

Metodo4

Clase:Contacto

Contarelnúmerodepalabrasclavequesonprejo(parteinicial)deotraspalabrasclave.

Hojasdetrabajo

353

publicintdarTotalPalabrasPrefijo()

{

}

Metodo5

Clase:ListaDeContacto

Contarelnúmerodecontactoscuyonombreesigualalrecibidocomoparámetro.

publicintdarTotalContactosConNombre(StringpNombre)

{

}

Metodo6

Clase:ListadeContactos

Hojasdetrabajo

354

Informarsihaydoscontactosenlalistaconlamismadireccióndecorreoelectrónico.

publicbooleanhayCorreosRepetidos()

{

}

Metodo7

Clase:ListadeContactos

Retornarelcontactoconelmayornúmerodepalabrasclave.

Hojasdetrabajo

355

publicContactodarContactoConMasPalabras()

{

}

Hojasdetrabajo

356

top related