Sei sulla pagina 1di 5

TareaparaPROG05.

1.Contexto.
2. Enunciado.
2.Enunciado.

3.Criteriosdecorreccinypuntuacin.
Qutepedimosquehagas?
4.Recursosnecesarios.
ENUNCIADODELATAREA.
5.Consejosyrecomendaciones.
Noshanencomendadolatareadeinvestigarlaposibilidaddetrabajarconnmerosenterosendiferentessistemasdenumeracinparahacernuestrasaplicaciones
6.Indicacionesdeentrega. msverstileseinternacionales.Paraellonoshanpedidounpequeoprototipoconelquepodamostrabajarcondistintostiposdesistemasparamsadelantever
cmopodemosampliarloaotrosidiomasysistemasmscomplejos:

Sistemadenumeracindecimal(el"detodalavida").
Sistemadenumeracinbinario.
Sistemadenumeracinhexadecimal.
Sistemadenumeracinromano.
Sistemadenumeracindecimalenidiomaespaol.

Laideaesquepudiramosescribirunnmeroenunodeesossistemasynuestraaplicacinfueracapazdetransformarloacualquieradelosotros.Esdecir,quesi
porejemploescriboelnmeroenteroensistemadecimal"571",elprogramafueracapazdetraducirlo:

Paraelsistemabinario:"1000111011".
Paraelsistemahexadecimal:"23B".
Paraelsistemaromano:"DLXXI".
Paraelsistemaespaol:"quinientossetenayuno".

Oalgosimilarsihubieraescrito"1111"enelsistemabinario.Entalcaso,elprogramaseracapazdecalcular:

Paraelsistemadecimal:"15".
Paraelsistemahexadecimal:"F".
Paraelsistemaromano:"XV".
Paraelsistemaespaol:"quince".

Podemosobtenermsinformacinacercadelosdistintossistemasdenumeracinenlassiguientesreferencias:

Sistemadenumeracindecimal.
Sistemadenumeracinbinario.
Sistemadenumeracinhexadecimal.
Sistemadenumeracinromano.
Nombredelosnmerosenespaol.

Paraimplementarelprototiposenoshapedidoquediseemosunaclase NumeroEnteroquenospermitamanipularunnmeroenteroquecontengamtodospara
podertrabajarconesoscincoformatos.Losobjetosqueseaninstanciasdeesaclasecontendrnensuinteriorundatodetipo int, pero dispondremos de mtodos
quenospermitirnrecuperaresedato(mtodos get)enlosdistintosformatosposibles:

Mtodo intgetInt(),paraobtenerelnmeroenteroquecontieneelobjetoenformatonmeroenterodecimal(un int de java). Sera la manera "nativa" de


trabajarconelenteroyelmtodomsdirecto.Esenrealidadlamanera"normal"quetenemosparatrabajarconlosenteros(eltipo int)ylaqueutilizamos
normalmente.
Mtodo StringgetBinaryString(), para obtener el nmero entero que contiene el objeto en formato de nmero binario (cadena de dgitos binarios: ceros y
unos).
Mtodo StringgetHexaString(),paraobtenerelnmeroenteroquecontieneelobjetoenformatodenmerohexadecimal(cadenadedgitoshexadecimales:
de0aF.).
Mtodo StringgetRomanString(),paraobtenerelnmeroquecontieneelobjetoenformatodenmeroromano(cadenadedgitosromanos:I,V,X,L,D,C,
etc..).
Mtodo voidsetSpanishString(StringnumSpanish),paraobtenerelnmeroquecontieneelobjetoformatodetextoenespaol(nombresenidiomaespaolde
losnmeros:uno,dos,tres,doce,veinte,cientocuarenta,etc.).
Delmismomodo,laideaestambindisponerdemtodosquenospermitanmodificaresedato(mtodos set)proporcionndoseloenlosdistintosformatosposibles:

