Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ArtculopublicadooriginalmenteenlarevistaSloProgramadores
EnelnmeroanteriorpresentamosbrevementequeslaplataformaJavayenquconsistencadauna
delastresedicionesdelaplataforma(JavaME,JavaSEyJavaEE).Vimosculeseranlos
componentesbsicosdelkitdedesarrolloJavayaprendimosamanejarlosdesdeunaconsola.
Finalmente,presentamosculessonlostiposdedatosprimitivosylosoperadoresaritmticos,
relacionalesylgicosbsicosdellenguaje.EnestasegundaentregadeestecursodeprogramacinJava
presentaremosbrevementelalibreramatemtica,introduciremosnuevostiposdedatosnoprimitivos
comocadenasdecaracteres,arraysyenumeraciones,ypresentaremoslasestructurasdecontrolde
flujo(buclesycondicionales)dellenguaje.Paratrabajarconloscdigosdeejemplodeesteartculoos
recomiendoquesigisusandoelJDKparafamiliarizarosconl.Enelnmerosiguiente
comenzaremosausarunentornodedesarrollo.
Lalibreramatemtica:laclaseMath
Lamayorpartedelasfuncionesmatemticasbsicas(racescuadradas,exponenciacin,logaritmos,
senos,cosenos,senoshiperblicos,etc.)estndisponiblesenJavaatravsdelaclaseMath.Hastael
siguientenmerodeestecursodeprogramacinJavanopresentaremosqusonlasclasesycmo
construirlas.Noobstante,noesnecesariotenerconocimientosdeprogramacinorientadaaobjetos
paraemplearestaclase:todossusmtodossonestticos,estoes,secomportancomofunciones.Por
tanto,podemosinvocarlosdirectamentesinnecesidaddecrearningnobjetodelaclase.Lasintaxisde
estosmtodoses:
Math.metodo(argumentos);
Dondemetodoeselnombredelmtodoconcretoquequeremosinvocar.Porejemplo,pararealizarun
senoemplearamosMath.sin(ngulo),yparacalcularx^yenemplearamosMath.pow(x,y).Enestos
momentosprobablementeteestsrealizandopreguntascomoTengoquesaberdememoriatodoslos
mtodosdelaclaseMath?Ytambintengoquesaberelordenenelqueselepasanlosargumentos?
y...aMath.sin(ngulo)elnguloselodebodepasarengradosoenradianes?.Tranquilo,noes
necesariosabersedememorialosmtodos,nilosargumentos.Tampocotienesquesabertedememoria
silosngulossepasanengradosoenradianes.Aunqueconlaprcticaacabarssabiendolarespuestaa
muchasdeestaspreguntas,nocreoquetenganingnsentidoqueteestudieslaclaseMathdememoria.
Javatieneunaslibrerasextensas(extenssimas).NingndesarrolladorJava,pormsgurquesea,se
lassabedememoria.Peroloquessabemoshacerlosgursesbuscarrpidamenteaquellascosasque
nosabemoseneljavadocdelaslibreras.LaslibrerasJavaestnformadasprincipalmenteporcdigo
fuenteJava.Eljavadocdeestaslibrerasnoesmsqueelresultadodeaplicarlaherramientajavadoc,
quepresentamosenelprimerartculodeestaserie,adichocdigofuente.
TodoprogramadorJavaquesepreciedebetenersiempreamanoeljavadocdelalibreraestndar.Este
javadocpuededescargarsedesdelamismapginadedescargadondeseobtieneelJDKdeSun.Siel
lectorsehainstaladoNetbeans,elentornodedesarrollotieneestadocumentacinintegradaypuede
accederseponiendoelcursorsobrelaclaseomtododelcualsequieraconsultareljavadocya
continuacinpulsandoAlt+F1.Estadocumentacintambinestdisponibleonlineen
http://java.sun.com/javase/6/docs/api/,aunquepersonalmenteprefierotenerladescargadaenmiequipo
yaqueaspuedonavegardeunmodomsrpidotravsdeellaynodependodetenerconectividadpara
poderconsultarla.
FIGURA1:Eljavadocdelalibreraestndaresunaherramientaindispensableparacualquier
programadorJava.
Comopodemosverenlafigura1,enelrecuadrosituadoenlaesquinainferiorizquierdadelapgina
principaldeladocumentacinhayunlistado,ordenadoalfabticamente,contodaslasclasesque
componenladocumentacindelalibreraestndardeJava.TrashacerclicenMathvemosla
documentacindeestaclase.Unadelasprimerascosasquenosencontraremosesunlistadodelos
mtodosdelaclase,juntoconunadescripcincortadesufuncionalidad.Cadamtodoesunenlace
quenosllevaaunadescripcinmsdetallada,situadamsabajoenlamismapginaweb.
VolviendoanuestrapreguntainicialaMath.sin(ngulo)elnguloselodebopasarengradosoen
radianes?.Notengointencinderesponderte.Antesdeseguirleyendoesteartculotmismodeberas
responderaesapreguntaconsultandoladocumentacindelaclaseMath.Esmuyimportante
acostumbrarseausareljavadocdelalibreraestndar;esunrecursoesencialparacualquier
programadorJava.Enelcdigodellistado1podemosverunprogramadondeseempleanvariosdelos
mtodosdelaclaseMath.
inti=45,j=2;
System.out.println("Cosi:"+Math.cos(i));//coseno
System.out.println("Seni:"+Math.sin(i));//seno
System.out.println("j^i:"+Math.pow(j,i));//exponenciacion
System.out.println("sqrt(j):"+Math.sqrt(j));//raizcuadrada
System.out.println("Númeroaleatorio:"+Math.random());//generaciondeunnumeroaleator
io
System.out.println("Valorabsoluto:"+Math.abs(5));//valorabsoluto
Cadenasdecaracteres:laclaseString
PararepresentarcadenasdecaracteresenJavaseempleaunaclase,String,queeslaqueproporciona
soporteparalasoperacionesqueserealizanmscomnmenteconcadenasdecaracteres.Ladefinicin
deunStringessimilaraladeuntipoprimitivo.Lascadenasdecaracteresquevayanincluidasenel
cdigoJavacomoliteralesdebenirrodeadasporcomillasdobles:
Stringe;//declaradoperonoinicializado
Stringe="";//cadenavacia
Stringe="Hola";//inicializacionyasignacion
LaconcatenacindedoscadenasdecaracteresenJavaesmuysencilla:serealizaconeloperador+,
esdecirsumandolascadenasdecaracteres.Loilustraremosconunejemplo:
Stringsaludo="hola";
Stringnombre="Pepe";
StringsaludaPepe="";
saludaPepe = saludo + nombre;// saludaPepe toma el valor "holaPepe"
Siunacadenalaintentamosconcatenarconotrotipodevariableautomticamenteseconviertelaotra
variableaString(enelcasodequelaotravariableseaunobjetopararealizarlaconversinseinvocar
elmtodotoString()dedichoobjeto),detalmodoqueenJavaesperfectamentevlidoelsiguiente
cdigo:
Stringsaludo="hola";
intn=5;
saludo = saludo + "" + n;// saludo toma el valor "hola 5"
AlgunosmtodostilesdelaclaseString
AdiferenciadeC,lasoperacionescomunessobrecadenasdecaracteres,comolacomparacinola
extraccindeunasubcadena,noserealizanatravsdefunciones(omtodosestticos),sinoquese
realizanatravsdemtodosdelapropiaclaseString.Porejemplo,enlaclaseStringhayunmtodo
quepermitelaextraccindeunasubcadenadecaracteresdeotra.Susintaxises:
cadena.substring(intposiciónInicial,intposiciónFinal);
dondeposicinInicialyposicinFinalson,respectivamente,laposicindelprimercarcterquese
deseaextraerydelprimercarcterqueyanosedeseaextraer.Veamosunejemplodeuso:
Stringsaludo="hola";
Stringsubsaludo=saludo.substring(0,2);//subsaludotomaelvalor"ho"
Tambinpuedeextraerseunchardeunacadena;paraelloseempleaelmtodocharAt(posicin),
siendoposicinlaposicindelcarcterquesedeseaextraer.Seempiezaacontaren0.Paracomparar
cadenasdecaracteresnopuedeemplearseeloperador==.Esteoperadorrealizaunacomparacinde
identidad,esdecir,nospermitiracomprobarsidosobjetosStringsonrealmenteunmismoobjeto.
PerononospermitecomprobarsidosobjetosStringdiferentescontienenelmismotexto.Elsegundo
casoeselquesecorrespondeconlasemnticade"igualdad"quehabitualmenteempleamoslosseres
humanos:nonosimportasisonelmismoobjeto,sinosisucontenidoeselmismo.Paracomparardos
cadenasdecaracteresdebeemplearseotromtododeString:equals.Susintaxises:
cadena1.equals(cadena2);
elmtododevuelvetruesilasdoscadenassonigualesyfalsesisondistintas.Esposiblepasaruna
cadenadecaracteresaminsculasoamaysculas?yreemplazaruncarcterporotro?Oencontrarla
primeraocurrenciadeuncarcterdeunacadena?.Larespuestaess,todasestasoperaciones,ymuchas
otras,sonposibles.Cmoserealizan?.EmpleandomtodosdelaclaseString.Qumtodos?.Aesta
pregunta,yameniegoaresponder.Recomiendoallectorqueantesdecontinuarleyendoelartculo
consulteeljavadocdelaclaseStringysefamiliariceconlasoperacionesquesoporta.Enellistado2
vemosuncdigoquedemuestravariasoperacionesqueserealizanconStrings.Estecdigotambin
permitemostrarcomoenJavasedistingueentremaysculasyminsculas,detalmodoque"Hola"no
eslamismacadenaquecaracteresque"hola".
Stringsaludo="Hola";
Stringsaludo2="hola";
intn=5;
//Imprime por consola la subcadena formada por los caracteres
//comprendidos entre el caractero 0 de saludo y hasta el
carcter 2
System.out.println(saludo.substring(0,2));
//ejemplo de concatenacion
System.out.println(saludo+""+n);
//Imprime el resultado del test de igualdad entre saludo y saludo2.
System.out.println("saludo==saludo2"+saludo.equals(saludo2));
Enumeraciones
EstacaractersticadellenguajesloestdisponibleenJava5ysuperior.SiestsutilizandoJava1.4.Xo
inferiornopodrsemplearla.LaversinactualdeJavaesla6.
Lostiposdedatosenumeradossonuntipodedatodefinidoporelprogramador(nocomoocurrecon
lostiposdedatosprimitivos).Sirvenpararepresentarvariablesquetomanvalorenunconjuntofinitoy,
normalmente,pequeodedatos.Algunosejemplospodranserlospalosdelabarajaespaola,olos
dasdelasemana.Podramosrepresentarunpalodelabarajamedianteunnmeroentero;porejemplo,
podramosasignarel1alosoros,el2alosbastos,el3alascopasyel4alasespadas.Estaestrategia
tienedosproblemas:siunavariabletipointesusadapararepresentarunpalodelabaraja,nadame
impideasignarleelvalor"143",aunquenotenganingnsentido.Elsegundoproblemaesquedentro
deunmesnomevoyaacordarqupalorepresentabael2,osicomencaenumeraren0oen1.
Lasenumeracionesproporcionanunasolucineleganteaesteproblemaeincrementanlalegibilidaddel
programa.Paradefinirlaselprogramadordebeindicarunconjuntodevaloresfinitossobreloscuales
lasvariablesdetipoenumeracindeberntomarvalor.Lamejorformadecomprenderqusones
vindolo;paradefiniruntipodedatoenumeradoseemplealasintaxis:
Losposiblesvaloresdemodificadoressernvistosenelsiguientecaptulodeestaserie.Elcasoms
habitual,yelqueemplearemosporladeahora,esquemodificadorestomeelvalorpublic.Elnombre
puedesercualquiernombrevlidodentrodeJava.Entrelasllavesseponenlosposiblesvaloresque
podrntomarlasvariablesdetipoenumeracin,valoresquehabitualmenteseescribenenletras
maysculas.Unejemplodeenumeracinpodraser:
publicenumSemana{LUNES,MARTES,MIERCOLES,JUEVES,VIERNES,SABADO,
DOMINGO}
Lasdefinicionesdelostiposenumeradosdebenrealizarsefueradelmtodomainy,engeneral,fuera
decualquiermtodo;esdecir,debenrealizarsedirectamentedentrodelcuerpodelaclase.Paradefinir
unavariabledelaanteriorenumeracinseemplearalasiguientesintaxis:
Semana variable;
yparadarleunvaloralasvariablesdetipoenumeracinstasdebenasignarseaunodelosvalores
creadosensudefinicin.Elnombredelvalordebeirprecedidodelnombredelapropiaenumeracin:
variable=Semana.DOMINGO;
AdiferenciadelasenumeracionesdeCoC++,lasenumeracionesdeJavason"typesafe",estoes,es
imposibleasignarleunavariabledeunaenumeracinunvalordistintodeaquellosquesedeclararonal
definirlaenumeracin.EnClasenumeracionesinternamenteserepresentancomonmerosenteros,
porloquenadanosimpideasignarleaunavariabledeunaenumeracinunvalorenterofueradelrango
delasconstantessimblicasqueseemplearonensudefinicin.EnJavacadaunodelosvaloresdelas
enumeracionesserepresentamedianteunainstanciadelaclasedelaenumeracinyelcompilador
garantizaquecadavezqueseinicialiceunaenumeracinseinicializaobligatoriamenteaunodelos
valoresquesedeclararonensudefinicin,yaqueestosvaloressontodaslasinstanciasqueexistende
dichaclase.
Enellistado3podemosverunejemplodeusodeenumeraciones.
publicstaticvoidmain(String[]args){
Semana hoy = Semana.MARTES;
//observa como gracias a la enumeracin el programa es mas facil de leer
if(hoy == Semana.DOMINGO
|| hoy == Semana.SABADO){
System.out.println("Hoytocadescansar");
} else{
System.out.println("Hoytocatrabajar");
}
}
Arrays
Unarrayesunacoleccindevariablesdelmismotipo,quetienenunnombrecomnyestndispuestos
enposicionesconsecutivasdelamemoriadelordenador.Cadaelementodelarraysedistinguedelos
demsporsundice(nmerodeordendentrodelarray).Unarraysecaracterizaporsutipobase(eltipo
decadaelemento),elnmerodedimensionesdelmismoylalongitudencadadimensin.
EnJavalosarrayssonunobjeto.Comotalessecreanmedianteeloperadordenew(enelsiguiente
captuloveremoselusodeesteoperadordeunmododetallado).Quitandoesadiferencia,laformade
crearelarrayylaformadetrabajarconellosesidnticaalaformaenlaquesetrabajaconlosarraysen
C.Lasintaxisenladefinicindeunarraydeunadimensineslasiguiente:
Tipo_datoseseltipodelosdatosquesealmacenarnenelarray(int,char,String...ocualquier
objeto).TamaoArrayeseltamaoquelequeremosdaraestearray.Porejemplo,lasentencia:
int[]array=newint[10];
creaunarrayllamadoarray,enelquepodremosalmacenar10datostipoentero.Paracrearunamatriz,
estoes,unarraydedosdimensiones,emplearemoselsiguientecdigo:
int[][]matriz=newint[3][9];
Comosemuestraenlafigura2,elprimerelementodeunarraysesitaenlaposicin0,exactamente
igualqueenC.Unavezdefinido,paraaccederaloselementosdeunarrayusaremoselnombredel
arrayyacontinuacin,entrecorchetes,elndicedelelementoalcualqueremosacceder.Porejemplo,la
instruccin:
hacequelasextaposicindelarraytomeelvalordelasumadelaprimeraposicindelarraymsla
cuarta(unavezms,hagamosnfasisenquesecomienzaacontarencero).Enelcasodelasmatrices,
opoliedrosengeneral,deberemosemplearunndiceporcadadimensindelpoliedro.
FIGURA2:EnJavaelprimerndicedetodaslasdimensionesdeunarraycomienzaacontaren
0.
Ellistado4muestrauncdigodondeseinicializaunarrayconnmerosaleatoriosentre0y80ya
continuacinsecalculalasumadedichosnmeros.
int[]edades=newint[10];
for(inti=0;i<10;i++){
edades[i]=(int)Math.random()%80;
System.out.println("Elemento"+i+edades[i]);
intsum=0;
for(inti=0;i<10;i++){
sum
= sum + edades[i];
System.out.println("Suma"+sum);
ElcontroldeflujoenJava
ElmododeejecucindeunprogramaJavaenausenciadeelementosdecontroldeflujoessecuencial,
esdecir,lasinstruccionessevanejecutandounadetrsdeotra,seejecutantodas,ysloseejecutanuna
vez.Estonospermitehacerprogramasmuylimitados;paraevitarloJavaemplealamismasolucin
queempleanlainmensamayoradeloslenguajesdeprogramacin:estructurasdecontroldeflujo.
Estasestructurasdecontroldeflujosedividenendosgrupos:loscondicionales,quepermitenejecutar
onounbloquedecdigodependiendodequesecumplaunadeterminadacondicin;ylosbucles,que
permitenrepetirlaejecucindeunbloquedecdigomientrassecumplaunadeterminadacondicin.
AquelloslectoresfamiliarizadosconCcomprobarncmoel90%delasintaxisdeJavareferentea
estructurasdeflujoesidnticaaladeestelenguaje.
Estructurasdecontroldeflujocondicionales
Lasestructurasdecontroldeflujodetipocondicionalejecutanuncdigouotroenfuncindequese
cumplaonounadeterminadacondicin.EnJavaexistendostiposdecondicional:ifyswitch.
Condicionaltipoif
Lasintaxismssencillaparaelcondicionalifes:
if(condicion) {
Grupo de sentencias;}
condiciontienequeserunvalortipoboolean;estevalorpuedeobtenerseevaluandounaexpresin
indicadaporcondicin,peroelvalordeevaluardichaexpresintienequeserobligatoriamenteun
boolean(adiferenciadeC,nosepuedenemplearnmerosenteroscomocondiciones).Elgrupode
sentenciasqueseencuentraentrellavesseejecutaslosilacondicintomaunvalortrue.Encaso
contrarioseignoraelgrupodesentencias.Sielcondicionalafectaaunanicasentencialasllavesson
opcionales.
Unifpuedeiracompaadodeunbloqueelse:
if(condicion) {
Grupo de sentencias;}
else{
Grupo2 de sentencias;}
SicondiciontomaelvalortrueseejecutaGrupodesentencias,encasocontrarioseejecutaGrupo2
desentencias.Entreelifyelelsenopuedeirningunasentencia.
Esposibleanidarvarioscondicionalestipoif:
if(condicion) {
Grupo de sentencias;}
else if (condicion2){
Grupo2 de sentencias;}
else if (condicion3){
Grupo3 de sentencias;}
...
else{
Grupo_n de sentencias;}
SicondiciontomaelvalortrueseejecutaGrupodesentenciasyseignorantodoslosdems
condicionalesyelelse.Encasocontrario,sicondicion2tomaelvalortrueseejecutaGrupo2de
sentencias...yassucesivamentehastaacabarsetodaslascondiciones.Sinosecumpleningunase
ejecutaelgrupodesentenciasasociadasconelelse.Esteltimoelseesopcional.
Enellistado5mostramosunejemplodeusodecondicionaltipoif.Esteeselprimerejemplodonde
usamosotromtodoademsdelmain,elmtodostaticinttest(intval,intval2).Unmtodoestticoes
equivalenteaunafuncin;esdecir,puedeinvocarsedirectamentesinnecesidaddecrearninguna
instanciadelaclase.Elnombredelmtodoestestyrecibedosparmetros(valyval2)detipoentero.
Elmtododevolvercomoresultadodesuejecucinunvalorentero;dichovalordebeindicarse
empleandolasentenciaalreturn.Enelsiguienteartculodeestaseriepresentaremosendetallela
sintaxisparadeclararmtodosenJava.
Elmtodotestesinvocadovariasvecesdesdeelmain.Estemtododevuelve1sielprimer
argumentoesmenorqueelsegundo,+1sielprimerargumentoesmayorqueelsegundoy0siambos
soniguales.
staticinttest(intval,intval2){
intresult=0;
if(val > val2)
result = +1;
else if(val < val2)
result = -1;
else
result = 0;
return result;
}
publicstaticvoidmain(String[]args){
System.out.println(test(10,5));
System.out.println(test(5,10));
System.out.println(test(5,5));
}
Switch
Estaestructuradecontroldeflujopermiteelegirentrevariosbloquesdecdigoculessedeben
ejecutaryculesno.Veamossusintaxis:
switch(selector) {
case valor1 : Grupo de sentencias1; break;
case valor2 : Grupo de sentencias2; break;
case valor3 : Grupo de sentencias3; break;
case valor4 : Grupo de sentencias4; break;
case valor5 : Grupo de sentencias5; break;
// ...
default: statement;
}
alejecutarselasentenciaswitchcomparaelvalordeselectorconvalorX.Sielvalorcoincidese
ejecutasurespectivogrupodesentencias.Sinoseencuentraningunacoincidenciaseejecutanlas
sentenciasdeldefault.Sinosepusieranlosbreakunavezhubieseunacoincidenciaentreunvalory
elselectorseejecutarantodoslosgruposdesentencias,incluidaladeldefault.Enlagranmayorade
loscasos,stenoeselcomportamientoquesedeseadelasentenciaswitch,deahquecadaunodelos
casehabitualmentetermineconunbreak,esdecir,conunsaltoincondicionalfueradelaestructurade
controldeflujo.
Lavariableselectorslopuedeserdetipocharocualquiertipodevalorenteromenoslong(siests
empleandoJava5oposteriortambinsepuedenemplearenumeraciones).Nopodemosemplearningn
tipodenmeroreal,Strings,uobjetosengeneral.
Enellistado6mostramosunejemplodeusodelasentenciaswitch.Enestecaso,tomamosventajade
queunavezquehayunacoincidenciaentrelavariablequehacelasvecesdeselectoryunodelos
valoresdeloscaseseejecutantodoslosbloquesdecdigodetodosloscasequehayaacontinuaciny
elbloquedecdigodeldefault.Elprogramageneraunaletraaleatoriadelalfabetoyempleaunswitch
paracomprobarsilaletraesunavocalounaconsonante;siesunavocalimprime"vocal"porla
consola,ysiesunaconsonanteimprime"consonante".Elprincipiocdigosopromotoresswitchse
empleaparacomprobarsielcarcteresunadelascincovocalesdelalfabeto,portantohayquehacer
cincocomparacionesdiferentes.Perolaaccinarealizarenloscincocasoseslamisma:imprimir
"vocal".Deahquepodamostomarventajadelparticularcomportamientodelswitch.
for(inti=0;i<100;i++){
//generamos un carcter aleatorio
char c = (char)(Math.random() * 26 + 'a');
System.out.print(c+":");
switch(c) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
//Si el caracter es a, e, i, o o u imprimimos vocal.
System.out.println("vocal");
break;
default:
//Si no era ninguna de las anterioes imprimos consonate.
System.out.println("consonante");
}
}
}
Bucles
Soninstruccionesquenospermitenrepetirunbloquedecdigomientrassecumplaunadeterminada
condicin.EnJavaexistencuatrotiposdiferentes:while,dowhile,for,y(enJava5)"foreach".
Buclewhile
Cuandoenlaejecucindeuncdigosellegaaunbuclewhilesecompruebasiseverificalacondicin
asociadaconl,siseverificaseejecutaelbloquedecdigoasociadoconelbucleysevuelvea
comprobarlacondicin;mientrasdichacondicinsigaverificndoseseseguirejecutandoelcdigo
delbucle.Susintaxises:
while(condicin){
Grupo de sentencias;}
Ellistado7muestraelfuncionamientodeestebucle.Enlseempleaelmtodorandomdelalibrera
matemticadeJavaparagenerarunnmeroaleatorio.Mientraselnmeroaleatorioquesegenerasea
menorque0.99(vercondicindelbucle)sevuelveagenerarotronmeroaleatorioyseimprimedicho
nmeroporconsola.
doubler=0;
//Mientras que r < 0.99 sigue ejecutando el cuerpo del bucle.
while(r < 0.99) {
//Genera un nuevo r aleatario entr 0 y 1.
r = Math.random();
System.out.println(r);
}
Elbucledowhile
Sucomportamientoessemejantealbuclewhile,sloqueaqulacondicinvaalfinaldelcdigodel
bucle,porloqueelcdigosevaaejecutaralmenosunavez.Comonormageneral,debemosemplear
unbucletipowhilecuandohayaunconjuntodeinstruccionesquesepuedanrepetirde0anveces,y
unbucledowhilecuandotengamosunconjuntodeinstruccionesquesepuedanrepetirde1anveces.
Lasintaxisdedowhilees:
do {
Grupo de sentencias;
}while(condicin);
Enellistado8podemosverelcdigodelistado7implementadomedianteunbucledowhile.
doubler;
do {
r = Math.random();
System.out.println(r);
} while(r < 0.99d);
}
Buclefor
Lasintaxisdeestebucleeslasiguientesiguiente:
for(expresion1;expresion2;expresion3){
Grupo de sentecias;}
Expresion1esunaexpresincualquiera,enlacualesposibledeclarary/oasignarvaloraunavariable,
lavariablecondicindelbucle.Expresion2eslacondicindelbucle.Mientrasdichacondicintome
elvalortrueelbucleserepetirunayotravez.Habitualmente,estaexpresincompruebaalguna
condicinsobreunavariabledeclaradaoasignadaenlaprimeraexpresin.Expresion3indicauna
operacinqueserealizaencadaiteracinapartirdelaprimera(enlaprimeraiteracinelvalordela
variabledelbucleeselqueseleasignaenexpresion1);nuevamente,lomshabitualesqueesta
operacinserealicesobrelavariabledelbucle.Elbucleforanteriorescompletamenteequivalenteal
siguientecdigo:
expresion1;
while (expresion2)
{
Grupo de sentecias;
expresion3;
}
Enellistado9seempleaunbucleforparaimprimirporconsolaloscaracteresdelatablaASCII.
Cuandoelcarcterseimprimehacindoleuncastaintsemostrarelvalorenterocorrespondiente,y
cuandoseimprimecomocarctersemostrarelcarcterasociadoadichovalorenteroenlatabla
ASCII.
//LISTADO 9: Este pequeo cdigo imprime por consola la tabla ASCII empleando un
bucle tipo for.
//cdigo Ejemplo14.java del CD
for( char c = 0; c < 128; c++)
System.out.println("valor:"+(int)c+"caracter:"+c);
}
Bucleforeach
EstacaractersticasloestdisponibleenJava5yversionesposteriores.Setratadeunbuclediseado
conelpropsitoderecorrerunconjuntodeobjetos.Porlodeahoralanicaestructuraquehemosvisto
quepermitealmacenarunconjuntodeobjetossonlosarrays,peroennmerosposterioresdeestaserie
deartculosintroduciremoselframeworkdecoleccionesdedatosdeJava.Estaestructuraresulta
particularmentetilparatrabajarcondichascolecciones(listas,pilas,mapas...).Lasintaxisdeeste
buclees:
Tipoeseltipodedatodeloselementosdelconjunto;elementoesunavariableauxiliarquelaprimera
vezqueseejecuteelbucletomarelvalordelprimerelementodelconjunto,lasegundaveztomarel
valordelsegundoelementodelconjuntoyassucesivamente.LacoleccinElementoseselconjuntode
elementossobreloscualesqueremositerar(porlodeahora,unarray).Elbucleserepetirunavezpara
cadaelementodelacoleccin.
Estebucle"foreachsellama"for",aunquehubiesesidomejoremplearelprimernombreporsimilitud
conotroslenguajesdeprogramacinqueposeenunbuclesimilar,porhabersidointroducidoenel
lenguajedeprogramacinaposteriori.foreachnoesunapalabrareservadadentrodeJava;sicuandose
diseJava5sehubieseempleadoestapalabraparaestetipodebuclepodranproducirse
incompatibilidadesconcdigofuenteJavaescritoantesdeesemomento.
Enellistado10podemosvercmoseempleaestetipodebucleparacalcularlasumadeloselementos
deunarray.
intarray[]=newint[10];
intsuma=0,contador=0;
//con este bucle damos valores a los elementos del array
for(inti=0;i<array.length;i++){
array[i]= 2*i;
}
for(inte:array){//paracadaelementodelarray
suma = suma + e;
}
System.out.println(suma);
}
breakycontinue
Estasdosinstruccionesnosonniunbucleniuncondicional,perossonsentenciasntimamente
relacionadaconestasestructurasdecontroldeflujo.Elencontrarseunasentenciadebreakenel
cuerpodecualquierbucledetienelaejecucindesucuerpoyproduceunsaltoincondicionalala
sentenciaqueseencuentrainmediatamentedespusdelbucle.Comoyahemosmostradoeneste
artculo,estasentenciatambinsepuedeusarparaforzarlasalidadelbloquedecdigoasociadocon
unodeloscasedeunainstruccintiposwitch.
continuetambindetienelaejecucindelcuerpodelbucle,peroenestaocasinnosesaledelbucle,
sinoqueseignoraelrestodelcuerpodelbuclequequedaseporejecutarysevuelvealprincipio.
Enellistado11podemosverunejemplodeusodeestassentencias.Enelprimerbuclefor,continue
seempleaparaignorartodoslosnmerosenterosquenoseanmltiplosde9.Enelsegundobucle,
breakseempleaparasalirdeunbucleinfinito.
for(inti=0;i<100;i++){
//Salto a la siguiente iteracion si i no es divisible entre 9
if(i % 9 != 0) continue;
//Si i es divisible entre 9 se imprime
System.out.println(i);
}
inti=0;
// Lazo infinito del cual se sale con break:
while(true) {
i++;
if(i == 120) break; // Salimos del lazo
System.out.println(i);
}
Conclusiones
EnestesegundoartculodelaseriehemospresentadolalibreramatemticadeJava,variostiposde
datosnoprimitivoscomoarrays,cadenasdecaracteresyenumeraciones,yloselementosbsicosde
controldeflujo(buclesycondicionales)dellenguaje.
Enelsiguienteartculodelaseriecomenzaremosaintroducirlaprogramacinorientadaaobjetosen
Java.Explicaremosquesunaclase,cmotrabajarconellas,yenquconsistelaherencia.Tambin
comenzaremosemplearunentornodedesarrollo,BlueJ,paratrabajarconloscdigosdeejemplo.Os
esperoatodoselmesqueviene.
Descargas
Cdigosdelartculo
Cpitulosanterioresdelcurso:
CursodeprogramacinJavaIAbrahamOtero