Nivel 3: Manejo de Grupos de Atributos
Transcript of Nivel 3: Manejo de Grupos de Atributos
![Page 1: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/1.jpg)
Nivel3:ManejodeGruposdeAtributos
240
![Page 2: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/2.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/3.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/4.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/5.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/6.jpg)
Dadoelenunciadodelproblema,elmodeloconceptualsepuededefinirconunaclasellamadaCurso,lacualtendríadoceatributosdetipodoublepararepresentarlasnotasdecadaunodelosestudiantes,talcomosemuestraenlafigura3.2.
Fig.3.2Modeloconceptualdelascalificacionesdelosestudiantes
CasodeEstudioNº1:LasNotasdeunCurso
245
![Page 7: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/7.jpg)
CasodeEstudioNº1:LasNotasdeunCurso
246
![Page 8: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/8.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/9.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/10.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/11.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/12.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/13.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/14.jpg)
publicvoidnoHaceNadaUtil(doublevalor)
{
intindice=10;
notas[0]=3.5;
if(valor<2.5&¬as.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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/15.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/16.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/17.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/18.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/19.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/20.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/21.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/22.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/23.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/24.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/25.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/26.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/27.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/28.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/29.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/30.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/31.jpg)
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&¬as[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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/32.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/33.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/34.jpg)
¿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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/35.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/36.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/37.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/38.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/39.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/40.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/41.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/42.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/43.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/44.jpg)
}
}
6.5.LaClaseSilla
Tarea7
Objetivo:CompletarladeclaracióndelaclaseSilla.
CompletelasdeclaracionesdelosatributosylasenumeracionesdelaclaseSillaydesarrollelosmétodosqueselepidenparaestaclase.
CasodeEstudioNº2:ReservasenunVuelo
283
![Page 45: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/45.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/46.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/47.jpg)
publicclassSilla
{
...
publicvoidasignarPasajero(PasajeropPasajero)
{
}
...
}
Asignalasillaalpasajero"pPasajero".
publicclassSilla
{
...
publicvoiddesasignarSilla()
{
}
...
}
Quitaalpasajeroqueseencuentraenlasilla,dejándoladesocupada.
CasodeEstudioNº2:ReservasenunVuelo
286
![Page 48: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/48.jpg)
publicclassSilla
{
...
publicbooleansillaAsignada()
{
}
...
}
Informasilasillaestáocupada.
publicclassSilla
{
...
publicintdarNumero()
{
}
...
}
Retornaelnúmerodelasilla.
CasodeEstudioNº2:ReservasenunVuelo
287
![Page 49: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/49.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/50.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/51.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/52.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/53.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/54.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/55.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/56.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/57.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/58.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/59.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/60.jpg)
publicvoiddesocuparAvion()
{
}
CasodeEstudioNº2:ReservasenunVuelo
299
![Page 61: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/61.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/62.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/63.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/64.jpg)
Nombre
Resumen
Entradas
Resultado
Requerimientofuncional3
CasodeEstudioNº3:UnaTiendadeLibros
303
![Page 65: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/65.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/66.jpg)
¿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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/67.jpg)
indefinida.Cadatransacciónesdetipoabastecimientooventa.Cadatransaccióntieneeltipo(abastecimientooventa),lacantidaddeejemplaresylafecha.
CasodeEstudioNº3:UnaTiendadeLibros
306
![Page 68: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/68.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/69.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/70.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/71.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/72.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/73.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/74.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/75.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/76.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/77.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/78.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/79.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/80.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/81.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/82.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/83.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/84.jpg)
publicvoidabastecer(intpCantidad,StringpFecha)
{
}
ContenedorasdeTamañoVariable
323
![Page 85: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/85.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/86.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/87.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/88.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/89.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/90.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/91.jpg)
Requerimientosfuncionales.Describalosseisrequerimientosfuncionalesdelaaplicaciónquehayaidenticadoenelenunciado.
RequerimientoFuncional1
Hojasdetrabajo
330
![Page 92: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/92.jpg)
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional2
Hojasdetrabajo
331
![Page 93: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/93.jpg)
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional3
Hojasdetrabajo
332
![Page 94: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/94.jpg)
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional4
Hojasdetrabajo
333
![Page 95: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/95.jpg)
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional5
Hojasdetrabajo
334
![Page 96: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/96.jpg)
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional6
Hojasdetrabajo
335
![Page 97: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/97.jpg)
Nombre
Resumen
Entradas
Resultado
Modelodelmundo.Completeeldiagramadeclasesconlosatributos,lasconstantesylasasociaciones.
Hojasdetrabajo
336
![Page 98: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/98.jpg)
DiagramaUML:Parqueadero
DiagramaUML:Puesto
Hojasdetrabajo
337
![Page 99: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/99.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/100.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/101.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/102.jpg)
Método5
Informarsienalgúnlugardelparqueaderohaydospuestoslibresconsecutivos.Estosehacecuandoelvehículoquesequiereaparcaresmuygrande.
publicbooleanhayDosPuestosLibresConsecutivos()
{
}
Método6
Informarsihaydoscarrosenelparqueaderoconlamismaplaca.
publicbooleanhayPlacasRepetidas()
{
}
Hojasdetrabajo
341
![Page 103: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/103.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/104.jpg)
Requerimientosfuncionales.Describaloscincorequerimientosfuncionalesdelaaplicaciónquehayaidenticadoenelenunciado.
RequerimientoFuncional1
Hojasdetrabajo
343
![Page 105: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/105.jpg)
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional2
Hojasdetrabajo
344
![Page 106: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/106.jpg)
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional3
Hojasdetrabajo
345
![Page 107: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/107.jpg)
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional4
Hojasdetrabajo
346
![Page 108: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/108.jpg)
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional5
Hojasdetrabajo
347
![Page 109: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/109.jpg)
Nombre
Resumen
Entradas
Resultado
Modelodelmundo.Completeeldiagramadeclasesconlosatributos,lasconstantesylasasociaciones.
Hojasdetrabajo
348
![Page 110: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/110.jpg)
DiagramaUML:ListaDeContactos
DiagramaUML:Contacto
Hojasdetrabajo
349
![Page 111: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/111.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/112.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/113.jpg)
publicintdarTotalPalabrasInicianCon(charpLetra)
{
}
Metodo2
Clase:Contacto
Informarsielcontactotienealgúnteléfonoquecomienzaporelprejodadocomoparámetro.
Hojasdetrabajo
352
![Page 114: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/114.jpg)
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](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/115.jpg)
publicintdarTotalPalabrasPrefijo()
{
}
Metodo5
Clase:ListaDeContacto
Contarelnúmerodecontactoscuyonombreesigualalrecibidocomoparámetro.
publicintdarTotalContactosConNombre(StringpNombre)
{
}
Metodo6
Clase:ListadeContactos
Hojasdetrabajo
354
![Page 116: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/116.jpg)
Informarsihaydoscontactosenlalistaconlamismadireccióndecorreoelectrónico.
publicbooleanhayCorreosRepetidos()
{
}
Metodo7
Clase:ListadeContactos
Retornarelcontactoconelmayornúmerodepalabrasclave.
Hojasdetrabajo
355
![Page 117: Nivel 3: Manejo de Grupos de Atributos](https://reader030.fdocuments.es/reader030/viewer/2022012616/619eabf70ae1be7f35522233/html5/thumbnails/117.jpg)
publicContactodarContactoConMasPalabras()
{
}
Hojasdetrabajo
356