nivel 3: manejo de grupos de atributos

117
Nivel 3: Manejo de Grupos de Atributos 240

Upload: others

Post on 25-Nov-2021

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Nivel 3: Manejo de Grupos de Atributos

Nivel3:ManejodeGruposdeAtributos

240

Page 2: Nivel 3: Manejo de Grupos de Atributos

1.ObjetivosPedagógicosAlfinaldeestenivelellectorserácapazde:

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

ObjetivosPedagógicos

241

Page 3: Nivel 3: Manejo de Grupos de Atributos

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

Page 4: Nivel 3: Manejo de Grupos de Atributos

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

Page 5: Nivel 3: Manejo de Grupos de Atributos

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

Page 6: Nivel 3: Manejo de Grupos de Atributos

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

Fig.3.2Modeloconceptualdelascalificacionesdelosestudiantes

CasodeEstudioNº1:LasNotasdeunCurso

245

Page 7: Nivel 3: Manejo de Grupos de Atributos

CasodeEstudioNº1:LasNotasdeunCurso

246

Page 8: Nivel 3: Manejo de Grupos de Atributos

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

CasodeEstudioNº1:LasNotasdeunCurso

247

Page 9: Nivel 3: Manejo de Grupos de Atributos

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

Fig.3.3Modeloconceptualdelascalificacionesconunacontenedora

ContenedorasdeTamañoFijo

248

Page 10: Nivel 3: Manejo de Grupos de Atributos

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

ContenedorasdeTamañoFijo

249

Page 11: Nivel 3: Manejo de Grupos de Atributos

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

Page 12: Nivel 3: Manejo de Grupos de Atributos

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

Page 13: Nivel 3: Manejo de Grupos de Atributos

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

Page 14: Nivel 3: Manejo de Grupos de Atributos

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

Page 15: Nivel 3: Manejo de Grupos de Atributos

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

Page 16: Nivel 3: Manejo de Grupos de Atributos

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

Page 17: Nivel 3: Manejo de Grupos de Atributos

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

Page 18: Nivel 3: Manejo de Grupos de Atributos

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

Page 19: Nivel 3: Manejo de Grupos de Atributos

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

Page 20: Nivel 3: Manejo de Grupos de Atributos

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

Page 21: Nivel 3: Manejo de Grupos de Atributos

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

Page 22: Nivel 3: Manejo de Grupos de Atributos

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

Page 23: Nivel 3: Manejo de Grupos de Atributos

publicdoublecalcularMayorNota()

{

}

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

publicintcalcularCantidadNotasInferioresA(intpPosEst)

{

}********

Aumentarel5%todaslasnotasdelcurso,sinqueningunadeellassobrepaseelvalor5,0:

publicvoidhacerCurva()

{

}

InstruccionesRepetitivas

262

Page 24: Nivel 3: Manejo de Grupos de Atributos

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

Page 25: Nivel 3: Manejo de Grupos de Atributos

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

Page 26: Nivel 3: Manejo de Grupos de Atributos

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

Page 27: Nivel 3: Manejo de Grupos de Atributos

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

Page 28: Nivel 3: Manejo de Grupos de Atributos

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

Page 29: Nivel 3: Manejo de Grupos de Atributos

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

Page 30: Nivel 3: Manejo de Grupos de Atributos

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

Page 31: Nivel 3: Manejo de Grupos de Atributos

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

Page 32: Nivel 3: Manejo de Grupos de Atributos

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

Page 33: Nivel 3: Manejo de Grupos de Atributos

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

Page 34: Nivel 3: Manejo de Grupos de Atributos

¿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

Page 35: Nivel 3: Manejo de Grupos de Atributos

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

Page 36: Nivel 3: Manejo de Grupos de Atributos

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

Page 37: Nivel 3: Manejo de Grupos de Atributos

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

Page 38: Nivel 3: Manejo de Grupos de Atributos

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

Page 39: Nivel 3: Manejo de Grupos de Atributos

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

Page 40: Nivel 3: Manejo de Grupos de Atributos

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

Page 41: Nivel 3: Manejo de Grupos de Atributos

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

Page 42: Nivel 3: Manejo de Grupos de Atributos

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

Page 43: Nivel 3: Manejo de Grupos de Atributos

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

publicclassPasajero