Mtodo voidsetInt(intnumero),paraestablecerelnmeroquecontieneelobjetoconunnmeroenterodecimal.Seraelmtodo"normal"o"nativo".
Mtodo voidsetBinaryString(StringnumBinario),paraestablecerelnmeroquecontieneelobjetomedianteun Stringquecontieneunnmero entero binario
(cadenadedgitosbinarios:cerosyunos).Estemtodotendrqueanalizaresacadenay,siesvlida(nmerobinariocorrecto),generarel int corresponidente
yguardarlodentrodelobjeto.
Mtodo void setHexaString (String numHexa), para establecer el nmero que contiene el objeto mediante un String que contiene un nmero entero
hexadecimal(cadenadedgitoshexadecimales:de0aF.).Tendrquehaceralgosimilaralmtodoanteriorperorecibiendounacadenaquedebecontener
representarunnmerohexadecimalvido.
Mtodo void setRomanString (String numRomano), para establecer el nmero que contiene el objeto mediante un String que contiene un nmero entero en
formato romano (cadena de dgitos romanos: I, V, X, L, D, C, etc..). Analizar el String y, si es un nmero romano vlido, lo transformar en int y lo
almacenarenelinteriordelobjeto.
Mtodo void setSpanishString (String numSpanish), para establecer el nmero que contiene el objeto mediante un String que contiene un nmero entero en
formatodetextoenespaol(nombresenidiomaespaoldelosnmeros:siete,quince,cien,doscientoscincuentayuno,cientosiete,etc.).Enestecaso
habr que analizar el String para asegurarse de que se trata un nmero en espaol vlido y, en caso de ser as, transformarlo en su correspondiente inty
guardarloenelatributoapropiadodelobjeto.

En el caso de los nmeros romanos, para que resulte ms sencillo el algoritmo de conversin se ha optado por utilizar un sistema de numeracin romano
simplificadoqueseasiempreaditivoynocontengarestas.Esdecir,queelnmero4serepresenteporIIIIynoporIVel49porXXXXVIIIIynoporILoel402
porCCCCIIynoporCDII.

Encualquieradeesoscincometodos,sielparmetronosecorrespondeconelformatoapropiadoonoestdentrodelrangoqueseestablezca (que ser


entre el 0 y el 999), se deber lanzar una excepcin (throw) para que el fragmento de cdigo que est utilizndolo pueda capturarla (dentro de un trycatch) y
gestionarelerror.

Parasimplificarelprototiposenoshalimitadoelrangodevaloresdeldatoquepuedecontenerunobjetodetipo NumeroEntero.Losvaloresestarnacotadosentre
0y999,ambosinclusive.Nilaclase NumeroEnteronielprogramaquelautilicedeberadmitirningnnmeroqueestfueradeeserango.Sielloseintentarahabra
quelanzarunaexcepcindesdecualquieradelosmtodos setquesevanaimplementar.

El programa prototipo que utilice la clase NumeroEntero (clase principal con el mtodo main) contendr un men que nos permitir "jugar" con los diferentes
formatosparapoderhacerdistintostiposdetransformaciones:

TRABAJOCONNMEROSENDISTINTOSFORMATOS

Aviso:slosetrabajaconnmerosentre0y999

[1]Convertirdecimalabinario.
[2]Convertirdecimalahexadecimal.
[3]Convertirdecimalaromanosimplificado.
[4]Convertirdecimalatextoespaol.
[5]Convertirbinarioadecimal.
[6]Convertirhexadecimaladecimal.
[7]Convertirromanosimplificadoadecimal.
[8]Convertirtextoespaoladecimal.
[9]Listadenmerosden1an2entodoslosformatos.
[0]Terminarysalir
Introduzcaunaopcinparaoperar:(09)

Deestamanerapodramosprobarlosdistintosformatosdenumeracin.Veamosalgunosejemplosdefuncionamiento:

Opcin1:conversindedecimalabinario.
Introduzcanmeroentero:250
Elnmerodecimal'250'enbinarioes:'11111010'
Opcin2:conversindedecimalahexadecimal.
Introduzcanmeroentero:254
Elnmerodecimal'254'enhexadecimales:'FE'

Opcin3:conversindedecimalaromanosimplificado
Introduzcanmeroentero:99
Elnmerodecimal'99'enromano(simplificado)es:'LXXXXVIIII'

Opcin4:conversindedecimalatextoespaol.
Introduzcanmeroentero:524
Elnmerodecimal'524'enespaoles:'quinientosveinticuatro'

Opcin5:Conversindebinarioadecimal.
Introduzcanmerobinario:11110001
Elnmerobinario'11110001'endecimales:'241'

