Nivel 3: Manejo de Grupos de Atributos
Transcript of Nivel 3: Manejo de Grupos de Atributos
Nivel3:ManejodeGruposdeAtributos
240
1.ObjetivosPedagógicosAlfinaldeestenivelellectorserácapazde:
Utilizarlasestructurascontenedorasdetamañofijocomoelementosparamodelarunacaracterísticadeunelementodelmundoquepermitenalmacenarunasecuenciadevalores(simplesuobjetos).Utilizarlasestructurascontenedorasdetamañovariablecomoelementosdemodeladoquepermitenmanejaratributoscuyovaloresunasecuenciadeobjetos.Utilizarlasinstruccionesiterativasparamanipularestructurascontenedorasyentenderquedichasinstruccionessepuedenutilizarenotrotipodeproblemas.CrearunaclasecompletaenJavautilizandoelambientededesarrolloEclipse.Entenderladocumentacióndeunconjuntodeclasesescritasporotrosyutilizardichadocumentaciónparapoderincorporaryusaradecuadamentedichasclasesenunprogramaqueseestáconstruyendo.
ObjetivosPedagógicos
241
2.MotivaciónCuandonosenfrentamosalaconstruccióndelmodeloconceptualdelmundodelproblema,enmuchasocasionesnosencontramosconelconceptodecolecciónogrupodecosasdelamismaclase.Porejemplo,siretomamoselcasodeestudiodelempleadopresentadoenelnivel1ylogeneralizamosalaadministracióndetodoslosempleadosdelauniversidad,esclaroqueenalgunapartedeldiagramadeclasesdebeaparecerelconceptodegrupodeempleados.Además,cuandoplanteemoslasolución,tendremosquedefinirunmétodoenalgunaclaseparaañadirunnuevoelementoaesegrupo(ingresóunnuevoempleadoalauniversidad)ounmétodoparabuscarunempleadodelauniversidad(porejemplo,quiéneselempleadoquetienemayorsalario).Demanerasimilar,siretomamoselcasodeestudiodelnivel2sobrelatienda,lonaturalesqueunatiendamanipuleunnúmeroarbitrariodeproductos,ynosólocuatrodeelloscomosedefinióenelejemplo.Enesecaso,latiendadebepoderagregarunnuevoproductoalgrupodelosqueyavende,buscarunproductoensucatálogo,etc.
Enestecapítulovamosaintroducirdosconceptosfundamentalesdelaprogramación:
1. Lasestructurascontenedoras,quenospermitenmanejaratributoscuyovalorcorrespondeaunasecuenciadeelementos.
2. Lasinstruccionesrepetitivas,quesoninstruccionesquenospermitenmanipularloselementoscontenidosendichassecuencias.
Además,enestenivelestudiaremoslamaneradecrearobjetosyagregarlosaunacontenedora,lamaneradecrearunaclasecompletaenJavaylaformadeleerladescripcióndeunconjuntodeclasesdesarrolladasporotros,parasercapacesdeutilizarlasennuestrosprogramas.
Vamosatrabajarsobrevarioscasosdeestudioqueiremosintroduciendoalolargodelnivel.
Motivación
242
3.CasodeEstudioNº1:LasNotasdeunCursoConsidereelproblemadeadministrarlascalificacionesdelosalumnosdeuncurso,enelcualhaydoceestudiantes,decadaunodeloscualessetienelanotadefinitivaqueobtuvo(unvalorentre0,0y5,0).
Sequiereconstruirunprogramaquepermita:
1. Cambiarlanotadeunestudiante.2. Calcularelpromediodelcurso.3. Establecerelnúmerodeestudiantesqueestáporencimadedichopromedio.
Enlafigura3.1aparecelainterfazdeusuarioquesequierequetengaelprograma.
Fig.3.1Interfazdeusuariodelprogramadelprimercasodeestudio
Enlaventanadelprogramaaparecelanotadecadaunodelosdoceestudiantesdel
CasodeEstudioNº1:LasNotasdeunCurso
243
curso.Lanotaconlaquecomienzanessiemprecero.Conelrespectivobotónesposiblemodificarlanota.Aloprimirlo,apareceunaventanadediálogoenlaquesepidelanuevanota.Enlapartedeabajodelaventanaseencuentranlosbotonesqueimplementanlosrequerimientosfuncionales:calcularelpromedioeindicarelnúmerodeestudiantesqueestánporencimadedichanota.
3.1.ComprensióndelosRequerimientosRequerimientofuncional1
Nombre R1–Cambiarnota.
Resumen Cambialanotadeunodelosestudiantesquepertenecealalistadelcurso.
Entradas (1)Númerodelestudiante,(2)notadelestudiante
ResultadoSemuestralanuevanotadelestudiante.Encasodequenocumplaelformatodenúmerodecimalconpuntocomoseparador,semuestraunmensajedeerror.
Requerimientofuncional2
Nombre R2–Calcularpromediodenotas.
Resumen Calculaelpromediodenotasdelalistadeestudiantes.
Entradas Ninguna.
Resultado Semuestraunmensajeconelpromediocalculado.
Requerimientofuncional3
Nombre R3–Calcularlacantidaddeestudiantesporencimadelpromedio.
Resumen Calculalacantidaddeestudiantesquetienenunanotaregistradamayoralpromediocalculado.
Entradas Ninguna.
Resultado Semuestraunmensajeconlacantidaddeestudiantesporencimadelpromedio.
3.2.ComprensióndelMundodelProblema
CasodeEstudioNº1:LasNotasdeunCurso
244
Dadoelenunciadodelproblema,elmodeloconceptualsepuededefinirconunaclasellamadaCurso,lacualtendríadoceatributosdetipodoublepararepresentarlasnotasdecadaunodelosestudiantes,talcomosemuestraenlafigura3.2.
Fig.3.2Modeloconceptualdelascalificacionesdelosestudiantes
CasodeEstudioNº1:LasNotasdeunCurso
245
CasodeEstudioNº1:LasNotasdeunCurso
246
Aunqueestemodeladoescorrecto,losmétodosnecesariospararesolverelproblemaresultaríanexcesivamentelargosydispendiosos.Cadaexpresiónaritméticaparacalcularcualquiervalordelcursotomaríamuchaslíneasdecódigo.Además,imaginesienvezde12notastuviéramosquemanejar50ó100.Terminaríamosconalgoritmosimposiblesdeleerydemantener.Necesitamosunamaneramejordehacerestemodeladoyéstaeslamotivacióndeintroducirelconceptodeestructuracontenedora.
CasodeEstudioNº1:LasNotasdeunCurso
247
4.ContenedorasdeTamañoFijoLoideal,enelcasodeestudio,seríatenerunsóloatributo(llamadoporejemplonotas),endondepudiéramosreferirnosaunodelosvaloresindividualesporunnúmeroquecorrespondaasuposiciónenelgrupo(porejemplo,laquintanota).Esetipodeatributosquesoncapacesdeagruparunasecuenciadevaloressedenominancontenedorasylaideaseilustraenlafigura3.3.ValelapenaaclararquelasintaxisusadaenlafiguranocorrespondealasintaxisdeUML,sinoquesolamentelausamosparailustrarlaideadeunaestructuracontenedora.
Fig.3.3Modeloconceptualdelascalificacionesconunacontenedora
ContenedorasdeTamañoFijo
248
Enlugardetener12atributosdetiporeal,vamosatenerunsóloatributollamado"notas"elcualcontendráensuinteriorlas12notasquequeremosrepresentar.Cadaunodeloselementosdelatributo"notas"sepuedereferenciarutilizandolasintaxisnotas[x],dondexeselnúmerodelestudianteaquiencorrespondelanota(comenzandoen0).Conestarepresentaciónpodemosmanejardemaneramássimpleygeneralelgrupodenotasdelosestudiantes.
ContenedorasdeTamañoFijo
249
UnobjetodelaclaseCursoseveríacomoapareceenlafigura3.4.Allísepuedeapreciarquelasposicionesdentrodeunacontenedorasecomienzananumerarapartirdelvalor0yqueloselementosindividualessereferencianatravésdesuposición.Cadanotavaenunaposicióndistintadelacontenedoradetipodoublellamadanotas.
Fig.3.4–Representacióngráficadeunarreglo
Enlasseccionesquesiguenveremoslamaneradedeclarar(enUMLyenJava)unatributoquecorrespondaaunacontenedora,yamanipularlosvaloresallíincluidos.
4.1DeclaracióndeunArregloEnJava,lasestructurascontenedorasdetamañofijosedenominanarreglos(arrayseninglés),ysedeclarancomosemuestraenelejemplo1.Losarreglosseutilizanparamodelarunacaracterísticadeunaclasequecorrespondeaungrupodeelementos,deloscualesseconocesunúmero.Sinosupiéramos,porejemplo,elnúmerodeestudiantesdelcursoenelcasodeestudio,deberíamosutilizarunacontenedoradetamañovariable,queeseltemadeunasecciónposteriordeestecapítulo.
Ejemplo1
Objetivo:MostrarlasintaxisusadaenJavaparadeclararunarreglo.
ContenedorasdeTamañoFijo
250
Enesteejemplosehaceladeclaracióndelarreglodenotas,comopartedelaclaseCursodelcasodeestudio.
publicclassCurso
{
//-----------------------------------
//Constantes
//-----------------------------------
publicfinalstaticintTOTAL_EST=12;
//-----------------------------------
//Atributos
//-----------------------------------
privatedouble[]notas;
...
}
Esconvenientedeclararelnúmerodeposicionesdelarreglocomounaconstante(TOTAL_EST).Esofacilitarealizarmástardemodificacionesalprograma.Sienvezde12hayquemanejar15estudiantes,bastaríaconcambiardichovalor.Enelmomentodedeclararelatributo"notas",usamoslasintaxis"[]"paraindicarquevaacontenerungrupodevalores.Eltamañodelarregloserádeterminadoenelmomentodelainicializacióndelarreglo,enelmétodoconstructor.Porahoranohayquedecirnadaalrespecto.Enladeclaraciónledecimosalcompiladorquetodosloselementosdelarreglosondetipodouble.Recuerdequeloselementosdeunarreglosecomienzanareferenciarapartirdelaposición0.
4.2InicializacióndeunArregloAligualqueconcualquierotroatributodeunaclase,esnecesarioinicializarlosarreglosenelmétodoconstructorantesdepoderlosutilizar.Parahacerlo,sedebedefinireltamañodelarreglo,esdecirelnúmerodeelementosquevaacontener.Estainicializaciónesobligatoria,puestoqueesenesemomentoqueledecimosalcomputadorcuántosvaloresdebemanejarenelarreglo,loquecorrespondealespacioenmemoriaquedebereservar.Veamosenelejemplo2cómosehaceestoparaelcasodeestudio.
Sitratamosdeaccederaunelementodeunarregloquenohasidoinicializado,vamosaobtenerelerrordeejecución:java.lang.NullPointerException
Ejemplo2
ContenedorasdeTamañoFijo
251
Objetivo:MostrarlamaneradeinicializarunarregloenJava.
Enesteejemplomostramos,enelcontextodelcasodeestudio,lamaneradeinicializarelarreglodenotasdentrodelconstructordelaclaseCurso.
publicCurso()
{
notas=newdouble[TOTAL_EST];
}
Seutilizalainstrucciónnewcomoconcualquierotroobjeto,peroseleespecificaelnúmerodevaloresquedebecontenerelarreglo(TOTAL_EST,queesunaconstantedevalor12).Estaconstrucciónreservaelespacioparaelarreglo,peroelvalordecadaunodeloselementosdelarreglosiguesiendoindefinido.Estoloarreglaremosmásadelante.
EllenguajeJavaproveeunoperadorespecial(length)paralosarreglos,quepermiteconsultarelnúmerodeelementosqueéstoscontienen.Enelcasodeestudio,laexpresiónnotas.lengthdebedarelvalor12,independientementedesilosvaloresindividualesyahansidoonoinicializados,puestoqueenelmétodoconstructordelaclasesereservódichoespaciodememoria.
4.3.AccesoalosElementosdelArregloUníndiceesunvalorenteroquenossirveparaindicarlaposicióndeunelementoenunarreglo.Losíndicesvandesde0hastaelnúmerodeelementosmenos1.Enelcasodeestudio,laprimeranotatieneelíndice0ylaúltima,elíndice11.Paratomaromodificarelvalordeunelementoparticulardeunarreglonecesitamosdarsuíndice,usandolasintaxisqueapareceenelsiguientemétododelaclaseCursoyque,enelcasogeneral,sepuederesumircomo<arreglo>[<índice>].
ContenedorasdeTamañoFijo
252
publicvoidnoHaceNadaUtil(doublevalor)
{
intindice=10;
notas[0]=3.5;
if(valor<2.5&¬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
5.InstruccionesRepetitivas
5.1.IntroducciónEnmuchosproblemasnotamosunaregularidadquesugierequesusoluciónpuedelograrserepitiendounpasoquevayatransformandogradualmenteelestadodelmundomodeladoyacercándosealasolución.Instintivamenteesloquehacemoscuandosubimosunasescaleras:repetimoselpasodesubirunescalónhastaquellegamosalfinal.Otroejemploposibleessisuponemosquetenemosenunahojadepapelunalistadepalabrassinningúnordenynospidenbuscarsilapalabra"casa"estáenlalista.Elalgoritmoqueseguimospararealizarestátareapuedeserdescritodelasiguientemanera:
1. Verifiquesilaprimerapalabraesiguala"casa".2. Siloes,nobusquemás.Sinoloes,busquelasegundapalabra.3. Verifiquesilasegundapalabraesiguala"casa".4. Siloes,nobusquemás.Sinoloes,busquelatercerapalabra.5. Repitaelprocedimientopalabraporpalabra,hastaquelaencuentreohastaqueno
hayamáspalabrasparabuscar.
Tarea1
Objetivo:Explicarelsignificadodelainstrucciónrepetitivayusarlaparadefinirunalgoritmoqueresuelvaunproblemasimple.
Supongaqueenelejemploanterior,yanoqueremosbuscarunapalabrasinocontarelnúmerototaldeletrasquehayentodaslaspalabrasdelahoja.
Escribaelalgoritmopararesolverelproblema:
InstruccionesRepetitivas
254
5.2.CalcularelPromediodelasNotasPararesolverelsegundorequerimientodelcasodeestudio(R2-calcularelpromediodelasnotas),debemoscalcularlasumadetodaslasnotasdelcursoparaluegodividirloporelnúmerodeestudiantes.Estosepuedehacerconelmétodoquesemuestraacontinuación:
publicdoublepromedio()
{
doublesuma=notas[0]+notas[1]+notas[2]+
notas[3]+notas[4]+notas[5]+
notas[6]+notas[7]+notas[8]+
notas[9]+notas[10]+notas[11];
returnsuma/TOTAL_EST;
}
Primerosumamoslasnotasdetodoslosestudiantesyguardamoselvalorenlavariablesuma.Elpromediocorrespondeadividirdichovalorporelnúmerodeestudiantes,representadoconlaconstanteTOTAL_EST.
Siplanteamoselproblemademaneraiterativa,podemosescribirelmismométododelasiguientemanera,enlacual,encadapaso,acumulamoselvalordelsiguienteelemento:
InstruccionesRepetitivas
255
publicdoublepromedio()
{
doublesuma=0.0;
intindice=0;
suma+=notas[indice];
indice++;
suma+=notas[indice];
indice++;
suma+=notas[indice];
indice++;
suma+=notas[indice];
indice++;
suma+=notas[indice];
indice++;
suma+=notas[indice];
indice++;
suma+=notas[indice];
indice++;
suma+=notas[indice];
indice++;
suma+=notas[indice];
indice++;
suma+=notas[indice];
indice++;
suma+=notas[indice];
indice++;
suma+=notas[indice];
returnsuma/TOTAL_EST;
}
Estasolucióntambiéncalculaelpromediodelcurso,peroenlugardehacerreferenciadirectaalasdocecasillasdelarreglo,utilizauníndicequevadesplazandodesde0hasta11.Porsupuestoqueesmásclaralasoluciónanterior,peroqueremosutilizaresteejemploparaintroducirlasinstruccionesiterativas,queexpresanestamismaideade"desplazar"uníndice,perousandounasintaxismuchomáscompacta.Loprimeroquedebemosnotaresquevamosaejecutar12veces(TOTAL_ESTvecesparaserexactos)ungrupodeinstrucciones.Esegrupodeinstruccioneses:suma+=notas[indice];indice++;Despuésdeejecutar12vecesesasdosinstrucciones,enlavariablesumatendremoselvalortotal,listoparadividirloporelnúmerodeestudiantes.Elíndicecomienzateniendoelvalor0yterminateniendoelvalor11.Deestamanera,cadavezquehacemosreferenciaalelementonotas[indice],estamoshablandodeunacasilladistintadelarreglo.
InstruccionesRepetitivas
256
Allírepetimos12vecesunaparejadeinstrucciones,unavezporcadaelementodelarreglo.Bastaunpocodereflexiónparaverqueloquenecesitamosespoderdecirqueesasdosinstruccionessedebenrepetirtantasvecescomonotashayaenelarreglo.Lasinstruccionesrepetitivasnospermitenhaceresodemanerasencilla.Enelsiguientemétodoseilustraelusodelainstrucciónwhileparaelmismoproblemadelcálculodelpromedio.
publicdoublepromedio()
{
doublesuma=0.0;
intindice=0;
while(indice<TOTAL_EST)
{
suma+=notas[indice];
indice++;
}
returnsuma/TOTAL_EST;
}
Laestructuradelmétodosiguesiendolamisma,conlaúnicadiferenciadequeenlugarderepetir12veceslaparejadeinstrucciones,lasincluimosdentrodelainstrucciónwhile,queseencargadeejecutarrepetidamentelasinstruccionesquetieneensuinterior.Lainstrucciónwhilesirveparadecirlealcomputadorque"mientrasque"unacondiciónsecumpla,sigaejecutandolasinstruccionesqueestánpordentro.Lacondiciónenelejemploesindice<TOTAL_EST,queequivaleadecirleque"mientrasque"elíndicenolleguea12,vuelvaaejecutarlaparejadeinstruccionesquetieneasociadas.
Ahoraveremoslaspartesdelasinstruccionesrepetitivasysusignificado.
5.3.ComponentesdeunaInstrucciónRepetitivaLafigura3.5ilustralamaneraenqueseejecutaunainstrucciónrepetitiva.Primero,yporunasolavez,seejecutanlasinstruccionesquevamosallamardeinicioopreparacióndelciclo.Allíseledaelvalorinicialalíndiceyalasvariablesenlasquequeremosacumularlosvaloresduranteelrecorrido.Luego,seevalúalacondicióndelciclo.Siesfalsa,seejecutanlasinstruccionesqueseencuentrandespuésdelciclo.Siesverdadera,seejecutanlasinstruccionesdelcuerpodelcicloparafinalmentevolverarepetirelmismoproceso.Cadarepetición,queincluyelaevaluacióndelacondiciónylaejecucióndelcuerpodelciclo,recibeelnombredeiteraciónobucle.
InstruccionesRepetitivas
257
Fig.3.5Ejecucióndeunainstrucciónrepetitiva
Usualmenteenunlenguajedeprogramaciónhayvariasformasdeescribirunainstrucciónrepetitiva.EnJavaexistenvariasformas,peroenestelibrosólovamosapresentardosdeellas:lainstrucciónforylainstrucciónwhile.
5.3.1.LasInstruccionesforywhile
Unainstrucciónrepetitivaconlainstrucciónwhileseescribedelasiguientemanera:
<inicio>
while(<condición>)
{
<cuerpo>
<avance>
}
Lasinstruccionesdepreparacióndelciclovanantesdelainstrucciónrepetitiva.Lacondiciónqueestablecesisedeberepetirdenuevoelciclovasiempreentreparéntesis.Elavancedelcicloesunaparteopcional,enlacualsemodificanlosvaloresdealgunosdeloselementosquecontrolanlasalidadelciclo(avanzarelíndiceconelque
InstruccionesRepetitivas
258
serecorreunarregloseríapartedeestasección).
Unainstrucciónrepetitivaconlainstrucciónforseescribedelasiguientemanera:
<inicio1>
for(<inicio2>;<condición>;<avance>)
{
<cuerpo>
}
Eliniciovaseparadoendospartes:enlaprimera,valadeclaraciónylainicializacióndelasvariablesquevanaserutilizadasdespuésdeterminadoelciclo(lavariablesuma,porejemplo,enelmétododelpromedio).Enlasegundapartedelazonadeiniciovanlasvariablesqueseránutilizadasúnicamentedentrodelainstrucciónrepetitiva(lavariableíndice,porejemplo,quesólosirveparadesplazarserecorriendolascasillasdelarreglo).Lasegundapartedelinicio,lomismoqueelavancedelciclo,seescribenenelencabezadodelainstrucciónfor.
Ejemplo3
Objetivo:Mostrarlamaneradeutilizarlainstruccióniterativafor.
Enesteejemplosepresentaunaimplementacióndelmétodoquecalculaelpromediodenotasdelcasodeestudio,enlacualseutilizalainstrucciónfor.
publicdoublepromedio()
{
doublesuma=0.0;
for(intindice=0;indice<TOTAL_EST;indice++)
{
suma+=notas[indice];
}
returnsuma/TOTAL_EST;
}
Puestoquelavariable"suma"seráutilizadaporfueradelcuerpodelciclo,esnecesariodeclararlaantesdelfor.Lavariable"indice"esinternaalciclo,poresosedeclaradentrodelencabezado.Elavancedelcicloconsisteenincrementarelvalordel"indice".Enesteejemplo,loscorchetesdelforsonopcionales,porquesólohayunainstruccióndentrodelcuerpodelciclo.
InstruccionesRepetitivas
259
Vamosaverenmásdetallecadaunadelaspartesdelainstrucciónylasilustraremosconalgunosejemplos.
5.3.2.ElIniciodelCiclo
Elobjetivodelasinstruccionesdeinicioopreparacióndelcicloesasegurarnosdequevamosaempezarelprocesorepetitivoconlasvariablesdetrabajoenlosvalorescorrectos.Ennuestrocaso,unavariabledetrabajolautilizamoscomoíndiceparamovernosporelarregloylaotraparaacumularlasumadelasnotas:
Lasumaantesdeempezarelciclodebesercero:doublesuma=0.0;Elíndiceapartirdelcualvamosaiterardebesercero:intindice=0;
5.3.3.LaCondiciónparaContinuar
Elobjetivodelacondicióndelcicloesidentificarelcasoenelcualsedebevolverahacerunanuevaiteración.Estacondiciónpuedesercualquierexpresiónlógica:sisuevaluacióndaverdadero,significaquesedebenejecutardenuevolasinstruccionesdelciclo.Siesfalsa,elcicloterminaysecontinúaconlainstrucciónquesiguedespuésdelainstrucciónrepetitiva.
Típicamente,cuandoseestárecorriendounarregloconuníndice,lacondicióndelciclodicequesedebevolveraiterarmientraselíndiceseamenorqueelnúmerototaldeelementosdelarreglo.Paraindicarestenúmero,sepuedeutilizarlaconstantequedefinesutamaño(TOTAL_EST)oeloperadorquecalculaelnúmerodeelementosdeunarreglo(notas.length).
Dadoquelosarregloscomienzanen0,lacondicióndelciclodebeusareloperador<yelnúmerodeelementosdelarreglo.Sonerrorescomunescomenzarlosciclosconelíndiceen1otratardeterminarconlacondiciónindice<=notas.length.
5.3.4.ElCuerpodelCicloElcuerpodelciclocontienelasinstruccionesquesevanarepetirencadaiteración.Estasinstruccionesindican:
Lamanerademodificaralgunasdelasvariablesdetrabajoparairacercándosealasolucióndelproblema.Porejemplo,sielproblemaesencontrarlasumadelasnotasdetodoslosestudiantesdelcurso,conlainstrucciónsuma+=notas[indice]agregamosunnuevovaloralacumulado.Lamanerademodificarloselementosdelarreglo,amedidaqueelíndicepasaporcadacasilla.Porejemplo,siqueremossumarunadécimaatodaslasnotas,lo
InstruccionesRepetitivas
260
hacemosconlainstrucciónnotas[indice]+=0.1.
5.3.5.ElAvancedelCicloCuandoserecorreunarreglo,esnecesariomoverelíndicequeindicalaposiciónenlaqueestamosenunmomentodado(indice++).Enalgúnpunto(enelavanceoenelcuerpo)debehaberunainstrucciónquecambieelvalordelacondiciónparaquefinalmenteéstaseafalsaysedetengaasílaejecucióndelainstruccióniterativa.Siestonosucede,elprogramasequedaráenuncicloinfinito.
Siconstruimosuncicloenelquelacondiciónnuncaseafalsa(porejemplo,siolvidamosescribirlasinstruccionesdeavancedelciclo),elprogramadarálasensacióndequeestábloqueadoenalgúnlado,opodemosllegaralerror:java.lang.OutOfMemoryError
Tarea2
Objetivo:Practicareldesarrollodemétodosquetenganinstruccionesrepetitivas.
ParaelcasodeestudiodelasnotasdelosestudiantesescribalosmétodosdelaclaseCursoqueresuelvenlosproblemasplanteados.
Calcularelnúmerodeestudiantesquesacaronunanotaentre3,0y5,0:
publicintcalcularCantidadAprobados()
{
}
Calcularlamayornotadelcurso:
InstruccionesRepetitivas
261
publicdoublecalcularMayorNota()
{
}
Contarelnúmerodeestudiantesquesacaronunanotainferioraladelestudiantequeestáenlaposicióndelarregloqueseentregacomoparámetro.SupongaqueelparámetropPosEsttieneunvalorcomprendidoentre0yTOTAL_EST–1.
publicintcalcularCantidadNotasInferioresA(intpPosEst)
{
}********
Aumentarel5%todaslasnotasdelcurso,sinqueningunadeellassobrepaseelvalor5,0:
publicvoidhacerCurva()
{
}
InstruccionesRepetitivas
262
5.4.PatronesdeAlgoritmoparaInstruccionesRepetitivasCuandotrabajamosconestructurascontenedoras,lassolucionesdemuchosdelosproblemasquedebemosresolversonsimilaresyobedecenaciertosesquemasyaconocidos(¿cuántaspersonasnohabránresueltoyalosmismosproblemasqueestamosaquíresolviendo?).Enestasecciónpretendemosidentificartresdelospatronesquemásserepitenenelmomentodeescribirunciclo,yconloscualessepuedenresolvertodoslosproblemasdelcasodeestudioplanteadoshastaahora.Loidealseríaque,alleerunproblemaquedebemosresolver(elmétodoquedebemosescribir),pudiéramosidentificarelpatrónalcualcorrespondeyutilizarlasguíasqueexistenpararesolverlo.Esosimplificaríaenormementelatareadeescribirlosmétodosquetienenciclos.
Unpatróndealgoritmosepuedevercomounasolucióngenéricaparauntipodeproblemas,enlacualelprogramadorsólodeberesolverlosdetallesparticularesdesuproblemaespecífico.
Enestasecciónvamosaintroducirtrespatronesquesediferencianporeltipoderecorridoquehacemossobrelasecuencia.
5.4.1.PatróndeRecorridoTotal
Enmuchasocasiones,pararesolverunproblemaqueinvolucraunasecuencia,necesitamosrecorrertodosloselementosqueéstacontieneparalograrlasolución.Enelcasodeestudiodelasnotastenemosvariosejemplosdeesto:
Calcularlasumadetodaslasnotas.Contarcuántosenelcursoobtuvieronlanota3,5.Contarcuántosestudiantesaprobaronelcurso.Contarcuántosenelcursoestánpordebajodelpromedio(conociendoestevalor).Aumentaren10%todaslasnotasinferioresa2,0.
¿Quétienenencomúnlosalgoritmosqueresuelvenesosproblemas?Larespuestaesquelasoluciónrequieresiempreunrecorridodetodoelarregloparapodercumplirelobjetivoqueseestábuscando:debemospasarunavezporcadaunadelascasillasdelarreglo.Estosignifica:
1. Queelíndiceparainiciarelciclodebeempezarencero.2. Quelacondiciónparacontinuaresqueelíndiceseamenorquelalongituddelarreglo.3. Queelavanceconsisteensumarleunoalíndice.
InstruccionesRepetitivas
263
Esaestructuraqueserepiteentodoslosalgoritmosquenecesitanunrecorridototalesloquedenominamoselesqueletodelpatrón,elcualsepuederesumirconelsiguientefragmentodecódigo:
for(intindice=0;indice<arreglo.length;indice++)
{
<cuerpo>
}
Escomúnqueenlugardelavariable"indice"seutiliceunavariablellamada"i".Estohaceelcódigounpocomáscompacto.Enlugardeloperador"length",sepuedeutilizartambiénlaconstantequeindicaelnúmerodeelementosdelarreglo.Loscorchetesdel"for"sólosonnecesariossielcuerpotienemásdeunainstrucción.
Loquecambiaencadacasoesloquesequierehacerenelcuerpodelciclo.Aquíhaydosvariantesprincipales.Enlaprimera,algunosdeloselementosdelarreglovanasermodificadossiguiendounaregla(porejemplo,aumentaren10%todaslasnotasinferioresa2,0).Loúnicoquesehaceenesecasoesreemplazareldelesqueletoporlasinstruccionesquehacenlamodificaciónpedidaaunelementodelarreglo(elqueseencuentraenlaposiciónindice).Esavarianteseilustraenelejemplo4.
Ejemplo4
Objetivo:Mostrarlaprimeravariantedelpatrónderecorridototal.
EnesteejemplosepresentalaimplementacióndelmétododelaclaseCursoqueaumentaen10%todaslasnotasinferioresa2,0.
publicvoidhacerCurva()
{
for(inti=0;i<notas.length;i++)
{
if(notas[i]<2.0)
{
notas[i]=notas[i]*1.1;
}
}
}
Elesqueletodelpatróndealgoritmoderecorridototalsecopiadentrodelcuerpodelmétodo.Sereemplazaelcuerpodelpatrónporlainstruccióncondicionalquehacelamodificaciónpedida.
InstruccionesRepetitivas
264
Enelcuerposeindicalamodificaciónquedebesufrirelelementoqueestásiendoreferenciadoporelíndiceconelqueserecorreelarreglo.
Lasegundavariantecorrespondeacalcularalgunapropiedadsobreelconjuntodeelementosdelarreglo(porejemplo,contarcuántosestudiantesaprobaronelcurso).Estavarianteimplicacuatrodecisionesquedefinenlamaneradecompletarelesqueletodelpatrón:
1. Cómoacumularlainformaciónquesevallevandoamedidaqueavanzaelciclo.2. Cómoinicializardichainformación.3. Cuáleslacondiciónparamodificardichoacumuladoenelpuntoactualdelciclo.4. Cómomodificarelacumulado.
Enelejemplo5seilustraestavariante.
Ejemplo5
Objetivo:Mostrarlasegundavariantedelpatrónderecorridototal.
Enesteejemplosepresentalaaplicacióndelpatróndealgoritmoderecorridototal,paraelproblemadecontarelnúmerodeestudiantesqueaprobaronelcurso.
¿Cómoacumularinformación?
VamosautilizarunavariabledetipoenterollamadavanAprobando,quevallevandoduranteelcicloelnúmerodeestudiantesqueaprobaronelcurso.
¿Cómoinicializarelacumulado?
LavariablevanAprobandosedebeinicializaren0,puestoqueinicialmentenohemosencontradotodavíaningúnestudiantequehayapasadoelcurso.
¿Condiciónparacambiarelacumulado?
Cuandonotas[indice]seamayoroiguala3,0,porquequieredecirquehemosencontradootroestudiantequepasóelcurso.
¿Cómomodificarelacumulado?
Elacumuladosemodificaincrementándoloen1.
InstruccionesRepetitivas
265
publicintdarCantidadAprobados()
{
intvanAprobando=0;
for(inti=0;i<notas.length;i++)
{
if(notas[i]>=3.0)
{
vanAprobando++;
}
}
returnvanAprobando;
}
Lascuatrodecisionestomadasanteriormentevanadefinirlamaneradecompletarelesqueletodelalgoritmodefinidoporelpatrón.Lasdecisiones1y2defineneliniciodelciclo.Lasdecisiones3y4ayudanaconstruirelcuerpodelmismo.
Acontinuaciónsemuestracómoseríaelmétodoanteriorutilizandolainstrucciónfor-each.
publicintdarCantidadAprobados()
{
intvanAprobando=0;
for(Doublenota:notas)
{
if(nota>=3.0)
{
vanAprobando++;
}
}
returnvanAprobando;
}
Enresumen,sielproblemaplanteadocorrespondealpatrónderecorridototal,sedebeidentificarlavarianteyluegotomarlasdecisionesquedefinenlamaneradecompletarelesqueleto.
Tarea3
Objetivo:Generarhabilidadenelusodelpatróndealgoritmoderecorridototal.
EscribalosmétodosdelaclaseCursoqueresuelvenlossiguientesproblemas,loscualescorrespondenalasdosvariantesdelpatróndealgoritmoderecorridototal.
InstruccionesRepetitivas
266
Escribaunmétodoparamodificarlasnotasdelosestudiantesdelasiguientemanera:atodoslosqueobtuvieronmásde4,0,lesquita0,5.Atodoslosqueobtuvieronmenosde2,0,lesaumenta0,5.Atodoslosdemás,lesdejalanotasinmodificar:
publicvoidcambiarNotas()
{
}
Escribaunmétodoqueretornelamenornotadelcurso:
publicdoubledarMenorNota()
{
}
Escribaunmétodoqueindiqueencuálrangoseencuentralamayoríadelasnotasdelcurso.Losrangosestándefinidosdelasiguientemanera:rango1de0,0a1,99,rango2de2,0a3,49,rango3de3,5a5,0.Elmétododeberetornarelnúmerodelrango.
InstruccionesRepetitivas
267
publicintdarRangoConMasNotas()
{
}
5.4.2.PatróndeRecorridoParcial
Enalgunosproblemasdemanejodesecuenciasnoesnecesariorecorrertodosloselementosparalograrelobjetivopropuesto.Pienseenlasolucióndelossiguientesproblemas:
Informarsialgúnestudianteobtuvolanota5,0.Buscarelprimerestudianteconnotaigualacero.Indicarsimásde3estudiantesperdieronelcurso.Aumentarel10%enlanotadelprimerestudiantequehayasacadomásde4,0.
Entodosesoscasoshacemosunrecorridodelarreglo,peroéstedebeterminartanprontohayamosresueltoelproblema.Porejemplo,elmétodoqueinformasialgúnestudianteobtuvocincoenlanotadelcursodebesalirdelprocesoiterativotanprontolocaliceelprimerestudianteconesanota.Sólosinoloencuentra,vaallegarhastaelfinaldelasecuencia.
Unrecorridoparcialsecaracterizaporqueexisteunacondiciónquedebemosverificarencadaiteraciónparasabersidebemosdetenerelcicloovolverarepetirlo.
Enestepatrón,debemosadaptarelesqueletodelpatrónanteriorparaquetengaencuentalacondicióndesalida,delasiguientemanera:
InstruccionesRepetitivas
268
booleantermino=false;
for(inti=0;i<arreglo.length&&!termino;i++)
{
<cuerpo>
if(<yasecumplióelobjetivo>)
{
termino=true;
}
}
Primero,declaramosunavariabledetipobooleanparacontrolarlasalidadelciclo,ylainicializamosenfalse.Segundo,enlacondicióndelciclousamoselvalordelavariablequeacabamosdedefinir:sisuvaloresverdadero,nodebevolveraiterar.Tercero,enalgúnpuntodelcicloverificamossielproblemayahasidoresuelto(siyasecumplióelobjetivo).Siéseeselcaso,cambiamoselvalordelavariableaverdadero.
for(inti=0;i<arreglo.length&&!<condición>;i++)
{
<cuerpo>
}
Estepatróndeesqueletoesmássimplequeelanterior,perosólosedebeusarsilaexpresiónqueindicaqueyasecumplióelobjetivodelcicloessencilla.
Cuandoseaplicaelpatrónderecorridoparcial,elprimerpasoquesedebeseguiresidentificarlacondiciónqueindicaqueelproblemayafueresuelto.Conesainformaciónsepuedetomarladecisióndecuálesqueletodealgoritmoesmejorusar.
Ejemplo6
Objetivo:Mostrarelusodelpatrónderecorridoparcialpararesolverunproblema.
Enesteejemplosepresentantressolucionesposiblesalproblemadedecidirsialgúnestudianteobtuvocincoenlanotadelcurso.
InstruccionesRepetitivas
269
publicbooleanhayAlguienConCinco()
{
booleantermino=false;
for(inti=0;i<notas.length&&!termino;i++)
{
if(notas[i]==5.0)
{
termino=true;
}
}
returntermino;
}
Lacondiciónparanoseguiriterandoesqueseencuentreunanotaiguala5,0enlaposicióni.Alfinaldelmétodo,seretornaelvalordelavariable"termino",queindicasielobjetivosecumplió.Estofuncionaenestecasoparticular,porquedichavariabledicequeenelarregloseencontróunanotaigualalvalorbuscado.
publicbooleanhayAlguienConCinco()
{
inti=0;
while(i<notas.length&¬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
publicbooleanhayAlguienConCinco()
{
for(inti=0;i<notas.length;i++)
{
if(notas[i]==5.0)
{
returntrue;
}
}
returnfalse;
}
Estaeslatercerasoluciónposible.Sidentrodelcicloyatenemoslarespuestadelmétodo,enlugardeutilizarlacondiciónparasalirdelciclo,lausamosparasalirdetodoelmétodo.Enlaúltimainstrucciónretornafalso,porquesillegaaesepuntoquieredecirquenoencontróningunanotaconelvalorbuscado.Estamaneradesalirdeunciclo,terminandolaejecucióndelmétodoenelqueésteseencuentra,sedebeusarconalgúncuidado,puestoquesepuedeproducircódigodifícildeentender.
Haymuchassolucionesposiblespararesolverunproblema.Unpatróndealgoritmosóloesunaguíaquesedebeadaptaralproblemaespecíficoyalestilopreferidodelprogramador.
Paraelpatrónderecorridoparcialaparecenlasmismasdosvariantesqueparaelpatrónderecorridototal(verejemplo7):
Enlaprimeravariantesemodificanloselementosdelarreglohastaqueunacondiciónsecumpla(porejemplo,encontrarlastresprimerasnotascon1,5yasignarles2,5).Enesecaso,enelcuerpodelmétodovalamodificaciónquehayquehacerlealelementoqueseencuentraenelíndiceactual,perosedebecontrolarquecuandohayallegadoalaterceramodificacióntermineelciclo.Enlasegundavariante,sedebentomarlasmismascuatrodecisionesquesetomabanconelpatrónderecorridototal,respectodelamaneradeacumularlainformaciónparacalcularlarespuestaqueestábuscandoelmétodo.
Ejemplo7
Objetivo:Mostrarelusodelpatrónderecorridoparcial,ensusdosvariantes.
EnesteejemplosepresentandosmétodosdelaclaseCurso,encadaunodeloscualesseilustraunadelasvariantesdelpatrónderecorridoparcial.
InstruccionesRepetitivas
271
Encontrarlasprimerastresnotasigualesa1,5yasignarles2,5:
publicvoidsubirNotas()
{
intnumNotas=0;
for(inti=0;i<notas.length&&numNotas<3;i++)
{
if(notas[i]==1,5)
{
numNotas++;
notas[i]=2,5;
}
}
}
Estemétodocorrespondealaprimeravariante,porquehaceunamodificacióndeloselementosdelarreglohastaqueunacondiciónsecumpla.Enelmétododelejemplo,debemoscontarelnúmerodemodificacionesquehacemos,paradetenernosalllegaralatercera.
Retornarlaposiciónenlasecuenciadelaterceranotaconvalor5,0.Sidichanotanoaparecealmenos3veces,elmétododeberetornarelvalor–1:
publicintdarTercerCinco()
{
intcuantosCincos=0;
intposicion=-1;
for(inti=0;i<notas.length&&posicion==-1;i++)
{
if(notas[i]==5,0)
{
cuantosCincos++;
if(cuantosCincos==3)
{
posicion=i;
}
}
}
returnposicion;
}
¿Cómoacumularinformación?Enestecasonecesitamosdosvariablesparaacumularlainformación:laprimeraparallevarelnúmerodenotasigualesa5,0quehanaparecido(cuantosCincos),lasegundaparaindicarlaposicióndelaterceranota5,0(posicion).¿Cómoinicializarelacumulado?LavariablecuantosCincosdebecomenzaren0.Lavariableposiciondebecomenzarenmenos1.
InstruccionesRepetitivas
272
¿Condiciónparacambiarelacumulado?Silanotaactuales5,0debemoscambiarnuestroacumulado.¿Cómomodificarelacumulado?DebecambiarlavariablecuantosCincos,incrementándoseen1.Sieseltercer5,0delasecuencia,lavariableposiciondebecambiarsuvalor,tomandoelvalordelíndiceactual.
Tarea4
Objetivo:Generarhabilidadenelusodelpatróndealgoritmoderecorridoparcial.
EscribalosmétodosdelaclaseCursoqueresuelvenlossiguientesproblemas,loscualescorrespondenalasdosvariantesdelpatróndealgoritmoderecorridoparcial.
Reemplazartodaslasnotasdelcursopor0,0,hastaqueaparezcalaprimeranotasuperiora3,0.
publicvoidcambiarNotasACero()
{
}
Calcularelnúmeromínimodenotasdelcursonecesariasparaquelasumasupereelvalor30,recorriéndolasdesdelaposición0enadelante.Sialsumartodaslasnotasnosellegaaesevalor,elmétododeberetornar–1.
publicintsumadasDanTreinta()
{
}
InstruccionesRepetitivas
273
5.4.3.PatróndeDobleRecorrido
Elúltimodelospatronesquevamosaverenestecapítuloeseldedoblerecorrido.Estepatrónseutilizacomosolucióndeaquellosproblemasenloscuales,porcadaelementodelasecuencia,sedebehacerunrecorridocompleto.Pienseenelproblemadeencontrarlanotaqueapareceunmayornúmerodevecesenelcurso.Lasoluciónevidenteestomarlaprimeranotayhacerunrecorridocompletodelarreglocontandoelnúmerodevecesqueéstavuelveaaparecer.Luego,haríamoslomismoconlosdemáselementosdelarregloyescogeríamosalfinalaquéllaqueaparezcaunmayornúmerodeveces.
Elesqueletobásicodelalgoritmoconelqueseresuelvenlosproblemasquesiguenestepatróneselsiguiente:
for(intindice1=0;indice1<arreglo.length;indice1++)
{
for(intindice2=0;indice2<arreglo.length;indice2++)
{
<cuerpodelciclointerno>
}
<cuerpodelcicloexterno>
}
Elciclodeafueraestácontroladoporlavariable"indice1",mientrasqueelciclointernoutilizalavariable"indice2".Dentrodelcuerpodelciclointernosepuedehacerreferenciaalavariable"indice1".
Lasvariantesylasdecisionessonlasmismasqueidentificamosenlospatronesanteriores.Laestrategiadesoluciónconsisteenconsiderarelproblemacomodosproblemasindependientes,yaplicarlospatronesantesvistos,talcomosemuestraenelejemplo8.
Ejemplo8
Objetivo:Mostrarelusodelpatróndealgoritmoderecorridototalcondoblerecorrido.
EnesteejemplosemuestraelmétododelaclaseCursoqueretornalanotaqueapareceunmayornúmerodeveces.Paraescribirloprocederemosporetapas,lascualessedescribenenlapartederecha.
InstruccionesRepetitivas
274
publicdoubledarNotaMasRecurrente()
{
doublenotaMasRecurrente=0.0;
for(inti=0;i<notas.length;i++)
{
for(intj=0;j<notas.length;j++)
{
//Porcompletar
}
}
returnnotaMasRecurrente;
}
Primeraetapa:armarlaestructuradelmétodoapartirdelesqueletodelpatrón.Utilizamoslasvariablesiyjparallevarlosíndicesencadaunodelosciclos.DecidimosqueelresultadolovamosadejarenunavariablellamadanotaMasRecurrente,lacualretornamosalfinaldelmétodo.Unavezconstruidalabasedelmétodo,identificamoslosdosproblemasquedebemosresolverensuinterior:(1)contarelnúmerodevecesqueapareceenelarregloelvalorqueestáenlacasillai;(2)encontrarelmayorvalorentrelosquesoncalculadosporelprimerproblema.
publicdoubledarNotaMasRecurrente()
{
doublenotaMasRecurrente=0.0;
for(inti=0;i<notas.length;i++)
{
doublenotaBuscada=notas[i];
intcontador=0;
for(intj=0;j<notas.length;j++)
{
if(notas[j]==notaBuscada)
{
contador++;
}
}
//Porcompletar
}
returnnotaMasRecurrente;
}
InstruccionesRepetitivas
275
Segundaetapa:Resolvemoselprimerodelosproblemasidentificados,usandoparaesoelciclointerno.Parafacilitareltrabajo,vamosadejarenlavariablenotaBuscada,lanotaparalacualqueremoscontarelnúmerodeocurrencias.Dichavariablelainicializamosconlanotadelacasillai.Usamosunasegundavariablellamadacontadorparaacumularallíelnúmerodevecesqueaparezcaelvalorbuscadodentrodelarreglo.DichovalorseráincrementadocuandonotaBuscada==notas[j].Alfinaldelciclo,enlavariablecontadorquedaráelnúmerodevecesqueelvalordelacasillaiapareceentodoelarreglo.
publicdoubledarNotaMasRecurrente()
{
doublenotaMasRecurrente=0.0;
intcantidadOcurrencias=0;
for(inti=0;i<notas.length;i++)
{
doublenotaBuscada=notas[i];
intcontador=0;
for(intj=0;j<notas.length;j++)
{
if(notas[j]==notaBuscada)
{
contador++;
}
}
if(contador>cantidadOcurrencias)
{
notaMasRecurrente=notaBuscada;
cantidadOcurrencias=contador;
}
}
returnnotaMasRecurrente;
}
Terceraetapa:Usamoselcicloexternoparaencontrarlanotaquemásvecesaparece.Usamosparaesodosvariables:notaMasRecurrentequeindicalanotaquehastaelmomentomásvecesaparece,ycantidadOcurrenciasparasabercuántasvecesaparecedichanota.Luegodefinimoselcasoenelcualdebemoscambiarelacumulado:siencontramosunvalorqueaparezcamásvecesqueelqueteníamoshastaelmomento(contador>
InstruccionesRepetitivas
276
cantidadOcurrencias)debemosactualizarlosvaloresdenuestrasvariables.
Engeneral,estepatróndicequepararesolverunproblemaqueimpliqueundoblerecorrido,primerodebemosidentificarlosdosproblemasquequeremosresolver(unoconcadaciclo)y,luego,debemostratarderesolverlosindependientemente,usandolospatronesderecorridototaloparcial.
Sipararesolverunproblemasenecesitauntercercicloanidado,debemosescribirmétodosseparadosqueayudenaresolvercadaproblemaindividualmente,talcomoseplanteaenelnivel4,porquelasolucióndirectaesmuycomplejaypropensaaerrores.
Tarea5
Objetivo:Generarhabilidadenelusodelpatróndealgoritmodedoblerecorrido.
EscribaelmétododelaclaseCursoqueresuelveelsiguienteproblema,quecorrespondealpatróndealgoritmodedoblerecorrido.
Calcularunanotadelcurso(sihayvariasquelocumplanpuederetornarcualquiera)talquelamitaddelasnotasseanmenoresoigualesaella.
publicdoublenotaMediana()
{
}
InstruccionesRepetitivas
277
6.CasodeEstudioNº2:ReservasenunVueloUnclientequierequeconstruyamosunprogramaparamanejarlasreservasdeunvuelo.Sesabequeelavióntiene50sillas,delascuales8sondeclaseejecutivaylasdemásdeclaseeconómica.Lassillasejecutivasseacomodanenfilasdecuatro,separadasenelmedioporelcorredor.Lassillaseconómicasseacomodanenfilasdeseis,tresacadaladodelcorredor.
Cuandounpasajerollegaasolicitarunasilla,indicasusdatospersonalesysuspreferenciasconrespectoalaposicióndelasillaenelavión.Losdatosdelpasajeroqueleinteresanalaaerolíneasonelnombreylacédula.Paradarlaubicacióndeseada,elpasajeroindicalaclaseylaubicacióndelasilla.Estapuedeser,enelcasodelasejecutivas,ventanaypasillo,yeneldelaseconómicas,ventana,pasilloycentro.Laasignacióndelasillaenelaviónsehaceenordendellegada,tomandoencuentalaspreferenciasanterioresylasdisponibilidades.
Lainterfazdeusuariodelprogramaalaquesellegódespuésdenegociarconelclientesemuestraenlafigura3.6.
CasodeEstudioNº2:ReservasenunVuelo
278
Fig.3.6Interfazdeusuarioparaelcasodeestudiodelavión
Enlapartesuperiordelaviónaparecenlas8sillasejecutivas.Enlaparteinferior,aparecenlas42sillaseconómicas,conuncorredorenlamitad.Seofrecenlasdistintasopcionesdelprogramaatravésdelosbotonesquesepuedenobservarenlapartesuperiordelaventana.Cuandounasillaestáocupada,éstaapareceráindicadaeneldibujodelaviónconuncolorespecial.Cadasillatieneasignadounnúmeroqueesúnico.Lasilla7,porejemplo,estáenprimeraclase,enelcorredordelasegundafila.
CasodeEstudioNº2:ReservasenunVuelo
279
6.1.ComprensióndelosRequerimientosNosvamosaconcentrarenelsiguienterequerimientofuncional:
Nombre R1-Asignarunasillaaunpasajero.
Resumen Asignaunasillaaunpasajerosegúnsuspreferencias.Estassonclase(EjecutivaoEconómica)yubicación(Ventana,CentrooPasillo).
Entradas (1)nombredelpasajero,(2)céduladelpasajero,(3)clasedelasilla,(4)ubicacióndelasilla.
ResultadosSemarcacomoasignadaunadelassillasdisponiblesenelavión,dependiendodelaclaseyubicaciónelegida.Encasodequetodaslassillasesténasignadas,semuestraunmensajedeerror.
6.2.ComprensióndelMundodelProblemaPodemosidentificartresentidadesdistintasenelmundo:avión,sillaypasajero.Locualnosllevaaldiagramadeclasesquesemuestraenlafigura3.7.
Fig.3.7Diagramadeclasesparaelcasodeestudiodelavión
CasodeEstudioNº2:ReservasenunVuelo
280
Enestediagramasepuedeleerlosiguiente:
Unasillapuedeserejecutivaoeconómica(unenumeradorconlasdosconstantesdefinidasparalaposibleclasedelaSilla),puedeestarlocalizadaenpasillo,corredorocentro(unenumeradorcontresconstantesdefinidasparalaposibleubicacióndelaSilla),ytieneunidentificadorúnicoqueesunvalornumérico.EntreSillayPasajerohayunaasociaciónopcional(0..1).Silaasociaciónestápresenteseinterpretacomoquelasillaestáocupadayseconoceelpasajeroqueallíseencuentra.Sinoestápresente(valenull)seinterpretacomoquelasillaestádisponible.Unpasajeroseidentificaconlacédulaytieneunnombre.Unavióntiene8sillasejecutivas(constanteSILLAS_EJECUTIVASdelaclaseAvion)y42sillaseconómicas(constanteSILLAS_ECONOMICASdelaclaseAvion).FíjesecómoseexpresalacardinalidaddeunaasociaciónenUML.
6.3.DiseñodelaSoluciónVamosadividirelproyectoen3paquetes,siguiendolaarquitecturaplanteadaenelprimerniveldellibro.Lospaquetesson:
uniandes.cupi2.avion.interfaz
uniandes.cupi2.avion.test
uniandes.cupi2.avion.mundo
Laprincipaldecisióndediseñodelprogramaserefierealamaneraderepresentarelgrupodesillasdelavión.Paraestovamosamanejardosarreglosdeobjetos.Unocon8posicionesquetendrálosobjetosdelaclaseSillaquerepresentanlassillasdelaclaseejecutiva,yotroarreglode42posicionesconlosobjetospararepresentarlassillaseconómicas.
Enlasseccionesquesiguenpresentaremoslasdistintasclasesdelmodelodelmundoqueconstituyenlasolución.Comenzamosporlaclasemássencilla(laclasePasajero)yterminamosporlaclasequetienelaresponsabilidaddemanejarlosgruposdeatributos(laclaseAvion),endondetendremoslaoportunidaddeutilizarlospatronesdealgoritmovistosenlasseccionesanteriores.
6.4.LaClasePasajeroTarea6
Objetivo:HacerladeclaraciónenJavadelaclasePasajero.
CasodeEstudioNº2:ReservasenunVuelo
281
CompleteladeclaracióndelaclasePasajero,incluyendosusatributos,elconstructorylosmétodosqueretornanlacédulayelnombre.Puedeguiarseporeldiagramadeclasesqueapareceenlafigura3.7.
publicclassPasajero
{
//-----------------------------------
//Atributos
//-----------------------------------
//-----------------------------------
//Constructor
//-----------------------------------
publicPasajero(StringpCedula,StringpNombre)
{
}
//-----------------------------------
//Métodos
//-----------------------------------
publicStringdarCedula()
{
}
publicStringdarNombre()
{
CasodeEstudioNº2:ReservasenunVuelo
282
}
}
6.5.LaClaseSilla
Tarea7
Objetivo:CompletarladeclaracióndelaclaseSilla.
CompletelasdeclaracionesdelosatributosylasenumeracionesdelaclaseSillaydesarrollelosmétodosqueselepidenparaestaclase.
CasodeEstudioNº2:ReservasenunVuelo
283
publicclassSilla
{
//-------------------------------------------
//Enumeraciones
//-------------------------------------------
/**
*Enumeradoresparalasclasesdesilla.
*/
publicenumClase
{
/**
*Representalaclaseejecutiva.
*/
EJECUTIVA,
/**
*Representalaclaseeconómica.
*/
ECONOMICA
}
/**
*Enumeradoresparalasubicacionesdelassillas.
*/
publicenumUbicacion
{
/**
*Representalaubicaciónventana.
*/
VENTANA,
/**
*Representalaubicacióncentro.
*/
/**
*Representalaubicaciónpasillo.
*/
}
...
}
Sedeclaraunenumeradorcondosconstantesparaelatributoclasedelasilla(EJECUTIVA,ECONOMICA).Sedeclaraunenumeradorcontresconstantespararepresentarlastresubicacionesposiblesdeunasilla(VENTANA,CENTRAL,PASILLO).
CasodeEstudioNº2:ReservasenunVuelo
284
publicclassSilla
{
...
//-------------------------------------------
//Atributos
//-------------------------------------------
privateintnumero;
privateClaseclase;
privateUbicacionubicacion;
privatePasajeropasajero;
...
}
Sedeclaranenlaclasecuatroatributos:(1)elnúmerodelasilla,(2)laclasedelasilla,(3)suubicacióny(4)elpasajeroqueopcionalmentepuedeocuparlasilla.Elatributo"pasajero"debetenerelvalornullsinohayningúnpasajeroasignadoalasilla.
publicSilla(intpNumero,ClasepClase,UbicacionpUbicacion)
{
numero=pNumero;
clase=pClase;
ubicacion=pUbicacion;
pasajero=null;
}
Enelconstructorseinicializanlosatributosapartirdelosvaloresqueserecibencomoparámetro.Seinicializaelatributopasajeroennull,paraindicarquelasillaseencuentravacía.
CasodeEstudioNº2:ReservasenunVuelo
285
publicclassSilla
{
...
publicvoidasignarPasajero(PasajeropPasajero)
{
}
...
}
Asignalasillaalpasajero"pPasajero".
publicclassSilla
{
...
publicvoiddesasignarSilla()
{
}
...
}
Quitaalpasajeroqueseencuentraenlasilla,dejándoladesocupada.
CasodeEstudioNº2:ReservasenunVuelo
286
publicclassSilla
{
...
publicbooleansillaAsignada()
{
}
...
}
Informasilasillaestáocupada.
publicclassSilla
{
...
publicintdarNumero()
{
}
...
}
Retornaelnúmerodelasilla.
CasodeEstudioNº2:ReservasenunVuelo
287
publicclassSilla
{
...
publicClasedarClase()
{
}
...
}
Retornalaclasedelasilla.
publicclassSilla
{
...
publicUbicaciondarUbicacion()
{
}
...
}
Retornalaubicacióndelasilla.
publicclassSilla
{
...
publicPasajerodarPasajero()
{
}
...
}
Retornaelpasajerodelasilla.
6.6.LaClaseAvion
CasodeEstudioNº2:ReservasenunVuelo
288
Ejemplo9
Objetivo:MostrarlasdeclaracionesyelconstructordelaclaseAvion.
EnesteejemplosepresentanlasdeclaracionesdelosatributosylasconstantesdelaclaseAvion,lomismoquesumétodoconstructor.
publicclassAvion
{
//--------------------------------------------
//Constantes
//--------------------------------------------
publicfinalstaticintSILLAS_EJECUTIVAS=8;
publicfinalstaticintSILLAS_ECONOMICAS=42;
...
}
Condosconstantesrepresentamoselnúmerodesillasdecadaunadelasclases.
publicclassAvion
{
...
//--------------------------------------------
//Atributos
//--------------------------------------------
privateSilla[]sillasEjecutivas;
privateSilla[]sillasEconomicas;
...
}
LaclaseAviontienedoscontenedorasdetamañofijodesillas:una,de42posiciones,conlassillasdeclaseeconómica,yotra,de8posiciones,conlassillasdeclaseejecutiva.Sedeclaranlosdosarreglos,utilizandolamismasintaxisqueutilizamosenelcasodelasnotasdelcurso.Laúnicadiferenciaesque,enlugardecontenervaloresdetiposimple,vanacontenerobjetosdelaclaseSilla.
Acontinuaciónapareceunfragmentodelconstructordelaclase.Enlasprimerasdosinstruccionesdelconstructor,creamoslosarreglos,informandoelnúmerodecasillasquedebencontener.Paraesousamoslasconstantesdefinidasenlaclase.
CasodeEstudioNº2:ReservasenunVuelo
289
Despuésdehaberreservadoelespacioparalosdosarreglos,procedemosacrearlosobjetosquerepresentancadaunadelassillasdelaviónylosvamosponiendoenlarespectivacasilla.
Estainicializaciónsepodríahaberhechoconvariosciclos,peroelcódigoresultaríaunpocodifícildeexplicar.
publicAvion()
{
sillasEjecutivas=newSilla[SILLAS_EJECUTIVAS];
sillasEconomicas=newSilla[SILLAS_ECONOMICAS];
//Creacióndelassillasdeclaseejecutiva
sillasEjecutivas[0]=newSilla(1,Clase.EJECUTIVA,Ubicacion.VENTANA);
sillasEjecutivas[1]=newSilla(2,Clase.EJECUTIVA,Ubicacion.PASILLO);
sillasEjecutivas[2]=newSilla(3,Clase.EJECUTIVA,Ubicacion.PASILLO);
sillasEjecutivas[3]=newSilla(4,Clase.EJECUTIVA,Ubicacion.VENTANA);
sillasEjecutivas[4]=newSilla(5,Clase.EJECUTIVA,Ubicacion.VENTANA);
sillasEjecutivas[5]=newSilla(6,Clase.EJECUTIVA,Ubicacion.PASILLO);
sillasEjecutivas[6]=newSilla(7,Clase.EJECUTIVA,Ubicacion.PASILLO);
sillasEjecutivas[7]=newSilla(8,Clase.EJECUTIVA,Ubicacion.VENTANA);
//Creacióndelassillasdeclaseeconómica
sillasEconomicas[0]=newSilla(9,Clase.ECONOMICA,Ubicacion.VENTANA);
sillasEconomicas[1]=newSilla(10,Clase.ECONOMICA,Ubicacion.CENTRAL);
sillasEconomicas[2]=newSilla(11,Clase.ECONOMICA,Ubicacion.PASILLO);
...
}
Yaconlasdeclaracioneshechasyconelconstructorimplementado,estamoslistosparacomenzaradesarrollarlosdistintosmétodosdelaclase.Peroantesdeempezar,queremoshablarunpocodelasdiferenciasqueexistenentreunarreglodevaloresdetiposimple(comoeldelcasodeestudiodelasnotas)yunarreglodeobjetos(comoeldelcasodelavión).
Paraempezar,enlafigura3.8asemuestraunainstanciadelaclaseSillaocupadaporunpasajero.Enlafigura3.8bsemuestraunobjetodelaclaseSillaqueseencuentravacía.Enlafigura3.8cseilustraunposiblecontenidodelarreglodesillasejecutivas(usandoundiagramadeobjetos).
CasodeEstudioNº2:ReservasenunVuelo
290
Fig.3.8Ejemplodelcontenidodelarreglodesillasejecutivas
Figura3.8a:enlasilladeprimeraclasenúmero6,situadaenelcorredor,estásentadoelSr.JoséSánchezconcédulaNo.1234.Figura3.8b:lasilladeclaseeconómicanúmero10,situadaenelcentro,estádesocupada.
CasodeEstudioNº2:ReservasenunVuelo
291
Figura3.8c:cadacasilladelarreglotieneunobjetodelaclaseSilla(inclusosilasillaestádesocupada).Lassillasocupadastienenunaasociaciónconelobjetoquerepresentaalpasajeroquelaocupa.*Enlosarreglosdeobjetossealmacenanreferenciasalosobjetos,enlugardelosobjetosmismos.ConlasintaxissillasEjecutivas[x]podemoshacerreferenciaalobjetodelaclaseSillaqueseencuentraenlacasillax.Siqueremosllegarhastaelpasajeroqueseencuentraenalgunapartedelavión,debemossiemprepasarporlasillaqueocupa.Nohayotramanerade"navegar"hastaél.
Yateniendounavisualizacióndeldiagramadeobjetosdelcasodeestudio,esmásfácilcontestarlassiguientespreguntas:
¿Cómosellamaun
métododeunobjetoqueestáenunarreglo?
Porejemplo,dentrodelaclaseAvion,parapreguntarsilasillaqueestáenlaposición0delarreglodesillasejecutivasestá
ocupada,seutilizalasintaxis:sillasEjecutivas[0].sillaAsignada().Estasintaxisessólounaextensióndelasintaxisqueya
veníamosutilizando.Loúnicoquesedebetenerencuentaesquecadavezquehacemosreferenciaaunacasilla,estamos
hablandodeunobjeto,másquedeunvalorsimple.
¿Losobjetosqueestánenunarreglosepuedenguardarenunavariable?
Tantolasvariablescomolascasillasdelosarreglosguardanúnicamentereferenciasalosobjetos.Sisehacelasiguienteasignación:SillasillaTemporal=sillasEjecutivas[0];tantolavariablesillaTemporalcomolacasilla0delarregloestaránhaciendoreferenciaalmismoobjeto.Debequedarclaroqueelobjetonoseduplica,sinoqueambosnombreshacenreferenciaalmismoobjeto.
¿Quépasaconelobjetoqueestásiendoreferenciadodesdeunacasillasiasignonullaesaposicióndelarreglo?
Siguardóunareferenciaaeseobjetoenalgúnotrolado,puedeseguirusandoelobjetoatravésdedichareferencia.Sinoguardóunareferenciaenningúnlado,elrecolectordebasuradeJavadetectaqueyanoloestáusandoyrecuperalamemoriaqueelobjetoestabautilizando.¡Adiósobjeto!
Ejemplo10
Objetivo:Mostrarlasintaxisqueseusaparamanipulararreglosdeobjetos.
EnesteejemplosemuestraelcódigodeunmétododelaclaseAvionquepermiteeliminartodaslasreservasdelavión.Noformapartedelosrequerimientosfuncionales,peronosvaapermitirmostrarunaaplicacióndelpatrónderecorridototal.
CasodeEstudioNº2:ReservasenunVuelo
292
publicvoideliminarReservas()
{
for(inti=0;i<SILLAS_EJECUTIVAS;i++)
{
sillasEjecutivas[i].desasignarSilla();
}
for(inti=0;indice<SILLAS_ECONOMICAS;i++)
{
sillasEconomicas[i].desasignarSilla();
}
}
Estemétodoeliminatodaslasreservasquehayenelavión.Notequepodemosutilizarlamismavariablecomoíndiceenlosdosciclos.Larazónesqueenlainstrucciónfor,alterminardeejecutarelciclo,sedestruyenlasvariablesdeclaradasdentrodeély,porestarazón,podemosvolverautilizarelmismonombreparalavariabledelsegundociclo.Elmétodoutilizaelpatrónderecorridototaldosveces,unaporcadaunodelosarreglosdelavión.
Yavimostodalateoríaconcernientealmanejodelosarreglos(estructurascontenedorasdetamañofijo).Loquesigueesaplicarlospatronesdealgoritmoquevimosunasseccionesatrás,paraimplementarlosmétodosdelaclaseAvion.
Tarea8
Objetivo:DesarrollarlosmétodosdelaclaseAviónquenospermitanimplementarlosrequerimientosfuncionalesdelcasodeestudio.
Paracadaunodelosproblemasqueseplanteanacontinuación,escribaelmétodoqueloresuelve.Noolvideidentificarprimeroelpatróndealgoritmoquesenecesitayusarlasguíasquesedieronenseccionesanteriores.
Calcularelnúmerodesillasejecutivasocupadasenelavión:
CasodeEstudioNº2:ReservasenunVuelo
293
publicintcontarSillasEjecutivasOcupadas()
{
}
Localizarlasillaenlaqueseencuentraelpasajeroidentificadoconlacédulaqueseentregacomoparámetro.Sinohayningúnpasajeroenclaseejecutivaconesacédula,elmétodoretornanull.
publicSillabuscarPasajeroEjecutivo(StringpCedula)
{
}
Localizarunasillaeconómicadisponible,enunalocalizacióndada(ventana,centroopasillo).Sinoexisteninguna,elmétodoretornanull:
publicSillabuscarSillaEconomicaLibre(UbicacionpUbicacion)
{
}
CasodeEstudioNº2:ReservasenunVuelo
294
Asignaralpasajeroqueserecibecomoparámetrounasillaenclaseeconómicaqueestélibre(enlaubicaciónpedida).Sielprocesotieneéxito,elmétodoretornaverdadero.Encasocontrario,retornafalso:
publicbooleanasignarSillaEconomica(UbicacionpUbicacion,PasajeropPasajero)
{
}
Anularlareservaenclaseejecutivaqueteníaelpasajeroconlacéduladada.Retornaverdaderosielprocesotieneéxito:
publicbooleananularReservaEjecutivo(StringpCedula)
{
}
Contarelnúmerodepuestosdisponiblesenunaventana,enlazonaeconómicadelavión:
CasodeEstudioNº2:ReservasenunVuelo
295
publicintcontarVentanasEconomica()
{
}
Informarsienlazonaeconómicadelaviónhaydospersonasquesellamenigual.Patróndedoblerecorrido:
publicbooleanhayDosHomonimosEconomica()
{
}
6.7.Lainstrucciónfor-eachElesqueletodelpatrónderecorridototaltambiénpuededefinirseconlainstrucciónfor-each,lacualesunavariacióndelainstrucciónforquesepuederesumirenelsiguientefragmentodecódigo:
for(NombreClaseelemento:arreglo)
{
<cuerpo>
}
Lainstrucciónfor-eachpermiterecorrertodosloselementosdeunarreglo.Deestamanera,paracadaobjetoexistenteenelarreglo,seejecutanlasinstruccionesqueseencuentranenelcuerpodelciclo.Encadaiteración,lavariableelementovaareferenciaralobjetoactual,
CasodeEstudioNº2:ReservasenunVuelo
296
permitiendoquesehaganlasoperacionesnecesariassobreeste.Caberesaltarqueenelfor-eachnoesnecesarioutilizaruníndice,yaquelainstrucciónseencargadepasarporcadaunodeloselementosdeformaautomática.Esporestoquelainstrucciónfor-eachseutilizaprincipalmenteenproblemasquerequieranunrecorridosobretodosloselementosdelarreglo(recorridototal).
Ejemplo11
Objetivo:Mostrarlasintaxisqueseusaparalainstrucciónfor-each.
EnesteejemplosemuestraelcódigodeunmétododelaclaseAvion,elcualpermitecontarlacantidaddesillaseconómicasocupadas,conelfinmostrarunaaplicacióndelpatrónderecorridototalutilizandolainstrucciónfor-each.Sinohayningunasillaeconómicaocupada,elmétodoretornacero.
Acontinuaciónsemuestraelmétodoutilizandolainstrucciónfor:
publicintcontarSillasEconomicasOcupadas()
{
intcontador=0;
Sillasilla=null;
for(inti=0;i<SILLAS_ECONOMICAS;i++)
{
silla=sillasEconomicas[i];
if(silla.sillaAsignada())
{
contador++;
}
}
returncontador;
}
Laimplementacióndelmétodoutilizandolainstrucciónfor-eacheslasiguiente:
publicintcontarSillasEconomicasOcupadas()
{
intcontador=0;
for(SillasillaEconomica:sillasEconomicas)
{
if(sillaEconomica.sillaAsignada())
{
contador++;
}
}
returncontador;
}
CasodeEstudioNº2:ReservasenunVuelo
297
Tarea9
Objetivo:DesarrollarlosmétodosdelaclaseAviónquenospermitanimplementarlosrequerimientosfuncionalesdelcasodeestudioutilizandolainstrucciónfor-each.
Paracadaunodelosproblemasqueseplanteanacontinuación,escribaelmétodoqueloresuelve.Entodosloscasossonproblemasquerequierenunrecorridototalyquesedebenresolverutilizandolainstrucciónfor-each.
Calcularelnúmerodesillaseconómicaslibresenelavión:
publicintcontarSillasEconomicasLibres()
{
}
Contarelnúmerodepuestosdisponiblesenelpasillo,enlazonaejecutivadelavión:
publicintcontarPasilloEjecutivas()
{
}
Desocuparavión.Seencargadedesocupartodaslassillasdelavíon:
CasodeEstudioNº2:ReservasenunVuelo
298
publicvoiddesocuparAvion()
{
}
CasodeEstudioNº2:ReservasenunVuelo
299
7.CasodeEstudioNº3:TiendadeLibrosSequiereconstruirunaaplicaciónquepermitaadministrarunatiendadelibros.Latiendatieneuncatálogodelibros,quesonloslibrosquedeseaponeralaventa.Laaplicaciónpermiteabastecerlatiendaconejemplaresdeloslibrosdelcatálogoyvenderlos.Adicionalmentepermitesabercuántodinerosetieneencaja,empezandoconunainversióninicialde$1.000.000.
Decadalibroseconoce:
ISBN.Identificadordellibro.NopuedenexistirdoslibrosenlatiendaconelmismoISBN.Título.Elnombredellibro.Imagen.Laimagendellibro.Preciodecompra:Valorpagadoporlacompradecadaejemplarenlatienda.Preciodeventa:Valorporelcualsevendecadaejemplardellibro.Cantidadactual.Cantidadactualdeejemplaresquetienelatienda.Solopuedesermodificadamediantelaventaoelabastecimiento.
Adicionalmente,decadalibroseconocentodaslastransaccionesquesehanrealizadosobreél.Decadatransacciónseconoce:
Eltipodetransacción.Puedeserventaoabastecimiento.Lafechaderealización.Lacantidaddeejemplaresincluidosenlatransacción.
Elabastecimientodelibrospermiteaumentarlacantidadactualdeejemplaresdellibroyregistrarunatransaccióndetipoabastecimiento.
Laventadelibrospermitedisminuirlacantidadactualdeejemplaresdellibroyregistrarunatransaccióndeventa.Estatransacciónsolosepodrárealizarsilacantidadactualdeejemplaresesmayoralacantidadquesequierevender.
Enlafigura3.9aparecelainterfazdeusuarioquesetieneprevistaparaelprogramaquesevaaconstruir.
CasodeEstudioNº3:UnaTiendadeLibros
300
Fig.3.9Interfazdeusuariodelatiendadelibros
Lainterfazestádivididaencuatrozonas:unaparamostrareldineroquehayenlacaja,unaparaqueelusuariopuedaverellistadodelibrosdisponiblesenelcatálogo(dondetambiénpuederegistrarnuevoslibros),unaparamostrarlainformacióndeunlibrodelcatálogo,yunaparalasbúsquedasyconsultasrealizadassobreelcatálogodelibros.Enlaimagendelejemplo,aparecentreslibrosenelcatálogo.Paraagregarlibrosalatienda,seusaelbotónRegistrar.AlabastecimientodelibrosehaceatravésdelbotónAbastecer,laventadelibrosatravésdelbotónVenderylaeliminacióndeunlibroatravésdelbotónEliminar.EnlazonadeconsultasybúsquedassepuedebuscarunlibroporISBNotítulo,yconsultarellibromáseconómico,elmáscostosoyelmásvendido.
7.1.ComprensióndelosRequerimientosLosrequerimientosfuncionalesdeestecasodeestudioson10:
CasodeEstudioNº3:UnaTiendadeLibros
301
1. Registrarunlibroenelcatálogo.2. Eliminarunlibrodelcatálogo.3. Buscarunlibroportítulo.4. BuscarunlibroporISBN.5. Abastecerejemplaresdeunlibro.6. Venderejemplaresdeunlibro.7. Calcularlacantidaddetransaccionesdeabastecimientodeunlibroparticular.8. Buscarellibromáscostoso.9. Buscarellibromenoscostoso.10. Buscarellibromásvendido.
Tarea10
Objetivo:Entenderelproblemadelcasodeestudio.
Leadetenidamenteelenunciadodelcasodeestudioycompleteladocumentacióndelosprimerostresrequerimientosfuncionales.
Requerimientofuncional1
Nombre R1-Registrarunlibroenelcatálogo.
Resumen
Registraunlibroenelcatálogoconsutítulo,códigoISBN,preciodecompraypreciodeventa.Lacantidadactualdeejemplaresenelmomentoderegistroesceroyellibrosecreasintransaccionesregistradas.Elresultadoeselnuevolibrocreadoencasodequesisehayapodidoregistrar,encasocontrario,elresultadodebeseresnulo.
Entradas (1)títulodellibro,(2)ISBNdellibro,(3)preciodecompradellibro,(4)preciodeventadellibro,(5)imagendellibro.
Resultado Elcatálogohasidoactualizadoycontieneelnuevolibro.
Requerimientofuncional2
CasodeEstudioNº3:UnaTiendadeLibros
302
Nombre
Resumen
Entradas
Resultado
Requerimientofuncional3
CasodeEstudioNº3:UnaTiendadeLibros
303
Nombre
Resumen
Entradas
Resultado
7.2.ComprensióndelMundodelProblemaEnelmundodelproblemapodemosidentificartresentidades(verfigura3.10):
Latiendadelibros(claseTiendaDeLibros)Unlibro(claseLibro)Unatransacción(claseTransaccion)
Todaslascaracterísticasdelasentidadesidentificadasenelmodeloconceptualsepuedenmodelarconloselementosquehemosvistohastaahoraenellibro,conexcepcióndelgrupodelibrosdelcatálogoyellistadodetransaccionesdeunlibro.Ladificultadquetenemosesquenopodemospredecirlacardinalidaddedichogrupodeelementosy,porestarazón,elmodeladoconarreglospuedenoserelmásadecuado.
CasodeEstudioNº3:UnaTiendadeLibros
304
¿Enquésediferenciadelcasodelavión?Ladiferenciaradicaenqueelavióntieneunasdimensionespredefinidas(42sillasenclaseeconómicay8enclaseejecutiva)quenovanacambiardurantelaejecucióndelprograma(noexisteunrequerimientodeagregarunasillaalavión).Enelcasodelatiendadelibros,seplanteaqueelcatálogopuedetenercualquiercantidaddelibrosyqueunlibropuedetenercualquiercantidaddetransacciones.Siusáramosarreglospararepresentardichainformación,¿dequédimensióndeberíamoscrearlos?¿Quéhacemossisellenaelarreglodelibrosdelcatálogo?
Fig.3.10Modeloconceptualparaelcasodeestudiodelatiendadelibros
Lasoluciónaeseproblemaseráeltemadeestapartefinaldelnivel,enlacualpresentamoslascontenedorasdetamañovariable,lamaneraenqueseusananiveldemodeladodelmundoylaformaenqueseincorporanenlosprogramasescritosenJava.
Porahoradémosleunamiradaaldiagramadeclasesdelafigura3.10yrecorramoscadaunadelasentidadesidentificadas:
Unatiendadelibrostieneuncatálogo(asísellamalaasociación),quecorrespondeaungrupodelongitudindefinidadelibros(representadoporel*).Unlibrotienecincoatributos:untítulo,unISBN,unpreciodecompra,unpreciodeventayunaimagen.Unlibrotieneungrupodetransacciones(asísellamalaasociación)delongitud
CasodeEstudioNº3:UnaTiendadeLibros
305
indefinida.Cadatransacciónesdetipoabastecimientooventa.Cadatransaccióntieneeltipo(abastecimientooventa),lacantidaddeejemplaresylafecha.
CasodeEstudioNº3:UnaTiendadeLibros
306
8.ContenedorasdeTamañoVariableEnmuchosproblemasnecesitamosrepresentargruposdeatributosparaloscualesnoconocemossutamañomáximo.Enelcasodelatiendadelibros,porejemplo,elcatálogopodríatener100ó10.000librosdistintos.Parapoderrepresentarymanejaresetipodecaracterísticas,tenemoslascontenedorasdetamañovariable.
EneldiagramadeclasesdeUML,lasasociacionesquetienendichacaracterísticaserepresentanconunacardinalidadindefinida,usandolossímbolos*o0..N,talcomosemostróenlafigura3.10.
ParaimplementarlasenJava,noexistenelementosenellenguajecomolosarreglos,sinoqueesnecesarioutilizaralgunasclasesquefueronconstruidasconestefin.
¿Cuálesladiferencia?Laprincipaldiferenciaesqueparamanipularlascontenedorasdetamañovariabledebemosutilizarlamismasintaxisqueutilizamosparamanejarcualquierotraclase.Nohayunasintaxisespecialparaobtenerunelemento(como[]enlosarreglos),nicontamosconoperadoresespeciales(length).
EnJavaexistenvariasclasesquenospermitenmanejarcontenedorasdetamañovariable,todasellasdisponiblesenelpaquetellamadojava.util.EnestelibrovamosautilizarlaclaseArrayList,queeseficienteeincluyetodalafuncionalidadnecesariaparamanipulargruposdeobjetos.Lamayorrestricciónquevamosaencontraresquenopermitemanejargruposdeatributosdetiposimple,sinoúnicamentegruposdeobjetos.Enestenivelvamosaestudiarúnicamentelosprincipalesmétodosdeesaclase,aquéllosqueofrecenlasfuncionalidadestípicasparamanejarestaclasedeestructuras.Sideseaconocerladescripcióndetodoslosmétodosdisponibles,loinvitamosaconsultarladocumentaciónqueapareceenelsitiowebdellenguajeJava.
Porsimplicidad,vamosallamarvectoracualquierimplementacióndeunaestructuracontenedoradetamañovariable.
Aligualqueconlosarreglos,comenzamosahoraelrecorridoparaestudiarlamaneradedeclararunatributodelaclaseArrayList,lamaneradeteneraccesoasuselementos,laformademodificarlo,etc.Paraestoutilizaremoselcasodeestudiodelatiendadelibros.
8.1.DeclaracióndeunVector
ContenedorasdeTamañoVariable
307
PuestoqueunvectoresunaclasecomúnycorrientedeJava,lasintaxisparadeclararloeslamismaquehemosutilizadoenlosnivelesanteriores.Enelejemplo11seexplicanlasdeclaracionesdelasclasesTiendaLibrosyLibro.
Ejemplo12
Objetivo:MostrarlasintaxisusadaenJavaparadeclararunvector.
EnesteejemplosemuestranlasdeclaracionesdelasclasesTiendaLibrosyLibro,lascualescontienenatributosdetipovector.
packageuniandes.cupi2.tiendadelibros.mundo;
importjava.util.*;
publicclassTiendaDeLibros
{
//----------------------------------
//Atributos
//----------------------------------
privateArrayList<Libro>catalogo;
privatedoublecaja;
...
}
ParapoderusarlaclaseArrayListesnecesarioimportarsudeclaración,indicandoelpaqueteenelqueéstaseencuentra(java.util).EstosehaceconlainstrucciónimportdeJava.Dichainstrucciónvadespuésdeladeclaracióndelpaquetedelaclaseyantesdesuencabezado.EnlaclaseTiendaDeLibrossedeclarandosatributos:elcatálogo,queesunvector,yeldineroquehayenlacaja,queesdetipodouble.Aldeclararunvector,seindicaeltipodeobjetosquesevanaguardarenél,usandolasintáxis<NombreDeLaClase>.Enelcasodelcatálogo,seindicaqueelcatálogoesunvectordelibros.
ContenedorasdeTamañoVariable
308
packageuniandes.cupi2.tiendadelibros.mundo;
importjava.util.*;
publicclassLibro
{
//----------------------------------
//Atributos
//----------------------------------
privateArrayList<Transaccion>transacciones;
...
}
EnlaclaseLibrosedeclaraelgrupodetransaccionescomounvector.SedebedenuevoimportarelpaqueteendondeseencuentralaclaseArrayList,usandolainstrucciónimport.Fíjesequeladeclaracióndeunvectorutilizalamismasintaxisqueseusaparadeclararcualquierotroatributodelaclase.
8.2InicializaciónyTamañodeunVectorEnelconstructoresnecesarioinicializarlosvectores,aligualquehacemoscontodoslosdemásatributosdeunaclase.Haydosdiferenciasentrecrearunarregloycrearunvector:
Enlosvectoresseutilizalamismasintaxisdecreacióndecualquierotroobjeto(newArrayList<NombreDeLaClase>())teniendoqueagregarelnombredelasclasealaquepertenecenlosobjetosquesevanaagregaralvector,mientrasquelosarreglosutilizanlos[]paraindicareltamaño(newNombreDeLaClase[TAMANIO]).Enlosvectoresnoesnecesariodefinirelnúmerodeelementosquevaatener,mientrasqueenlosarreglosesindispensablehacerlo.
Ejemplo13
Objetivo:Mostrarlamaneradeinicializarunvector.
EnesteejemplosemuestranlosmétodosconstructoresdelasclasesTiendaLibrosyLibro,lascualescontienenatributosdetipovector.
publicTiendaDeLibros()
{
catalogo=newArrayList<Libro>();
}
ContenedorasdeTamañoVariable
309
Nohaynecesidaddeespecificarelnúmerodeelementosqueelvectorvaacontener.
publicLibro()
{
transacciones=newArrayList<Transaccion>();
}
Alcrearunvectorsereservaunespaciovariableparaalmacenarloselementosquevayanapareciendo.Inicialmentehay0objetosenél.
DosmétodosdelaclaseArrayListnospermitenconocerelnúmerodeelementosqueenunmomentodadohayenunvector:
isEmpty():esunmétodoqueretornaverdaderosielvectornotieneelementosyfalsoencasocontrario.Porejemplo,enlaclaseLibro,despuésdellamarelconstructor,lainvocacióndelmétodotransacciones.isEmpty()retornaverdadero.size():esunmétodoqueretornaelnúmerodeelementosquehayenelvector.Paraelmismocasoplanteadoanteriormente,transacciones.size()esiguala0.
Siadaptamoselesqueletodelospatronesdealgoritmoparaelmanejodevectores,loúnicoquevaacambiareslacondiciónparacontinuarenelciclo.Enlugardeusarlaoperaciónlengthdelosarreglos,debemosutilizarelmétodosize()delosvectores,talcomosemuestraenelsiguientefragmentodemétododelaclaseTiendaDeLibros.
publicvoidesqueleto()
{
for(inti=0;i<catalogo.size();i++)
{
//cuerpodelciclo
}
}
Lasposicionesenlosvectores,aligualqueenlosarreglos,comienzanen0.
Lacondiciónparacontinuarenelcicloseescribeutilizandoelmétodosize()delaclaseArrayList,enlugardeloperadorlengthdelosarreglos.Notequelosparéntesissonnecesarios.
Lasiguientetablailustraelusodelosmétodosdemanejodeltamañodeunvectorenelcasodeestudio:
ContenedorasdeTamañoVariable
310
Clase Expresión Interpretación
TiendaDeLibros catalogo.size()Númerodelibrosdisponiblesenelcatálogo.
TiendaDeLibros catalogo.size()==
10¿Hay10librosenelcatálogo?
TiendaDeLibros catalogo.isEmpty() ¿Estávacíoelcatálogo?
Libro transacciones.size(
)Númerodetransaccionesdellibro.
Enestepuntoesimportanterecordarquelainstrucciónfor-eachparalosvectoresfuncionadeformasimilarqueparalosarregloscomosemuestraenelsiguientefragmentodecódigo.
publicvoidesqueleto()
{
for(Librolibro:catalogo)
{
//cuerpodelciclo
}
}
8.3.AccesoalosElementosdeunVectorLoselementosdeunvectorsereferencianporsuposiciónenlaestructura,comenzandoenlaposicióncero.Paraestoseutilizaelmétodoget(pos),querecibecomoparámetrolaposicióndelelementoquequeremosrecuperarynosretornaelobjetoqueallíseencuentra.
Ejemplo14
Objetivo:Ilustrarelusodelmétodoquenospermiterecuperarunobjetodeunvector.
Enesteejemploseilustraelusodelmétododeaccesoaloselementosdeunvector.VamosasuponerqueenlaclaseLibroexisteelmétododarPrecioVenta(),queretornaelpreciodeventadellibro.Estemétodosumaelpreciodeventadetodosloslibrosdelcatálogo.
ContenedorasdeTamañoVariable
311
publicintinventario()
{
intsumaPrecios=0;
for(inti=0;i<catalogo.size();i++)
{
Librolibro=catalogo.get(i);
sumaPrecios+=libro.darPrecioVenta();
}
returnsumaPrecios;
}
Conlainstrucciónget(i)delosvectoressepuedeaccederalareferenciadelobjetodelvectorqueseencuentraenlaposicióni.
Esunabuenaideaguardarsiempreenunavariabletemporallareferenciaalobjetorecuperado,parasimplificarelcódigo.
Cuandodentrodeunmétodotratamosdeaccederunaposiciónenunvectorconuníndicenoválido(menorque0omayoroigualqueelnúmerodeobjetosqueenesemomentoseencuentrenenelvector),obtenemoselerrordeejecución:java.lang.IndexOutOfBoundsException.
Recuerdequealutilizarelmétodoget(pos),loúnicoqueestamosobteniendoesunareferenciaalobjetoqueseencuentrareferenciadodesdelaposiciónposdelvector.Nosehaceningunacopiadelobjeto,nidesplazaelobjetoaningúnlado.
8.4.AgregarElementosaunVectorLoselementosdeunvectorsepuedenagregaralfinaldelmismooinsertarenunaposiciónespecífica.Losmétodosparahacerlosonlossiguientes:
add(objeto):esunmétodoquepermiteagregaralfinaldelvectorelobjetoquesepasacomoparámetro.Noimportacuántoselementoshayaenelvector,elmétodosiempresabecómobuscarespacioparaagregarunomás.
add(indice,objeto):esunmétodoquepermiteinsertarunobjetoenlaposiciónindicadaporelíndiceespecificadocomoparámetro.Estaoperaciónhacequeelelementoqueseencontrabaenesaposiciónsedesplacehacialaposiciónsiguiente,lomismoqueelrestodelosobjetosenlaestructura.
Ejemplo15
Objetivo:Mostrarelusodelmétodoqueagregaobjetosaunvector.
ContenedorasdeTamañoVariable
312
Enesteejemploseilustraelusodelosmétodosquepermitenagregarelementosaunvector.ElsiguienteesunmétododelaclaseTiendaDeLibrosqueañadetreslibrosalcatálogo.
publicvoidagregarTresLibros()
{
Librolb1=newLibro("título1","0011",1000,1200,"RutaImagen1");
Librolb2=newLibro("título2","0012",2000,2400,"RutaImagen2");
Librolb3=newLibro("título3","0013",3000,3600,"RutaImagen3");
catalogo.add(lb2);
catalogo.add(lb3);
catalogo.add(0,lb1);
}
Enelmétodosecreaninicialmentelostreslibros.Luegoseagregaelsegundodeloslibros(lb2).Comoelvectorestabavacío,elnuevoelementoquedaenlaposición0delcatálogo.Despuésseañadeeltercerlibro(lb3),quequedaenlaposición1.Finalmenteseinsertaelprimerlibro(lb1)enlaposición0,loquedesplazaellibro2alaposición1yellibro3alaposición2.
ContenedorasdeTamañoVariable
313
Enestediagramadeobjetossepuedeapreciarelestadodelcatálogodespuésdeejecutarestemétodo.Siusamoselmétodosize()paraelcatálogo,deberesponder3.Eneldibujodejamosengrislascasillasposterioresala2,paraindicarqueelvectorlaspuedeocuparcuandolasnecesite.
8.5.ReemplazarunElementoenunVectorCuandosequierereemplazarunobjetoporotroenunvector,seutilizaelmétodoset(),querecibecomoparámetroselíndicedelelementoquesedebereemplazaryelobjetoquedebetomarahoraesaposición.
Estemétodoesmuyútilparaordenarunvectoroparaclasificarbajoalgúnconceptoloselementosqueallíseencuentran.Enelejemplo15apareceunmétododelaclaseTiendaDeLibrosquepermiteintercambiardoslibrosdelcatálogo,dadassusposicionesenelvectorqueloscontiene.
Ejemplo16
Objetivo:Mostrarlamaneradereemplazarunobjetoenunvector.
Enesteejemploseilustraelusodelmétodoquereemplazaunobjetoporotroenunvector.ElmétododelaclaseTiendaLibrosrecibelasposicionesenelcatálogodeloslibrosquedebeintercambiar.
publicvoidintercambiar(intpPosicion1,intpPosicion2)
{
Librolibro1=catalogo.get(pPosicion1);
Librolibro2=catalogo.get(pPosicion2);
catalogo.set(pPosicion1,libro2);
catalogo.set(pPosicion2,libro1);
}
Cuandoseintercambianloselementosencualquierestructuraesindispensableguardaralmenosunodeellosenunavariabletemporal.Enestemétododecidimosusardosvariablesporclaridad.Enestemétodosuponemosquelasdosposicionesdadassonválidas(quesonposicionesentre0ycatalogo.size()-1).
Elmétodoset()nohacesinoreemplazarlareferenciaalobjetoqueseencuentraalmacenadaenlacasilla.Sepuedeversimplementecomolamaneradeasignarunnuevovaloraunacasilla.
ContenedorasdeTamañoVariable
314
Lareferenciaqueallíseencontrabasepierde,amenosquehayasidoguardadaenalgúnotrolugar.
8.6.EliminarunElementodeunVectorDelamismamaneraqueesposibleagregarelementosaunvector,tambiénesposibleeliminarlos.Pienseenelcasodelatiendadelibros.Sielusuariodecidieraeliminarunlibrodelcatálogolatienda,nosotrosenelprogramadebemosquitarlodelrespectivovectorelobjetoquelorepresentaba.Despuésdeeliminadalareferenciaaunobjeto,estaposiciónesocupadaporelelementoqueseencontrabadespuésdeélenelvector.
ElmétododelaclaseArrayListqueseusaparaeliminarunelementosellamaremove()yrecibecomoparámetrolaposicióndelelementoquesequiereeliminar(unvalorentre0yelnúmerodeelementosmenos1).Alusarestaoperación,sedebetenerencuentaqueeltamañodelaestructuradisminuyeen1,porloquesedebetenercuidadoenelmomentodedefinirlacondicióndecontinuacióndelosciclos.
Esimportanterecalcarqueelhechodequitarunobjetodeunvectornoimplicanecesariamentesudestrucción.Loúnicoqueestamoshaciendoeseliminandounareferenciaalobjeto.Siqueremosmantenerlovivo,bastaconguardarsureferenciaenotrolado,porejemploenunavariable.
Ejemplo17
Objetivo:Mostrarlamaneradeutilizarelmétodoqueeliminaunobjetodeunvector.
EnesteejemplopresentamosunmétododelaclaseTiendaDeLibrosqueeliminaelprimerlibrodelcatálogo.Ilustramoselresultadousandoeldiagramadeobjetosdelejemplo14.
publicvoideliminarPrimerLibro()
{
catalogo.remove(0);
}
Estemétodoeliminadelcatálogolareferenciaalprimerlibrodelatienda.Despuésdesuejecución,todosloslibrossemuevenunaposiciónhacialaizquierdaenelcatálogo.
ContenedorasdeTamañoVariable
315
Siejecutamosestemétodosobreeldiagramadeobjetosdelejemplo14,obtenemoseldiagramaqueapareceenestafigura.Ellibroqueestabaenlaposición1pasaalaposición0,yellibrodelaposición2pasaalaposición1.Ahoracatalogo.size()esiguala2.
Yaquehemosterminadodeverlosprincipalesmétodosconlosquecontamosparamanejarloselementosdeunvector,vamosacomenzaraescribirlosmétodosdelaclasedelcasodeestudio.Comenzamosconlasdeclaracionesdelasclasessimplesyseguimosconlosmétodosquemanejanlosvectores.
8.7.ConstruccióndelProgramadelCasodeEstudio
8.7.1.LaClaseLibro
LaclaseLibroesresponsabledemanejarsusseisatributos,abastecerejemplares,venderejemplaresyretornarellistadodetransacciones.Paraestocuentaconunmétodoconstructor,cincométodosanalizadoresydosmétodosmodificadores:
ContenedorasdeTamañoVariable
316
Libro(StringpTitulo,StringpISBN,doublepPrecioCompra,
doublepPrecioVenta,StringpRutaImagen) Métodoconstructor.
StringdarTitulo()Retornaeltítulodellibro.
StringdarIsbn()RetornaelISBNdellibro.
doubledarPrecioCompra()Retornaelpreciodecompradellibro.
doubledarPrecioVenta()Retornaelpreciodeventadellibro.
StringdarCantidadActual()Retornalacantidaddeejemplaresdellibro.
StringdarRutaImagen()Retornalarutadelaimagendellibro.
voidvender(intpCantidad,StringpFecha)Vendeejemplaresdellibro.
voidabastecer(intpCantidad,StringpFecha)Abasteceejemplaresdellibro.
ArrayList<Transaccion>darTransacciones()Retornalastransaccionesdellibro.
Laclaselibroesresponsabledeabasteceryvenderejemplaresdellibroasícomoderegistrarunatransacciónporcadaabastecimientooventaquerealiceelusuario.
Aligualqueenelcasodelosarreglos,siantesdeusarunvectornolohemoscreadoadecuadamente,sevaagenerarelerrordeejecución:java.lang.NullPointerException.
8.7.2.LaClaseTransaccion
CadaobjetodelaclaseTransacciontieneeltipodetransacción,lacantidaddeejemplaresylafechaenqueserealizólatransacción.AquíesimportanteresaltarquelosobjetosdelaclaseLibrotendránvariastransacciones,comoseilustraeneldiagramadeobjetosdelafigura3.11.
Losmétodosdeestaclaseseresumenenlasiguientetabla:
ContenedorasdeTamañoVariable
317
Transaccion(TipopTipo,intpCantidad,String
pFecha) Métodoconstructor.
TipodarTipo() Retornaeltipodetransacción.
intdarCantidad()Retornalacantidaddelastransacción.
StringdarFecha()Retornalafechadelatransacción.
Fig.3.11Diagramadeobjetosparailustrarelcasodelatiendadelibros
Enlafigura3.11sepuedeapreciarelcasoenelqueelusuariotieneensucatalogodoslibros.Elprimerlibrotieneunatransacciónyelsegundolibrotienedostransacciones.Enestediagramadecidimosmostrarlosvectorescomoobjetosexternosalasclasesquelosusan.Estarepresentaciónseajustamásalarealidadquelaqueusamosenejemplosanteriores,aunqueesmenossimple.Ambasmanerasdemostrareldiagramadeobjetossonválidas.Observe,porejemplo,queelobjetollamadocatalogoesunaasociaciónhaciaunobjetodelaclaseArrayList,quemantienelasreferenciasalosobjetosquerepresentanloslibros.
ContenedorasdeTamañoVariable
318
8.7.3.LaClaseTiendaDeLibros
Enlatarea11vamosadesarrollaralgunosdelosmétodosdelaclaseTiendaDeLibros.Susprincipalesresponsabilidadesseresumenenlasiguientetabla:
TiendaLibros() Métodoconstructor.
ArrayList<Libro>darCatalogo() Retornaelcatálogodelibros.
doubledarCaja() Retornaelsaldodelacaja.
voidcambiarCaja(doublepCaja) Cambiaelsaldodelacaja.LibroregistrarLibro(StringpTitulo,
StringpIsbn,doublepPrecioVenta,
doublepPrecioCompra,String
pRutaImagen)
Añadeunnuevolibroalcatálogoapartirdelosparámetrosrecibidos.Siellibroyaestáenelcatálogo,elmétodonohacenada.
LibrobuscarLibroPorISBN(StringpIsbn
)
LocalizaunlibrodelcatálogodadosuISBN.Sinoloencuentraretornanull.
LibrobuscarLibroPorTitulo(String
pTitulo)
Localizaunlibrodelcatálogodadosutítulo.Sinoloencuentraretornanull.
booleaneliminarLibro(StringpIsbn)EliminaunlibrodelcatálogodadosuISBN.Sinoloencuentraretornafalse.
booleanabastecer(StringpIsbn,int
pCantidad,StringpFecha)
AbasteceejemplaresdeunlibrodadosuISBN.Sinopuedeabastecerlosejemplaresdellibroretornafalse.
booleanvender(StringpIsbn,int
pCantidad,StringpFecha)
VendeejemplaresdeunlibrodadosuISBN.Sinopuedevenderlosejemplaresdellibroretornafalse.
LibrodarLibroMasCostoso()
Retornaellibroconelpreciodeventamayor.Sinohaylibrosenelcatálogoretornanull.
LibrodarLibroMasEconomico()
Retornaellibroconelpreciodeventamenor.Sinohaylibrosenelcatálogoretornanull.
LibrodarLibroMasVendido()
Retornaellibrodelcuálsehanvendidomásejemplares.Sinohaylibrosenelcatálogoretornanull.
int
darCantidadTransaccionesAbastecimiento(
StringpIsbn)
RetornaelnúmerodetransaccionesdetipoabastecimientoquesehanrealizadoallibroconelISBNrecibidocomoparámetro.Encasodequenoencuentreellibrooqueellibronotengatransacciones,retornacero.
Tarea11
ContenedorasdeTamañoVariable
319
Objetivo:DesarrollarlosmétodosdelaclaseTiendaDeLibrosquenospermitenimplementarlosrequerimientosfuncionalesdelcasodeestudio.
Paracadaunodelosproblemasqueseplanteanacontinuación,escribaelmétodoqueloresuelve.Noolvideidentificarprimeroelpatróndealgoritmoquesenecesitayusarlasguíasquesedieronenseccionesanteriores.
Localizarunlibroenelcatálogo,dadosuISBN.Sinoloencuentra,elmétododeberetornarnull:
publicLibrobuscarLibroPorISBN(StringpIsbn)
{
}
EliminarunlibroenelcatálogodadosuISBN.Siellibronoexisteosilacantidadactualdeejemplaresesmayoraceroretornafalse.Utiliceelmétodoanterior:
publicbooleaneliminarLibro(StringpIsbn)
{
}
Agregarunlibroenelcatálogo,sinoexisteyaunlibroconeseISBN.UtiliceelmétodobuscarLibroPorISBN:
ContenedorasdeTamañoVariable
320
publicLibroregistrarLibro(StringpTitulo,StringpIsbn,doublepPrecioVenta,double
pPrecioCompra,StringpRutaImagen)
{
}
Buscarellibromáscostosodelcatálogo,sielcatálogoestávacíoretornanull:
publicLibrodarLibroMasCostoso()
{
}
Buscarellibrodelcuálsehanvendidomásejemplares.Sinohaylibrosenelcatálogo,retornanull:
publicLibrodarLibroMasVendido()
{
}
ContenedorasdeTamañoVariable
321
RetornaelnúmerodetransaccionesdetipoabastecimientoqueselehanrealizadoallibroconelISBNrecibidocomoparámetro.Encasodequenoencuentreellibrooqueellibronotengatransacciones,retornacero.
publicintdarCantidadTransaccionesAbastecimiento(StringpIsbn)
{
}
Tarea12
Objetivo:DesarrollarlosmétodosdelaclaseLibro.
Paracadaunodelosproblemasqueseplanteanacontinuación,escribaelmétodoqueloresuelve.
Venderlacantidaddeejemplaresdellibrorecibidacomoparámetrosiempreycuandolacantidaddeejemplaresactualseamenoroigualalacantidadavender.Laventaimplicadecrementarelnúmerodeejemplaresdellibro.Adicionalmenteagregaunanuevatransaccióndetipoventaallistadodetransaccionesdellibro:
publicbooleanvender(intpCantidad,StringpFecha)
{
}
Abastecerlacantidaddeejemplaresdellibrorecibidacomoparámetro.Elabastecimientoimplicaincrementarelnúmerodeejemplaresdellibro.Adicionalmenteagregaunanuevatransaccióndetipoabastecimientoallistadodetransaccionesdellibro:
ContenedorasdeTamañoVariable
322
publicvoidabastecer(intpCantidad,StringpFecha)
{
}
ContenedorasdeTamañoVariable
323
9.UsodeCiclosenOtrosContextosAunquehastaestemomentosólohemosmostradolasinstruccionesiterativascomounamanerademanejarinformaciónqueseencuentraenestructurascontenedoras,dichasinstruccionestambiénseusanmuycomúnmenteenotroscontextos.Enelejemplo17mostramossuusoparacalcularelvalordeunafunciónaritmética.
Ejemplo18
Objetivo:Mostrarelusodelasinstruccionesiterativasenuncontextodiferentealdemanipulacióndeestructurascontenedoras.
Enesteejemplopresentamoslamaneradeescribirunmétodoparacalcularelfactorialdeunnúmero.Lafunciónfactorialaplicadaaunnúmeroenteron(enmatemáticasaesevalorselerepresentacomon!)sedefinecomoelproductodetodoslosvaloresenterospositivosmenoresoigualesalvalorencuestión.Planteadodeotramanera,tenemosque:
factorial(0)esiguala1.factorial(1)esiguala1.factorial(n)=n*factorial(n–1).
Porejemplo,factorial(5)=5*4*3*2*1=120
Siqueremosconstruirunmétodocapazdecalculardichovalor,podemosutilizarunainstruccióniterativa,comosemuestraacontinuación.
packageuniandes.cupi2.matematicas;
publicclassMatematica
{
publicstaticintfactorial(intpNum)
{
intacum=1;
if(pNum>0)
{
for(inti=1;i<=num;i++)
{
acum=acum*i;
}
}
}
returnacum;
}
UsodeCiclosenOtrosContextos
324
Elmétodolodeclaramosdemaneraespecial(static)ysumododeusoescomoaparecemásabajoenestemismoejemplo.
Elprimercasoquetenemosesqueelvalordelparámetrosea0.Larespuestaenesecasoes1.Hastaahíesfácil.
Enelcasogeneral,debemosmultiplicartodoslosvaloresdesde1hastaelvalorquerecibimoscomoparámetroeiracumulandoelresultadoenunavariablellamada"acum".Alfinalelmétodoretornadichovalor.
Estasoluciónnoesotraqueelpatrónderecorridototalaplicadoalasecuenciadenúmeros.Aunquenoesténalmacenadosenunarreglo,sepuedenimaginarunodespuésdelotro,conelíndicerecorriéndolosdeizquierdaaderecha.Esteusodelasinstruccionesiterativasnotieneunateoríadistintaalavistaenestecapítulo.
intfact=Matematica.factorial(i);
Lallamadadelmétodosehaceutilizandoestasintaxis.Comoesunafunciónaritméticaquenoestáasociadaconningúnelementodelmundo,debemosusarelnombredelaclaseparahacerlainvocación.
UsodeCiclosenOtrosContextos
325
CreacióndeunaClaseenJava
Tarea13
Objetivo:AgregarunanuevaclaseenunprogramaescritoenJava.
Enestatareavamosaextenderelcasodeestudiodelatiendadelibros,agregandodosclasesnuevas,enunpaquetedistintoalosyadefinidos.Sigalospasosquesedetallanacontinuación:
Esteeseldiagramadeclasesquequeremosconstruir.Haydosclasesadicionales:unaparamodelarlosclientesdelatiendadelibrosyotraconcomentariosquesehacenopcionalmentesobrecadalibro.Tomenotadelasnuevasasociacionesqueaparecen.
1. EjecuteEclipseyabraelproyectodelatiendadelibros.Localiceeldirectorioenelcualseguardanlosprogramasfuente.
2. VamosacrearlosarchivosdelasclasesComentarioyClienteenunnuevopaquetellamadouniandes.cupi2.tiendadelibros.extension.Paraesto,debemoscrearprimeroelpaquete.ParacrearunpaqueteenJava,seleccionelaopciónFile/New/Packagedel
CreacióndeunaClaseenJava
326
menúprincipalolaopciónNew/Packagedelmenúemergentequeaparecealhacerclicderechosobreeldirectoriodefuentes.
3. Unavezcreadoelpaquete,podemoscrearlaclaseallídentro,seleccionandolaopciónFile/New/ClassdelmenúprincipalolaopciónNew/Classdelmenúemergentequeaparecealhacerclicderechosobreelpaquetedeclaseselegido.Enlaventanaqueabreelasistentedecreacióndeclases,podemosvereldirectoriodefuentesyelpaquetedondeseubicarálaclase.Allídebemosteclearelnombredelaclase.AloprimirelbotónFinish,eleditorabrirálaclaseylepermitirácompletarlaconsusatributosymétodos.Siguiendoelprocesoantesmencionado,creelasclasesClienteyComentarioincluyendosusatributos.
4. Elsiguientepasoesagregarlosatributosquevanarepresentarlasasociacioneshaciaesasclases.AbraparaestolaclaseLibro.AgregueelatributodetipovectorquerepresentalaasociaciónhacialaclaseComentariotalcomosedescribeeneldiagramadeclases.¿Porquéelcompiladornoreconocelanuevaclase?Sencillamenteporqueestáenotropaquete,elcualdebemosimportar.Añadalainstrucciónparaimportarlasclasesdelnuevopaquete.EstaimportaciónpuedehacerlamanualmenteoutilizandoelcomandoControl+Mayús+Oparaqueeleditoragregueautomáticamentetodaslasimportacionesquenecesite.
5. AgregueelatributoclientesalaclaseTiendaDeLibros,representándolocomounvector.EsnecesarioqueimportelaclaseClientealmomentodedeclararelvectorpuestoqueeslaprimeravezquehacemosreferenciadirectaaestaclase.
6. EnelconstructordelaclaseTiendaDeLibros,inicialiceelvectordeclientes.7. EnelconstructordelaclaseLibro,inicialiceelvectordecomentarios.8. Lasclasesantesmencionadastambiénsehabríanpodidocreardesdecualquiereditor
detextosimple(porejemplo,elblocdenotas).Bastaconcrearelarchivo,salvarloeneldirectorioquerepresentaelpaquetey,luego,entraraEclipseyutilizarlaopciónRefreshdelmenúemergentequeaparecealhacerclicderechosobreelproyecto.
9. EnlaclaseComentarioagregueelconstructorquerecibecomoparámetroselcontenido,lacalificaciónyelobjetodelclientequerealizóelcomentario.Agreguetresmétodospararecuperarelcontenidodelcomentario,lacalificaciónotorgadayelcliente.
10. EnlaclaseClienteescribaelconstructorquerecibecomoparámetroslacédula,losnombresylosapellidos.Agreguetresmétodospararecuperarlacédula,losnombresylosapellidos.
11. EnlaclaseLibro,añadaunmétodoqueagregueuncomentarioallibroyotroqueretorneelvectorcontodosloscomentariosdellibro.
12. EnlaclaseTiendaDeLibros,añadalossiguientesmétodos:(a)unmétodoparaagregarunnuevocliente,(b)unmétodoparabuscarunclientedadosunúmerodecédula,(c)unmétodoparacalcularlacalificaciónpromediodeunlibrodadosuISBN,(d)unmétodoquecalculeelnúmerototaldelibrosdelcatálogoquetienenalmenos
CreacióndeunaClaseenJava
327
comentario,y(e)unmétodoqueagregueunnuevocomentarioaunlibro.EsteúltimométodorecibecomoparámetroselISBNdellibro,lacéduladelcliente,yelcontenidoylacalificacióndelcomentario.
CreacióndeunaClaseenJava
328
10.HojasdeTrabajo
10.1.HojadeTrabajoNº1:UnParqueaderoDescargueestahojadetrabajoatravésdelossiguientesenlaces:DescargarPDF|DescargarWord.
Enunciado.Analiceelsiguienteenunciadoeidentiqueelmundodelproblema,loquesequierequehagaelprogramaylasrestriccionesparadesarrollarlo.
Sequiereconstruirunaaplicaciónparaadministrarunparqueadero(lugardeestacionamientoparacarros).Dichoparqueaderotiene40puestos,numeradosdel1al40.Encadapuestosepuedeparquearunsólocarro(querepresentaremosconunaclasellamadaCarro),elcualseidenticaporsuplaca.Elparqueaderotieneunatarifaporhoraofraccióndehora,puedesercambiadaporeladministrador.
Decadavehículoaparcadosedebeconocerlahoraenlaqueentró,quecorrespondeaunvalorentre6y21,dadoqueelparqueaderoestáabiertoentre6delamañanay9delanoche.
Seesperaquelaaplicaciónquesequiereconstruirpermitahacerlosiguiente:
1. Ingresaruncarroalparqueadero.Sedebeindicarelpuestoenelquesedebeparquear(sihaycupo).
2. Darsalidaauncarrodelparqueadero.Sedebeindicarcuántodebepagar.
3. Informarlosingresosdelparqueadero.
4. Consultarlacantidaddepuestosdisponibles.
5. Avanzarunahoraenelrelojdelparqueadero.
6. Cambiarlatarifadelparqueadero.
Lasiguienteeslainterfazdeusuariopropuestaparaelprograma,dondelospuestosocupadosdebenaparecenconunvehículo.
Hojasdetrabajo
329
Requerimientosfuncionales.Describalosseisrequerimientosfuncionalesdelaaplicaciónquehayaidenticadoenelenunciado.
RequerimientoFuncional1
Hojasdetrabajo
330
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional2
Hojasdetrabajo
331
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional3
Hojasdetrabajo
332
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional4
Hojasdetrabajo
333
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional5
Hojasdetrabajo
334
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional6
Hojasdetrabajo
335
Nombre
Resumen
Entradas
Resultado
Modelodelmundo.Completeeldiagramadeclasesconlosatributos,lasconstantesylasasociaciones.
Hojasdetrabajo
336
DiagramaUML:Parqueadero
DiagramaUML:Puesto
Hojasdetrabajo
337
DiagramaUML:Carro
Declaracióndearreglos.Paralassiguientesclases,escribaladeclaracióndelosatributosindicadosenelcomentario(comocontenedorasdeltipodado),asícomolasconstantesnecesariasparamanejarlos.
publicclassParqueadero
{
//--------------------------------------------------
//Constantes
//--------------------------------------------------
/**
*Indicaelnúmerodepuestosenelparqueadero
*/
//--------------------------------------------------
//Atributos
//--------------------------------------------------
/**
*Arreglodepuestos
*/
}
Hojasdetrabajo
338
Inicializacióndearreglos.Escribaelconstructordelaclaseparainicializarlascontenedorasdeclaradasenelpuntoanterior.
publicParqueadero()
{
}
Patronesdealgoritmos.DesarrollelossiguientesmétodosdelaclaseParqueadero,identicandoeltipodepatróndealgoritmoalqueperteneceysiguiendolasrespectivasguías
Método1
Contaryretornarelnúmerototaldepuestosocupados.
publicintdarTotalPuestosOcupados()
{
}
Método2
Informarsienelparqueaderohayuncarrocuyaplacacomienceconlaletradadacomoparámetro.
Hojasdetrabajo
339
publicbooleanexistePlacaIniciaCon(charpLetra)
{
}
Método3
Retornarelnúmerodecarrosenelparqueaderoquellegaronantesdelmediodía.
publicintdarTotalCarrosIngresoManana()
{
}
Método4
Retornarelúltimocarroeningresaralparqueadero.Sielparqueaderoestávacío,retornanull.
publicCarrodarCarroLlegadaMasReciente()
{
}
Hojasdetrabajo
340
Método5
Informarsienalgúnlugardelparqueaderohaydospuestoslibresconsecutivos.Estosehacecuandoelvehículoquesequiereaparcaresmuygrande.
publicbooleanhayDosPuestosLibresConsecutivos()
{
}
Método6
Informarsihaydoscarrosenelparqueaderoconlamismaplaca.
publicbooleanhayPlacasRepetidas()
{
}
Hojasdetrabajo
341
10.2HojadeTrabajoNº2:ListadeContactosDescargueestahojadetrabajoatravésdelossiguientesenlaces:DescargarPDF|DescargarWord.
Enunciado.Analiceelsiguienteenunciadoeidentiqueelmundodelproblema,loquesequierequehagaelprogramaylasrestriccionesparadesarrollarlo.
Sequiereconstruirunprogramaparamanejarlalistadecontactosdeunapersona.Uncontactotienenombre,apellido,unadirección,uncorreoelectrónico,variosteléfonosyunconjuntodepalabrasclavequeseutilizanparafacilitarsubúsqueda.Elnombrecompleto(nombre+apellido)decadacontactodebeserúnico.Tantoelnombrecomoelapellidoseusancomopalabrasclaveparalasbúsquedas.
Enelprogramadecontactossedebepoder:
1. Agregarunnuevocontacto.2. Eliminaruncontactoyaexistente.3. Verlainformacióndetalladadeuncontacto.4. Modicarlainformacióndeuncontacto.5. Buscarcontactosusandolaspalabrasclave.
Lasiguienteeslainterfazdeusuariopropuestaparaelprogramadelalistadecontactos.
Hojasdetrabajo
342
Requerimientosfuncionales.Describaloscincorequerimientosfuncionalesdelaaplicaciónquehayaidenticadoenelenunciado.
RequerimientoFuncional1
Hojasdetrabajo
343
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional2
Hojasdetrabajo
344
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional3
Hojasdetrabajo
345
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional4
Hojasdetrabajo
346
Nombre
Resumen
Entradas
Resultado
RequerimientoFuncional5
Hojasdetrabajo
347
Nombre
Resumen
Entradas
Resultado
Modelodelmundo.Completeeldiagramadeclasesconlosatributos,lasconstantesylasasociaciones.
Hojasdetrabajo
348
DiagramaUML:ListaDeContactos
DiagramaUML:Contacto
Hojasdetrabajo
349
Declaracióndearreglos.Paralassiguientesclases,escribaladeclaracióndelosatributosindicadosenelcomentario(comocontenedorasdeltipodado).
publicclassContacto
{
//--------------------------------------------------
//Atributos
//--------------------------------------------------
privateStringnombre;
privateStringapellido;
privateStringdireccion;
privateStringcorreo;
/**
*Listadeteléfonosdelcontacto.
*/
/**
*Listadepalabrasclavedelcontacto.
*/
}
publicclassListaDeContactos
{
//--------------------------------------------------
//Atributos
//--------------------------------------------------
/**
*Listadecontactos.
*/
}
Inicializacióndearreglos.Escribaelconstructordelasclasesdadas.
Hojasdetrabajo
350
publicContacto()
{
}
publicListaDeContactos()
{
}
Patronesdealgoritmos.Desarrollelossiguientesmétodosdelaclaseindicada,identicandoeltipodepatróndealgoritmoalqueperteneceysiguiendolasrespectivasguías.
Metodo
Clase:Contacto
Contarelnúmerodepalabrasclavequeempiezanporlaletradadacomoparámetro.
Hojasdetrabajo
351
publicintdarTotalPalabrasInicianCon(charpLetra)
{
}
Metodo2
Clase:Contacto
Informarsielcontactotienealgúnteléfonoquecomienzaporelprejodadocomoparámetro.
Hojasdetrabajo
352
publicbooleanexisteTelefonoIniciaCon(StringpPrefijo)
{
}
Metodo3
Clase:Contacto
Retornarlaprimerapalabraclavequeterminaconlacadenadada.
publicStringdarPalabraTerminaCon(StringpCadena)
{
}
Metodo4
Clase:Contacto
Contarelnúmerodepalabrasclavequesonprejo(parteinicial)deotraspalabrasclave.
Hojasdetrabajo
353
publicintdarTotalPalabrasPrefijo()
{
}
Metodo5
Clase:ListaDeContacto
Contarelnúmerodecontactoscuyonombreesigualalrecibidocomoparámetro.
publicintdarTotalContactosConNombre(StringpNombre)
{
}
Metodo6
Clase:ListadeContactos
Hojasdetrabajo
354
Informarsihaydoscontactosenlalistaconlamismadireccióndecorreoelectrónico.
publicbooleanhayCorreosRepetidos()
{
}
Metodo7
Clase:ListadeContactos
Retornarelcontactoconelmayornúmerodepalabrasclave.
Hojasdetrabajo
355
publicContactodarContactoConMasPalabras()
{
}
Hojasdetrabajo
356