{

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

//Atributos

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

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

//Constructor

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

publicPasajero(StringpCedula,StringpNombre)

{

}

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

//Métodos

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

publicStringdarCedula()

{

}

publicStringdarNombre()

{

CasodeEstudioNº2:ReservasenunVuelo

282

Page 44: Nivel 3: Manejo de Grupos de Atributos

}

}

6.5.LaClaseSilla

Tarea7

Objetivo:CompletarladeclaracióndelaclaseSilla.

CompletelasdeclaracionesdelosatributosylasenumeracionesdelaclaseSillaydesarrollelosmétodosqueselepidenparaestaclase.

CasodeEstudioNº2:ReservasenunVuelo

283

Page 45: Nivel 3: Manejo de Grupos de Atributos

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

Page 46: Nivel 3: Manejo de Grupos de Atributos

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

Page 47: Nivel 3: Manejo de Grupos de Atributos

publicclassSilla

{

...

publicvoidasignarPasajero(PasajeropPasajero)

{

}

...

}

Asignalasillaalpasajero"pPasajero".

publicclassSilla

{

...

publicvoiddesasignarSilla()

{

}

...

}

Quitaalpasajeroqueseencuentraenlasilla,dejándoladesocupada.

CasodeEstudioNº2:ReservasenunVuelo

286

Page 48: Nivel 3: Manejo de Grupos de Atributos

publicclassSilla

{

...

publicbooleansillaAsignada()

{

}

...

}

Informasilasillaestáocupada.

publicclassSilla

{

...

publicintdarNumero()

{

}

...

}

Retornaelnúmerodelasilla.

CasodeEstudioNº2:ReservasenunVuelo

287

Page 49: Nivel 3: Manejo de Grupos de Atributos

publicclassSilla

{

...

publicClasedarClase()

{

}

...

}

Retornalaclasedelasilla.

publicclassSilla

{

...

publicUbicaciondarUbicacion()

{

}

...

}

Retornalaubicacióndelasilla.

publicclassSilla

{

...

publicPasajerodarPasajero()

{

}

...

}

Retornaelpasajerodelasilla.

6.6.LaClaseAvion

CasodeEstudioNº2:ReservasenunVuelo

288

Page 50: Nivel 3: Manejo de Grupos de Atributos

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

Page 51: Nivel 3: Manejo de Grupos de Atributos

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

Page 52: Nivel 3: Manejo de Grupos de Atributos

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

Page 53: Nivel 3: Manejo de Grupos de Atributos

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

Page 54: Nivel 3: Manejo de Grupos de Atributos

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

Page 55: Nivel 3: Manejo de Grupos de Atributos

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

Page 56: Nivel 3: Manejo de Grupos de Atributos

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

Page 57: Nivel 3: Manejo de Grupos de Atributos

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

Page 58: Nivel 3: Manejo de Grupos de Atributos

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

Page 59: Nivel 3: Manejo de Grupos de Atributos

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

Page 60: Nivel 3: Manejo de Grupos de Atributos

publicvoiddesocuparAvion()

{

}

CasodeEstudioNº2:ReservasenunVuelo

299

Page 61: Nivel 3: Manejo de Grupos de Atributos

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

Page 62: Nivel 3: Manejo de Grupos de Atributos

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

Page 63: Nivel 3: Manejo de Grupos de Atributos

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

Page 64: Nivel 3: Manejo de Grupos de Atributos

Nombre

Resumen

Entradas

Resultado

Requerimientofuncional3

CasodeEstudioNº3:UnaTiendadeLibros

303

Page 65: Nivel 3: Manejo de Grupos de Atributos

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

Page 66: Nivel 3: Manejo de Grupos de Atributos

¿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

Page 67: Nivel 3: Manejo de Grupos de Atributos

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

CasodeEstudioNº3:UnaTiendadeLibros

306

Page 68: Nivel 3: Manejo de Grupos de Atributos

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

Page 69: Nivel 3: Manejo de Grupos de Atributos

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

Page 70: Nivel 3: Manejo de Grupos de Atributos

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

Page 71: Nivel 3: Manejo de Grupos de Atributos

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

Page 72: Nivel 3: Manejo de Grupos de Atributos

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

Page 73: Nivel 3: Manejo de Grupos de Atributos

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