Opcin6:Conversindehexadecimaladecimal.
Introduzcanmerohexadecimal:1AA
Elnmerohexadecimal'1AA'endecimales:'426'

Opcin7:Conversinderomanosimplificadoadecimal.
Introduzcanmeroromano(simplificado):DLVII
Elnmeroromano'DLVII'endecimales:'557'

Opcin8:Conversindetextoespaoladecimal.
Introduzcanmeroenespaol(contildes):quinientostreintaycinco
Elnmeroespaol'quinientostreintaycinco'endecimales:'535'

Laopcin9permitiramostrarunavisingeneraldelfuncionamientodelconversorobtenindoseunatablacontodoslosformatosenunrangoentredosnmeros.
Veamosunejemplo:

Opcin9:Listadenmerosden1an2entodoslosformatos.
Introduzcanmeroinicial(n1):97
Introduzcanmerofinal(n2):112

||||||
|Nm.|Texto|Romanosimplificado|Binario|Hexa|
||||||
|97|noventaysiete|LXXXXVII|1100001|61|
|98|noventayocho|LXXXXVIII|1100010|62|
|99|noventaynueve|LXXXXVIIII|1100011|63|
|100|cien|C|1100100|64|
|101|cientouno|CI|1100101|65|
|102|cientodos|CII|1100110|66|
|103|cientotres|CIII|1100111|67|
|104|cientocuatro|CIIII|1101000|68|
|105|cientocinco|CV|1101001|69|
|106|cientoseis|CVI|1101010|6A|
|107|cientosiete|CVII|1101011|6B|
|108|cientoocho|CVIII|1101100|6C|
|109|cientonueve|CVIIII|1101101|6D|
|110|cientodiez|CX|1101110|6E|
|111|cientoonce|CXI|1101111|6F|
|112|cientodoce|CXII|1110000|70|
||||||

Desearealizarotraoperacin?(s/n)

Unavezmostradoelresultadodelaoperacinsolicitada,elprogramarpreguntarsisedesearealizaralgunaotraoperacin.Encasodeunarespuestaafirmativa
sevolveramostrarelmendeopcionesyenelcasodeunarespuestanegativaelprogramafinalizarsuejecucin.

Desearealizarotraoperacin?(s/n)

Esobligatorioelusoarraysparalarealizacindeestatarea.Secrearnunconjuntodearraysquecontendrnlas"listasmaestras"decreacindelosnmeros
del0al999.Estoquieredecirquetendremosunarraydecadenasdecaracteresconlasunidades(losnombres"uno","dos,"tres",etc.),otroconlasdecenas("diez",
"veinte","treinta",etc.),otroconlascentenas("cien","doscientos","trescientos",etc.)yalgunosotrosarraysconnmerosespeciales(porejemplolos"veintitantos"y
los"diecitantos").Lo que no podemos tener es una lista con los mil nmeros ya escritos, pues eso es una locura y adems no nos servira para el futuro si
tenemosquellegaralosbillones(nmerosdemsdedocecifras)oalostrillones(demsdedieciocho).Nuestromtodo getSpanishStringdebesercapazdegenerar
una cadena de caracteres con el nombre del nmero a partir del nmero utilizando unos pocos patrones (las listas de arrays de las que acabamos de hablar). Por
tanto, si tenemos por ejemplo el nmero "452", nuestro mtodo sabr crear el texto "cuatrocientos cincuenta y dos" combinando las palabras "cuatrocientos",
"cincuenta"y"dos",queestarnalmacenadasennuestrosarrays,peronotendremosguardadaenningnsitiolaexpresincompleta"cuatrocientoscincuentaydos",
sinoquesercreadaenesemomentoconcatenandovariascadenas.

En el sentido "inverso", es decir, para transformar algn formato determinado (binario, hexadecimal, romano, espaol) a decimal, ser obligatorio el uso de las
herramientasdeexpresionesregularesproporcionadasporlabibliotecadedeutildadesdeJava.Estosignificaquecuandounmtododetipo setrecibaunacadena
decaracteresparaanalizar,convertirendecimalyguardardentrodelobjeto,habrquecrearun"patrn"querepresenteaunnmerohexadecimal,romano,binario,
etc.correctoparaversielnmeroesapropiado,ysinocumpleel"patrn",lanzar(throw)unaexcepcinparaquesearecogidaporlazonadecdigoqueintent
hacerlaconversin(desdedondesellamalmtodo set).