Page 74: Nivel 3: Manejo de Grupos de Atributos

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

Page 75: Nivel 3: Manejo de Grupos de Atributos

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

Page 76: Nivel 3: Manejo de Grupos de Atributos

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

Page 77: Nivel 3: Manejo de Grupos de Atributos

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

Page 78: Nivel 3: Manejo de Grupos de Atributos

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

Page 79: Nivel 3: Manejo de Grupos de Atributos

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

Page 80: Nivel 3: Manejo de Grupos de Atributos

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

Page 81: Nivel 3: Manejo de Grupos de Atributos

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

Page 82: Nivel 3: Manejo de Grupos de Atributos

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

Page 83: Nivel 3: Manejo de Grupos de Atributos

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

Page 84: Nivel 3: Manejo de Grupos de Atributos

publicvoidabastecer(intpCantidad,StringpFecha)

{

}

ContenedorasdeTamañoVariable

323

Page 85: Nivel 3: Manejo de Grupos de Atributos

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

Page 86: Nivel 3: Manejo de Grupos de Atributos

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

Page 87: Nivel 3: Manejo de Grupos de Atributos

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

Page 88: Nivel 3: Manejo de Grupos de Atributos

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

Page 89: Nivel 3: Manejo de Grupos de Atributos

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

CreacióndeunaClaseenJava

328

Page 90: Nivel 3: Manejo de Grupos de Atributos

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

Page 91: Nivel 3: Manejo de Grupos de Atributos

Requerimientosfuncionales.Describalosseisrequerimientosfuncionalesdelaaplicaciónquehayaidenticadoenelenunciado.

RequerimientoFuncional1

Hojasdetrabajo

330

Page 92: Nivel 3: Manejo de Grupos de Atributos

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional2

Hojasdetrabajo

331

Page 93: Nivel 3: Manejo de Grupos de Atributos

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional3

Hojasdetrabajo

332

Page 94: Nivel 3: Manejo de Grupos de Atributos

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional4

Hojasdetrabajo

333

Page 95: Nivel 3: Manejo de Grupos de Atributos

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional5

Hojasdetrabajo

334

Page 96: Nivel 3: Manejo de Grupos de Atributos

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional6

Hojasdetrabajo

335

Page 97: Nivel 3: Manejo de Grupos de Atributos

Nombre

Resumen

Entradas

Resultado

Modelodelmundo.Completeeldiagramadeclasesconlosatributos,lasconstantesylasasociaciones.

Hojasdetrabajo

336

Page 98: Nivel 3: Manejo de Grupos de Atributos

DiagramaUML:Parqueadero

DiagramaUML:Puesto

Hojasdetrabajo

337

Page 99: Nivel 3: Manejo de Grupos de Atributos

DiagramaUML:Carro

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

publicclassParqueadero

{

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

//Constantes

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

/**

*Indicaelnúmerodepuestosenelparqueadero

*/

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

//Atributos

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

/**

*Arreglodepuestos

*/

}

Hojasdetrabajo

338

Page 100: Nivel 3: Manejo de Grupos de Atributos

Inicializacióndearreglos.Escribaelconstructordelaclaseparainicializarlascontenedorasdeclaradasenelpuntoanterior.

publicParqueadero()

{

}

Patronesdealgoritmos.DesarrollelossiguientesmétodosdelaclaseParqueadero,identicandoeltipodepatróndealgoritmoalqueperteneceysiguiendolasrespectivasguías

Método1

Contaryretornarelnúmerototaldepuestosocupados.

publicintdarTotalPuestosOcupados()

{

}

Método2

Informarsienelparqueaderohayuncarrocuyaplacacomienceconlaletradadacomoparámetro.

Hojasdetrabajo

339

Page 101: Nivel 3: Manejo de Grupos de Atributos

publicbooleanexistePlacaIniciaCon(charpLetra)

{

}

Método3

Retornarelnúmerodecarrosenelparqueaderoquellegaronantesdelmediodía.

publicintdarTotalCarrosIngresoManana()

{

}

Método4

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

publicCarrodarCarroLlegadaMasReciente()

{

}

Hojasdetrabajo

340

Page 102: Nivel 3: Manejo de Grupos de Atributos

Método5

Informarsienalgúnlugardelparqueaderohaydospuestoslibresconsecutivos.Estosehacecuandoelvehículoquesequiereaparcaresmuygrande.

publicbooleanhayDosPuestosLibresConsecutivos()

{

}

Método6

Informarsihaydoscarrosenelparqueaderoconlamismaplaca.

publicbooleanhayPlacasRepetidas()

{

}

Hojasdetrabajo

341

Page 103: Nivel 3: Manejo de Grupos de Atributos

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

Page 104: Nivel 3: Manejo de Grupos de Atributos

Requerimientosfuncionales.Describaloscincorequerimientosfuncionalesdelaaplicaciónquehayaidenticadoenelenunciado.

RequerimientoFuncional1

Hojasdetrabajo

343

Page 105: Nivel 3: Manejo de Grupos de Atributos

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional2

Hojasdetrabajo

344

Page 106: Nivel 3: Manejo de Grupos de Atributos

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional3

Hojasdetrabajo

345

Page 107: Nivel 3: Manejo de Grupos de Atributos

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional4

Hojasdetrabajo

346

Page 108: Nivel 3: Manejo de Grupos de Atributos

Nombre

Resumen

Entradas

Resultado

RequerimientoFuncional5

Hojasdetrabajo

347

Page 109: Nivel 3: Manejo de Grupos de Atributos

Nombre

Resumen

Entradas

Resultado

Modelodelmundo.Completeeldiagramadeclasesconlosatributos,lasconstantesylasasociaciones.

Hojasdetrabajo

348

Page 110: Nivel 3: Manejo de Grupos de Atributos

DiagramaUML:ListaDeContactos

DiagramaUML:Contacto

Hojasdetrabajo

349

Page 111: Nivel 3: Manejo de Grupos de Atributos

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

publicclassContacto

{

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

//Atributos

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

privateStringnombre;

privateStringapellido;

privateStringdireccion;

privateStringcorreo;

/**

*Listadeteléfonosdelcontacto.

*/

/**

*Listadepalabrasclavedelcontacto.

*/

}

publicclassListaDeContactos

{

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

//Atributos

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

/**

*Listadecontactos.

*/

}

Inicializacióndearreglos.Escribaelconstructordelasclasesdadas.

Hojasdetrabajo

350

Page 112: Nivel 3: Manejo de Grupos de Atributos

publicContacto()

{

}

publicListaDeContactos()

{

}

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

Metodo

Clase:Contacto

Contarelnúmerodepalabrasclavequeempiezanporlaletradadacomoparámetro.

Hojasdetrabajo

351

Page 113: Nivel 3: Manejo de Grupos de Atributos

publicintdarTotalPalabrasInicianCon(charpLetra)

{

}

Metodo2

Clase:Contacto

Informarsielcontactotienealgúnteléfonoquecomienzaporelprejodadocomoparámetro.

Hojasdetrabajo

352

Page 114: Nivel 3: Manejo de Grupos de Atributos

publicbooleanexisteTelefonoIniciaCon(StringpPrefijo)

{

}

Metodo3

Clase:Contacto

Retornarlaprimerapalabraclavequeterminaconlacadenadada.

publicStringdarPalabraTerminaCon(StringpCadena)

{

}

Metodo4

Clase:Contacto

Contarelnúmerodepalabrasclavequesonprejo(parteinicial)deotraspalabrasclave.

Hojasdetrabajo

353

Page 115: Nivel 3: Manejo de Grupos de Atributos

publicintdarTotalPalabrasPrefijo()

{

}

Metodo5

Clase:ListaDeContacto

Contarelnúmerodecontactoscuyonombreesigualalrecibidocomoparámetro.

publicintdarTotalContactosConNombre(StringpNombre)

{

}

Metodo6

Clase:ListadeContactos

Hojasdetrabajo

354

Page 116: Nivel 3: Manejo de Grupos de Atributos

Informarsihaydoscontactosenlalistaconlamismadireccióndecorreoelectrónico.

publicbooleanhayCorreosRepetidos()

{

}

Metodo7

Clase:ListadeContactos

Retornarelcontactoconelmayornúmerodepalabrasclave.

Hojasdetrabajo

355

Page 117: Nivel 3: Manejo de Grupos de Atributos

publicContactodarContactoConMasPalabras()

{

}

Hojasdetrabajo

356