Aqutienesalgunosejemplosdecosasquedeberanfallar:

Opcin1:conversindedecimalabinario.
Introduzcanmeroentero:hola
Error:Noesunnmeroenterovlido.
Introduzcanmeroentero:

Opcin1:conversindedecimalabinario.
Introduzcanmeroentero:1000
Error:Debeserunnmeroenteromayoroigualque0ymenoroigualque999.
Introduzcanmeroentero:

Opcin5:Conversindebinarioadecimal.
Introduzcanmerobinario:0x11
Error:Nmerobinarionovlido:0x11
Introduzcanmerobinario:

Opcin5:Conversindebinarioadecimal.
Introduzcanmerobinario:1111111111
Error:Nmerobinariofueradelrango0999:1111111111
Introduzcanmerobinario:

Opcin6:Conversindehexadecimaladecimal.
Introduzcanmerohexadecimal:AVE
Error:Nmerohexadecimalnovlido:AVE
Introduzcanmerohexadecimal:

Opcin7:Conversinderomanosimplificadoadecimal.
Introduzcanmeroromano(simplificado):CXL
Error:Nmeroromanonovlido:CXL
Introduzcanmeroromano(simplificado):

Opcin8:Conversindetextoespaoladecimal.
Introduzcanmeroenespaol(contildes):veintidos
Error:Nmeroenespaoldentrodelrango0999novlido:veintidos
Introduzcanmeroenespaol(contildes):

Opcin8:Conversindetextoespaoladecimal.
Introduzcanmeroenespaol(contildes):mil
Error:Nmeroenespaoldentrodelrango0999novlido:mil
Introduzcanmeroenespaol(contildes):

Dadoquelosromanosnoutilizabanelcero(fueintroducidoporlosrabessiglosmstarde),utilizaremoselcarcterguin("")pararepresentarelceroen
romano.

Es obligatorio utilizar la clase ES y sus utilidades para llevar a cabo este proyecto. Recordad que ya no debemos utilizar ni la clase Scanner ni la clase System para
recogerdatosdeltecladooenviarlosalapantalla,paraesotendremoslaclase ESysusmtodos leerosusmtodos msg.Slosepermitirelusode System.out.printf
enlaopcin9(comonicaexcepcinenelprogramaprincipal)parapoderformatearadecuadamentelatablaconcadaunodelossistemasdenumeracin(eluso
de los % os podr resultar de mucha ayuda, os lo recomiendo). En cualquier caso, en la implementacin de la clase NumeroEntero no debera haber bajo
ningn concepto ninguna instruccin de entrada de datos por teclado o de salida de resultados por pantalla. Eso est terminantemente prohibido. La
comunicacinconelusuariosellevaracaboatravsdelprogramaprincipal(mtodo main)ylaclase NumeroEnteroserunaherramientaqueutilizarelprograma
principalparahacerlasconversiones.

Para que puedas comprobar si tu prototipo te est funcionando correctamente te proporcionaremos un archivo de texto con los nmeros del 0 al 999 en
todoslosformatos.Laopcin9detuprogramaparalosnmerosentre0y999deberamostraralgosimilaraeso.

Tambin te vamos a proporcionar una plantilla donde empezar a crear la clase NumeroEntero, con algunas partes "iniciadas" para que no tengas que hacerlo todo
desde cero. Para cada mtodo pblico de la clase tendrs que aadir los comentarios javadoc precisos para que posteriormente se pueda generar una
documentacindecalidad.Estaclaseesel"corazn"delaaplcacinyserlaqueenelfuturootrosprogramadorestendrnqueampliar(paraunmayorrangode
nmerosyparaotrosformatos)siseconsideraquecumplesufuncincorrectamente,portantodebeestarperfectamentedocumentada.

Porltimo,laopcin8(yportantolaimplementacindelmtodo setSpanishString),dadasuespecialdificultad,esvoluntaria.(+2puntosindependientesdelos10
delejercicioaunquelanotamximasiempreseguirsiendo10).Sitedecidesaintentarlo,terecomendamoselusodelmtodo group()enlasexpresionesregulares
paraextraerlaspalabrasdeunnmeroescritoenespaol.Teahorrarbastantetrabajo.

Potrebbero piacerti anche