Documente Academic
Documente Profesional
Documente Cultură
4 8 0 1
Ejemplo de c omo evitar errores: String texto = Usuario.texto("Ingrese un texto:"); char c; if(texto.length() > 20) { c = texto.charAt(20); //... } else { Usuario.mensaje("String"); } boolean startsWith(String s) Devuelve true si el String comienza con el String s entregado como par ametro. La coincidencia debe ser exacta (se distingue may usculas de min usculas, por ejemplo, y los caracteres con tilde no son iguales a los que no lo llevan). String texto boolean b1 = boolean b2 = boolean b3 = boolean b4 = boolean b5 = = "Hola Juanito!"; texto.startsWith(""); // true texto.startsWith("Hola ") // true texto.startsWith("hola Juanito!") // false texto.startsWith("Hola Juanito! ") // false texto.startsWith("Hola Juanito!") // true
boolean startsWith(String s, int k) Como el m etodo anterior, pero comienza a revisar desde el ndice (posici on) k, sin importar lo que haya antes. Si k == 0, entonces el m etodo es equivalente al anterior. String texto boolean b1 = boolean b2 = boolean b3 = boolean b4 = = "Hola Juanito!"; texto.startsWith("Hola", 1); // true texto.startsWith(" Juanito!", 5); // true texto.startsWith("a", 7); // false texto.startsWith("", 20); // false
int indexOf(char c) Devuelve un entero que indica la posici on donde aparece por primera vez el caracter c. Si el caracter no aparece en todo el String, devuelve -1. String texto = "Hola Juanito!"; int n = texto.indexOf(o); // 2 int m = texto.indexOf( ); // 5 int p = texto.indexOf(); // 0 int q = texto.indexOf(z); // -1 int indexOf(String s) Similar al anterior, s olo que devuelve la posici on donde aparece por primera vez un determinado String. String texto = "En la arboleda un arbolito"; int n = texto.indexOf("arbol"); // 6 int m = texto.indexOf(" arbol"); // -1 int p = texto.indexOf("boli"); // 20 int q = texto.indexOf("bol"); // 8 IIC1103 Cap tulo 5: Strings 2
int indexOf(char c, int fromIndex) y int indexOf(String s, int fromIndex) Como el m etodo indexOf(String s), pero comienza a buscar desde la posici on fromIndex. int lastIndexOf(char c), int lastIndexOf(String s), int lastIndexOf(char c, int fromIndex), int lastIndexOf(String s, int fromIndex) Como indexOf(char c), pero en vez de buscar la primera aparici on del char c, busca la u ltima. Retorna -1 si no lo encuentra. Se denen de manera an aloga a los anteriores: boolean equals(String s) Retorna true cuando ambos String son exactamente iguales. Esto quiere decir que el largo de ambos es el mismo, y que en cada posici on encontramos el mismo caracter. String texto1 = "casa"; String texto2 = "caza"; String texto3 = "casi"; String texto4 = "casa"; String texto5 = "CaSa"; boolean b1 = texto1.equals(texto3); boolean b2 = texto4.equals(texto1); boolean b3 = texto3.equals(texto1); boolean b4 = texto1.equals(texto5); boolean equalsIgnoreCase(String s) Retorna true cuando ambos String son iguales, sin importar may usculas y min usculas. String texto1 = "casa"; String texto2 = "caza"; String texto3 = "casi"; String texto4 = "casa"; String texto5 = "CaSa"; boolean b1 = texto1.equalsIgnoreCase(texto3); boolean b2 = texto4.equalsIgnoreCase(texto1); boolean b3 = texto3.equalsIgnoreCase(texto1); boolean b4 = texto1.equalsIgnoreCase(texto5); int compareTo(String s) Este m etodo compara lexicogr acamente dos String. Parte en el primer par de caracteres hasta encontrar un par de char distintos. Si encuentra dos caracteres distintos, retorna la diferencia entre ellos (recuerde que char funciona como un n umero entero). Si uno de los String comienza con el otro, retorna el n umero de caracteres adicionales que tiene. Si ambos String son iguales, retorna 0. String texto = "radiograf a"; int n = texto.compareTo("radio"); // 6 int m = texto.compareTo("radiolog a"); // -5 int p = texto.compareTo("rabia"); // 2 int q = texto.compareTo("ralentizar"); // -8 int r = texto.compareTo("radiografia"); // 132 int s = texto.compareTo("radiograf a"); // 0 IIC1103 Cap tulo 5: Strings 3
// // // //
// // // //
String substring(int inicio, int n) Retorna una parte del String: desde la posici on inicio hasta la posici on n. String texto = "desenfreno"; String subTexto = texto.substring(5, 10); // "freno" String replaceAll(String aReemplazar , String reemplazo) Reemplaza todas las ocurrencias de aReemplazar por reemplazo. String t1 = "El auto volaba r apido"; String t2 = t1.replaceAll("auto", "avi on")); // "El avi on volaba r apido"
Fuente de referencia: http://users.physik.fu-berlin.de/~goerz/blog/wp-content/uploads/2008/09/ascii.gif Para utilizarlos se puede castear un n umero entero (la representaci on decimal del caracter seg un la tabla ASCII) a un char. char c = (char) 36; // signo pesos Adem as se pueden utilizar ciertos caracteres especiales, anteponiendo \: Descripci on Barra invertida Tabulaci on horizontal Salto de L nea Comillas simples Comillas dobles Representaci on \\ \t \n \ \"
Ejemplos
Problema 1: Varios
Enunciado Escriba m etodos en Java que: Rote una palabra, por ejemplo auto queda otua. Ocupe una palabra para crear un pal ndrome, por ejemplo auto queda autotua. Busque una palabra dentro de un texto y la marque con un , por ejemplo auto en Habian muchos autos queda Habian muchos autos. Cuente la cantidad de ocurrencias de una palabra en un texto, por ejemplo hola en El gato decia hola muchas veces al dia, hola, retorna 2. Criterios de soluci on Para rotar la palabra basta con crear un nuevo String (nueva variable) e ir concaten andole las letras de nuestro String original, pero recorriendo el original desde atr as hacia adelante (for por su largo/length). Muy similar al anterior, se puede hacer de dos maneras. Se le puede concatenar el string obtenido con el m etodo anterior o se puede hacer de manera manual. Para encontrar donde aparece la palabra es claro que hay que ocupar indexOf. Para agregar el la mejor manera es guardar la posici on donde est a la palabra buscada y ocuparla para separar la oraci on en dos substrings, uno con todos los caracteres a la izquierda de la posici on y otro a la derecha. Luego concatenamos el subtring de la izquierda con un y el substring de la derecha. Para contar la cantidad de veces que aparece la palabra ocupamos indexOf para ver si est a, si la posici on es distinta de -1 sumamos uno a la cantidad de veces que encontramos la palabra. Es importante cambiar la posici on desde la que buscamos en nuestro String ya que, o si no, podemos contar innitas veces la misma palabra.
Posible soluci on
import i i c 1 1 0 3 P a c k a g e .*; public class P r i n c i p a l { public static String p a l i n d r o m i z a r( String p a l i n d r o m e) { // obtengo el largo de la palabra enviada int largo = p a l i n d r o m e. length (); // iteramos hasta el largo menos 2 for ( int i = largo - 2; i >= 0; i - -) { // le a g r e g a m o s la ultima letra p a l i n d r o m e = p a l i n d r o m e + p a l i n d r o m e. charAt ( i ); } return p a l i n d r o m e; // retorno el p a l i n d r o m e } public static String d a r V u e l t a( String palabra ) { // aqui g u a r d a m o s el r e s u l t a d o String p a l a b r a R o t a d a = " " ; // parto desde el final y termino en el p r i n c i p i o for ( int i = palabra . length () - 1; i >= 0; i - -) { // le voy a g r e g a n d o los c a r a c t e r e s p a l a b r a R o t a d a = p a l a b r a R o t a d a + palabra . charAt ( i ); } // retorno la palabra rotada return p a l a b r a R o t a d a; } public static int b u s c a r C a n t i d a d( String palabra , String t e x t o A U s a r) { // Contamos cuantas veces esta la palabra int veces = 0; int pos = 0; while ( pos != -1) { // Buscamos string y contamos , buscamos desde pos +1 para no volver a // leer la misma palabra pos = t e x t o A U s a r. indexOf ( palabra , pos + 1); // si pos es distinta de -1 contamos una vez mas if ( pos != -1) { veces ++; } } return veces ; } public static boolean b u s c a r P a l a b r a( String palabra , String t e x t o A U s a r) { // Busca la palabra int pos = t e x t o A U s a r. indexOf ( palabra ); if ( pos != -1) { // A g r e g a m o s " _ " String t e x t o A M o s t r a r = t e x t o A U s a r. s u b s t r i n g(0 , pos ) + " _ " + t e x t o A U s a r. s u b s t r i n g( pos ); Usuario . m e n s a j e C o n s o l a( t e x t o A M o s t r a r); return true ; } else { Usuario . m e n s a j e C o n s o l a( " No fue e n c o n t r a d o el string " + palabra + " en el texto " ); return false ; } } public static void main ( String [] args ) { String nombre = " auto " ; Usuario . m e n s a j e C o n s o l a( p a l i n d r o m i z a r( nombre )); Usuario . m e n s a j e C o n s o l a( d a r V u e l t a( nombre )); b u s c a r P a l a b r a( " hola " , " El gato decia hola muchas veces al dia , hola " ); } }
Para poder arreglar este dilema, le piden a usted desarrollar los siguientes m etodos (utilizando s olo lo ya construido): String substring(int begin, int end) Retorna el substring que va desde la posici on begin a la posici on end, inclusive. Devuelve null si existe alg un problema con los ndices recibidos. Retorna un string equivalente al actual, pero con todas las letras convertidas a may usculas. Ignore caracteres que no pertenezcan al alfabeto ingl es. Retorna el string que representa al entero i. Retorna el ndice en que se encuentra el string str en el string actual, o -1 si es que no se encuentra (o cualquier otro problema). S olo encuentra str a a partir del ndice from.
String toUpperCase()
Criterios de soluci on M etodo substring: Lo primero que debemos hacer es revisar que los par ametros recibidos correspondan a ndices v alidos seg un el largo del String. Si el inicio es menor que cero y el n mayor que el largo del String -1 entonces retornamos false. Si no, para obtener un substring, debemos implementar un ciclo (f or por ejemplo) que recorra el String completo, desde el inicio hasta el n recibidos como par ametros, y vaya obteniendo cada char con el m etodo charAt y lo vaya concatenando, formando as el substring a retornar. M etodo toUpperCase: Para cambiar las letras a may uscula debemos implementar un ciclo que recorra todo el String obteniendo cada uno de sus caracteres con el m etodo charAt. Luego revisamos cada caracter si es que est a en min uscula, para esto basta con comparar si se encuentra en el rango de a a z (recordando que los caracteres est an ordenados en la tabla ASCII). Si est a en min uscula lo que tenemos que hacer es al inicio de las may usculas A sumarle la distancia del caracter en min uscula al inicio de las min usculas a. As , tendremos el mismo caracter pero ahora en may uscula. M etodo valueOf: Para pasar el valor entero a String tenemos que revisar primero si el n umero es negativo o positivo. Si el n umero es negativo tenemos que agregar un gui on - al String resultante. Luego recorremos el n umero y vamos obteniendo cada uno de sus d gitos (dividiendo el n umero por 10 y obteniendo el resto) y para cada d gito obtenemos el char que corresponde y lo concatenamos al String que representa el resultado de pasar el n umero a String. M etodo indexOf: En este m etodo lo que tenemos que hacer es recorrer todo el String, partiendo desde el inicio ingresado por el usuario. Dentro del ciclo debemos revisar el String ingresado como par ametro (el buscado) para revisar cada uno de sus caracteres y compararlos con el String original. As si todos los caracteres coinciden devolvemos la posici on donde encontramos el primer caracter que fue igual. IIC1103 Cap tulo 5: Strings 8
Posible soluci on
/* * * Retorna el s u b s t r i n g que va desde la posicion begin a la posicion end , * i n c l u s i v e. Devuelve null si existe algun problema con los indices * recibido . */ public String s u b s t r i n g( int begin , int end ) { if ( begin < 0 || end > length () - 1) return null ; String res = " " ; for ( int i = begin ; i <= end ; i ++) res += charAt ( i ); return res ; } /* * * Retorna un string e q u i v a l e n t e al actual , pero con todas las letras * c o n v e r t i d a s a m a y u s c u l a. Ignora c a r a c t e r e s que no p e r t e n e z c a n al alfabeto * ingles */ public String t o U p p e r C a s e() { String res = " " ; for ( int i = 0; i < length (); i ++) { char aux = charAt ( i ); if ( a <= aux && aux <= z ) res += ( char ) ( aux + A - a ); else res += aux ; } return res ; } /* * * Retorna el string que r e p r e s e n t a al entero i . */ public static String valueOf ( int i ) { if ( i == 0) return " 0 " ; boolean negative = false ; if ( i < 0) { negative = true ; i = -i ; } String res = " " ; while ( i > 0) { res = " " + ( char ) ( i % 10 + 0 ) + res ; i /= 10; } if ( negative ) res = " -" + res ; return res ; } /* * * Retorna el indice en que se e n c u e n t r a el string str en el string actual , * o -1 si es que no se e n c u e n t r a ( o c u a l q u i e r otro problema ). Solo * e n c u e n t r a str a a partir del indice from . */ public int indexOf ( String str , int from ) { for ( int i = from ; i < length (); i ++) { for ( int j = 0; ( i + j < length ()) && charAt ( i + j ) == str . charAt ( j ); j ++) { if ( j == str . length () - 1) return i ; } } return -1; }
10
if ( parte1 . e q u a l s I g n o r e C a s e( " PC " )) { if ( j u g a d o r e s == 0) { // El tipo PC requiere minimo 1 jugador Usuario . mensaje ( " No es un formato valido : No e s p e c i f i c o j u g a d o r e s para Pc " ); return false ; } mensaje = " Tipo de juego : PC " + \n + j u g a d o r e s( parte2 ); } else if ( parte1 . e q u a l s I g n o r e C a s e( " MULTI " )) { if ( j u g a d o r e s < 2) { // El tipo MULTI requiere minimo 2 j u g a d o r e s Usuario . mensaje ( " No es un formato valido : no ingreso s u f i c i e n t e s j u g a d o r e s para el tipo Multi " ); return false ; } mensaje = " Tipo de juego : MULTI " + \n + j u g a d o r e s( parte2 ); } else { Usuario . mensaje ( " No es un formato valido " ); return false ; } Usuario . mensaje ( mensaje ); return true ; } // Metodo que D e t e r m i n a la cantidad de j u g a d o r e s e x i s t e n t e s static int c a n t i d a d _ j u g a d o r e s( String j u g a d o r e s) { if ( j u g a d o r e s. length () == 0) { return 0; } int cantidad = 1; for ( int i = 0; i < j u g a d o r e s. length (); i ++) { if ( j u g a d o r e s. charAt ( i ) == - ) { cantidad ++; } } return cantidad ; } // Metodo que retorna El mensaje c o r r e s p o n d i e n t e de los j u g a d o r e s static String j u g a d o r e s( String parte2 ) { String mensaje = " Jugador 1: " ; int y = 1; for ( int k = 0; k < parte2 . length (); k ++) { if ( parte2 . charAt ( k ) == - ) { // Encontro un - ... asi que se salta al s i g u i e n t e jugador y ++; mensaje += " \ nJugador " + y + " : " ; } else { mensaje += parte2 . charAt ( k ); } } return mensaje ; } }
11
Problema 4: Double
Enunciado Haga un c odigo que permita determinar si un texto ingresado es un double, independiente que el n umero este separado con: . o ,. De esta forma podemos usar seguros el m etodo Double.ParseDouble(String str);. Criterios de soluci on Observamos que esta es una validaci on simple, s olo debemos vericar que los caracteres sean n umeros, signo negativo, o separadores v alidos, adem as de que s olo exista un separador. Adicionalmente podemos hacer el m etodo que transforme las comas en puntos, para que Java pueda manejar el n umero. Posible soluci on
import i i c 1 1 0 3 P a c k a g e .*; public class P r i n c i p a l { public static void main ( String [] args ) { while ( true ) { String x = Usuario . texto ( " Ingrese el decimal a validar " ); if ( esDouble ( x )) { x = r e m p l a z a r( x ); double numero = Double . p a r s e D o u b l e( x ); Usuario . mensaje ( " El numero i n g r e s a d o es : " + numero ); break ; } } } // Metodo que valida si un numero es decimal static boolean esDouble ( String a C o m p r o b a r) { if ( a C o m p r o b a r. length () == 0) { // Si es vacio no sera un double return false ; } int comas = 0; if (!(48 <= ( int ) a C o m p r o b a r. charAt (0) && ( int ) a C o m p r o b a r. charAt (0) <= 57) && !(( int ) a C o m p r o b a r. charAt (0) == 44 || ( int ) a C o m p r o b a r . charAt (0) == 46) && ( int ) a C o m p r o b a r. charAt (0) != 45) { return false ; // Si no es un numero , ni un s e p a r a d o r ni un signo // - ... no es un double } for ( int i = 1; i < a C o m p r o b a r. length (); i ++) { boolean esnumero = 48 <= ( int ) a C o m p r o b a r. charAt ( i ) && ( int ) a C o m p r o b a r. charAt ( i ) <= 57; boolean escoma = ( int ) a C o m p r o b a r. charAt ( i ) == 44 || ( int ) a C o m p r o b a r. charAt ( i ) == 46; if (! esnumero && ! escoma ) { return false ; } else if ( a C o m p r o b a r. charAt ( i ) == 44 || a C o m p r o b a r. charAt ( i ) == 46) { comas ++; if ( comas > 1) return false ; } } Usuario . mensaje ( " Es un double " ); return true ; } // Metodo que r e e m p l a z a la primera , por . static String r e m p l a z a r( String s ) { int donde = s . indexOf ( " ," ); if ( donde != -1) { return ( s . s u b s t r i n g(0 , donde ) + . + s . s u b s t r i n g( donde + 1)); } else { return s ; } } }
12
Problema 5: Operaciones
Enunciado Realice un m etodo que reciba un String con una operaci on b asica (+, , , /) y devuelve el resultado de esa operaci on. Por ejemplo si recibe 4,5 + 35 debe devolver 39,5. Para esto puede ocupar s olo los siguientes m etodos de la clase String: charAt, length Criterios de soluci on Lo primero que debemos hacer es identicar cu al es la operaci on que se encuentra en el String. Para esto utilizamos un ciclo (un f or por ejemplo), para recorrer todo el String e ir obteniendo cada uno de los caracteres con el m etodo charAt. Cada caracter lo comparamos con una de las posibles operaciones. Al encontrar la operaci on guardamos el caracter y tambi en la posici on donde la encontramos para luego obtener los n umeros que vienen en el String. Para recuperar los n umeros del String, como s olo podemos utilizar el m etodo charAt, lo que hacemos son dos ciclos, uno que recorra la primera parte del string obteniendo cada uno de los caracteres y concaten andolos en un nuevo String que represente el primer n umero, y el segundo ciclo que haga lo mismo pero con la segunda parte del String. Luego transformamos los Strings que representan a los n umeros en variables de tipo double y revisando la operaci on encontrada retornamos el resultado de la operaci on. Posible soluci on
public double O p e r a c i o n( String op ) { // Debemos i d e n t i f i c a r cual es la o p e r a c i o n que se e n c u e n t r a en el String char opDada = 0; int posOp = 0; for ( int i = 0; i < op . length (); i ++) { if ( op . charAt ( i ) == + || op . charAt ( i ) == - || op . charAt ( i ) == * || op . charAt ( i ) == / ) { opDada = op . charAt ( i ); posOp = i ; break ; } } // Ahora debemos i d e n t i f i c a r los valores i n v o l u c r a d o s double valor1 = 0 , valor2 = 0; String aux = " " ; for ( int i = 0; i < posOp ; i ++) { aux += op . charAt ( i ); } valor1 = Double . p a r s e D o u b l e( aux ); aux = " " ; for ( int i = posOp + 1; i < op . length (); i ++) { aux += op . charAt ( i ); } valor2 = Double . p a r s e D o u b l e( aux ); if ( opDada == + ) { return valor1 + valor2 ; } else if ( opDada == - ) { return valor1 - valor2 ; } else if ( opDada == * ) { return valor1 * valor2 ; } else { return valor1 / valor2 ; } }
13
14
Problema 7: Combinaci on
Enunciado Implemente una clase llamada Combinacion, la cual recibe dos String en el constructor. Su clase debe tener un m etodo que reciba un char y retorne la cantidad de apariciones de ese char en ambos textos. Un m etodo que retorne un String formado por la intercalaci on de las letras que forman ambos textos. Otro m etodo que retorne el resultado de la comparaci on entre dos substrings de los textos, recibiendo como par ametros los ndices iniciales y nales para cada uno de ellos. Finalmente un m etodo que permita reemplazar un cierto char por otro en ambos textos. Para esto puede ocupar s olo los siguientes m etodos de la clase String: charAt, length, equals, compareTo Criterios de soluci on Lo primero que debemos hacer es declarar la clase Combinacion con dos atributos de tipo String. Luego debemos crear el constructor, el cual reciba dos Strings como par ametros y los asigne a los atributos correspondientes. Para el m etodo encargado de contar las apariciones de un char entregado como par ametro, lo que tenemos que hacer es un ciclo (f or por ejemplo) que recorra ambos Strings y vaya comparando cada uno de sus caracteres, utilizando el m etodo charAt e ir contando en una variable cuantas veces el caracter es igual al recibido como par ametro. Para el m etodo que intercale ambos Strings lo que tenemos que hacer es nuevamente implementar un ciclo que vaya recorriendo cada String y obteniendo uno a uno sus caracteres con el m etodo charAt. As se concatena un caracter del primer String seguido de un caracter del segundo. En este m etodo tenemos que revisar siempre que el String a un no se acabe ya que puede ocurrir que uno sea m as largo que el otro, en tal caso simplemente intercalamos hasta que se termine el menor y luego concatenamos el resto del mayor. Para el m etodo que compara dos substrings de los textos debemos primero obtener los substrings seg un los datos de inicio y n recibidos como par ametros. Para esto implementamos ciclos que recorran los strings desde el inicio hasta el n recibidos como par ametros y vayan formando los dos substrings, concatenando los caracteres que se obtienen utilizando el m etodo charAt. Luego utilizando el m etodo equals o compareT o, revisamos si son iguales, y retornamos true o false seg un corresponda. Para el m etodo que reemplace un char por otro lo que podemos hacer es implementar un ciclo que recorra ambos textos y que vaya obteniendo, con el m etodo charAt, cada uno de los caracteres. Revisamos el caracter comparando si es igual al que se quiere reemplazar. Si es as , concatenamos el nuevo char, si no lo es, concatenamos el char original, formando as el texto con los caracteres reemplazados.
15
Posible soluci on
public class C o m b i n a c i o n { private String texto1 ; private String texto2 ; public C o m b i n a c i o n( String t1 , String t2 ) { texto1 = t1 ; texto2 = t2 ; } public int A p a r i c i o n e s( char c ) { String t = texto1 + texto2 ; int a p a r i c i o n e s = 0; for ( int i = 0; i < t . length (); i ++) { if ( t . charAt ( i ) == c ) { a p a r i c i o n e s ++; } } return a p a r i c i o n e s; } public String I n t e r c a l a c i o n() { String res = " " ; for ( int i = 0; i < texto1 . length () || i < texto2 . length (); i ++) { if ( i < texto1 . length ()) { res += texto1 . charAt ( i ); } if ( i < texto2 . length ()) { res += texto2 . charAt ( i ); } } return res ; } public boolean Comparar ( int i1 , int f1 , int i2 , int f2 ) { // O b t e n e m o s ambos s u b s t r i n g s String t1 = " " ; String t2 = " " ; for ( int i = i1 ; i <= f1 ; i ++) { t1 += texto1 . charAt ( i ); } for ( int i = i2 ; i <= f2 ; i ++) { t2 += texto2 . charAt ( i ); } return t1 . equals ( t2 ); } public void R e e m p l a z a r( char charOriginal , char c h a r R e e m p l a z o) { String aux = " " ; for ( int i = 0; i < texto1 . length (); i ++) { if ( texto1 . charAt ( i ) == c h a r O r i g i n a l) { aux += c h a r R e e m p l a z o; } else { aux += texto1 . charAt ( i ); } } texto1 = aux ; aux = " " ; for ( int i = 0; i < texto2 . length (); i ++) { if ( texto2 . charAt ( i ) == c h a r O r i g i n a l) { aux += c h a r R e e m p l a z o; } else { aux += texto2 . charAt ( i ); } } texto2 = aux ; } }
16
17
Problema 9: Ahorcado
Enunciado Realice un programa en Java para jugar Al ahorcado. Recuerde que este juego consiste en tratar de adivinar una palabra, letra por letra, en una cantidad preestablecida de intentos. Para este problema suponga que la palabra (oraci on 1 ) a adivinar es hola mundo, aceptando a lo m as 3 intentos fallidos por parte del usuario. Solicite a trav es de una ventana al usuario que ingrese las letras, y muestre en consola la palabra con las letras que lleva descubiertas. Ejemplo: si el mensaje es hola mundo, y el usuario a ingreso o, a, z, debe mostrar en consola _o_a ____o . Por simplicidad puede suponer que tanto el mensaje secreto, como las letras ingresadas por el usuario, son en min uscula. Criterios de soluci on El enunciado nos da pocas restricciones, salvo el mensaje y la cantidad de intentos. Pero sabemos que debemos validar que el usuario ingrese s olo una letra, comparar si corresponde a alguna(s) de la palabra secreta, y de ser as cambiarla. Repetir esto mientras no haya ganado (descifrado la palabra completa) o perdido (alcanzado el m aximo de errores permitidos). Posible soluci on
import i i c 1 1 0 3 P a c k a g e .*; public class P r i n c i p a l A h o r c a d o { /* * * Programa para jugar el juego del Ahorcado */ public static void main ( String [] args ) { String p a l a b r a C l a v e = " hola mundo " ; // palabra clave e s t a b l e c i d a int intentos = 3; // cantidad de intentos e s t a b l e c i d o s // creamos un objetos de la clase Ahorcado Ahorcado a1 = new Ahorcado ( palabraClave , intentos ); // m o s t r a m o s el mensaje inicial Usuario . mensaje ( " B i e n v e n i d o! " + " \ nIntente adivinar la palabra secreta . Tiene " + intentos + " intentos " ); // ciclo del juego ( mientras pueda seguir jugando ) while ( a1 . s e g u i r J u g a n d o ()) { // mostrar lo que lleva Usuario . mensaje ( " Hasta ahora lleva : " + a1 . g e t P a l a b r a A c t u a l ()); // g u a r d a r e m o s la letra que ingrese el usuario String palabra = " " ; // v e r i f i c a m o s que sea solo una letra while ( palabra . length () != 1) { palabra = Usuario . texto ( " Ingrese la letra que quiere d e s c u b r i r: " ); } // tomamos el primer caracter del string char c = palabra . charAt (0); // p r e g u n t a r si esta en la palabra secreta a1 . p r e g u n t a r L e t r a( c ); } // fuera del while ( se acabo el juego ) // vemos si gano if ( a1 . gano ()) { // m o s t r a m o s el mensaje de f e l i c i t a c i o n Usuario . mensaje ( " F e l i c i t a c i o n e s! Ha d e s c u b i e r t o la palabra secreta " ); } else { // perdio , m o s t r a m o s el mensaje avisando Usuario . mensaje ( " Ha perdido . " + " \ n La palabra era : " + a1 . g e t P a l a b r a C l a v e()); } } }
1 si
ingresa una oraci on, los espacios no se deben ocultar, es decir, colocando el
18
public class Ahorcado { // [ A T R I B U T O S] String p a l a b r a C l a v e; // palabra clave del juego String p a l a b r a A c t u a l; // palabra que lleva el usuario int i n t e n t o s F a l l i d o s; // cantidad de intentos fallidos int i n t e n t o s M a x i m o; // cantidad de intentos maximos por fallar // [ METODOS ] // C o n s t r u c t o r de la clase public Ahorcado ( String palabraClave , int i n t e n t o s M a x i m o) { this . p a l a b r a C l a v e = p a l a b r a C l a v e; this . i n t e n t o s F a l l i d o s = 0; this . i n t e n t o s M a x i m o = i n t e n t o s M a x i m o; this . p a l a b r a A c t u a l = o c u l t a r P a l a b r a( p a l a b r a C l a v e); } // getters public int g e t I n t e n t o s A c t u a l () { return i n t e n t o s F a l l i d o s; } public String g e t P a l a b r a A c t u a l() { return p a l a b r a A c t u a l; } public String g e t P a l a b r a C l a v e() { return p a l a b r a C l a v e; } // Otros ... // metodo que d e t e r m i n a si la letra esta en la palabra clave public void p r e g u n t a r L e t r a( char c ) { if ( this . p a l a b r a C l a v e. contains ( c + " " )) { d e s c u b r i r L e t r a( c ); } else { this . i n t e n t o s F a l l i d o s ++; } } // metodo que cambia cada " _ " por la letra que c o r r e s p o n d e public void d e s c u b r i r L e t r a( char c ) { String aux = " " ; for ( int i = 0; i < this . p a l a b r a C l a v e. length (); i ++) { if ( this . p a l a b r a C l a v e. charAt ( i ) == c ) { aux += this . p a l a b r a C l a v e. charAt ( i ); } else { aux += this . p a l a b r a A c t u a l. charAt ( i ); } } this . p a l a b r a A c t u a l = aux ; } // esconde la palabra clave , c a m b i a n d o cada caracter por " _ " public String o c u l t a r P a l a b r a( String m ) { String s = " " ; for ( int i = 0; i < m . length (); i ++) { if ( m . charAt ( i ) == ) { s += " " ; } else { s += " _ " ; } } return s ; } // d e t e r m i n a si se puede seguir jugando ( no ha ganado ni perdido ) public boolean s e g u i r J u g a n d o() { if ( this . i n t e n t o s F a l l i d o s < this . i n t e n t o s M a x i m o && ! gano ()) { return true ; } else { return false ; } } // d e t e r m i n a si gano public boolean gano () { return this . p a l a b r a C l a v e. equals ( this . p a l a b r a A c t u a l); } }
19
2 http://es.wikipedia.org/wiki/Jerigonza 3 la
letra y tambi en ser a considerada como vocal cuando corresponda, esto es, cuando no anteceda a alguna vocal
20
Posible soluci on
import i i c 1 1 0 3 P a c k a g e .*; public class J e r i g o n z a { /* * * Programa que escribe el texto i n g r e s a d o por el usuario como J e r i g o n z a. * ( se asume que no ingresa ningun tipo de tilde ) */ public static void main ( String [] args ) { String texto = Usuario . texto ( " Ingrese el texto a J e r i g o n z a r" ); String cambiado = cambiar ( texto ); Usuario . mensaje ( cambiado ); } private static String cambiar ( String texto ) { String aux = " " ; for ( int i = 0; i < texto . length (); i ++) { if ( texto . charAt ( i ) == a ) { aux += " apa " ; } else if ( texto . charAt ( i ) == A ) { aux += " Apa " ; } else if ( texto . charAt ( i ) == e ) { aux += " epe " ; } else if ( texto . charAt ( i ) == E ) { aux += " Epe " ; } else if ( texto . charAt ( i ) == i ) { aux += " ipi " ; } else if ( texto . charAt ( i ) == I ) { aux += " Ipi " ; } else if ( texto . charAt ( i ) == o ) { aux += " opo " ; } else if ( texto . charAt ( i ) == O ) { aux += " Opo " ; } else if ( texto . charAt ( i ) == u ) { aux += " upu " ; } else if ( texto . charAt ( i ) == U ) { aux += " Upu " ; } else if ( texto . charAt ( i ) == y && (( i < texto . length () - 1) && texto . charAt ( i + 1) != a && texto . charAt ( i + 1) != A && texto . charAt ( i + 1) != e && texto . charAt ( i + 1) != E && texto . charAt ( i + 1) != i && texto . charAt ( i + 1) != I && texto . charAt ( i + 1) != o && texto . charAt ( i + 1) != O && texto . charAt ( i + 1) != u && texto . charAt ( i + 1) != U )) { aux += " ypi " ; } else if ( texto . charAt ( i ) == Y && (( i < texto . length () - 1) && texto . charAt ( i + 1) != a && texto . charAt ( i + 1) != A && texto . charAt ( i + 1) != e && texto . charAt ( i + 1) != E && texto . charAt ( i + 1) != i && texto . charAt ( i + 1) != I && texto . charAt ( i + 1) != o && texto . charAt ( i + 1) != O && texto . charAt ( i + 1) != u && texto . charAt ( i + 1) != U )) { aux += " Ypi " ; } else { aux += texto . charAt ( i ); } } return aux ; } }
21
22
Posible soluci on
public class Cifrado { // Declaro un metodo con nombre " cifrar "; retorna una variable de tipo // String y recibe como a r g u m e n t o otro String . public static String cifrar ( String msg ) { // Creo una variable de tipo String y la i n i c i a l i z o con un String vacio . String msgRot13 = " " ; for ( int i = 0; i < msg . length (); ++ i ) { // Creo una variable de tipo char y almaceno el caracter que se // e n c u e n t r a en la posicion i del String msg . char x = msg . charAt ( i ); // A c o n t i n u a c i o n u t i l i z a r e un " truco " para comparar c a r a c t e r e s // u t i l i z a n d o su valor en la tabla ASCII . // Noten que para escribir un caracter uso comillas simples en vez // de comillas dobles , ya que las comillas dobles sirve para // declarar v a r i a b l e s de tipo String . // Si el caracter es mayor o igual que A ( en la tabla ASCII ) y // menor o igual que Z // ( esto quiere decir : " si el caracter es una letra m a y u s c u l a") if ( x >= A && x <= Z ) { // Si me paso de Z , entonces le resto 13 al caracter . if ( x + 13 > Z ) { x -= 13; } else { // Sino le sumo 13. x += 13; } // Si el caracter es una letra minuscula , entonces ... } else if ( x >= a && x <= z ) { // Si me paso de Z , entonces le resto 13 al caracter . if ( x + 13 > z ) { x -= 13; } else { // Sino le sumo 13. x += 13; } } // Agrego x al r e s u l t a d o. msgRot13 += x ; } // Retorno el String cifrado . return msgRot13 ; } // En ROT13 el cifrado y d e s c i f r a d o se realiza con la misma funcion , por lo // tanto en el // metodo d e s c i f r a r s i m p l e m t e n llamo al metodo cifrar y retorno su valor . public static String d e s c i f r a r( String msg ) { return cifrar ( msg ); } }
23
24
Posible soluci on
public class C o d i f i c a d o r { private int millave ; private boolean h a b i l i t a d o; public C o d i f i c a d o r( int llave ) { if (( llave >= 0) && ( llave <= 26)) { millave = llave ; h a b i l i t a d o = true ; } else { h a b i l i t a d o = false ; } } public String e n c r i p t a r( String mensaje , boolean e n c r i p t a r) { String e n c r i p t a d o = " " ; int cero = a - 1; int l l a v e A c t u a l = millave ; if (! e n c r i p t a r) l l a v e A c t u a l *= -1; for ( int i = 0; i < mensaje . length (); i ++) { char letra = mensaje . charAt ( i ); int valor = letra ; if ( letra != ) { valor = letra + l l a v e A c t u a l - cero ; if ( e n c r i p t a r) { if ( valor > 26) valor %= 26; } else { if ( valor < 0) valor = 26 + valor ; } valor += cero ; } e n c r i p t a d o += ( char ) ( valor ); } if ( h a b i l i t a d o) return e n c r i p t a d o; return " # ERROR # " ; } }
25
Aqu se encuentra la clase principal Encriptador que hace uso de la clase Cypher. Ud. deber a implementar todos los m etodos de la clase Cypher que son invocados por el Encriptador:
import i i c 1 1 0 3 P a c k a g e .*; public class E n c r i p t a d o r { public static void main ( String [] args ) { Cypher c = new Cypher (); String msg = Usuario . texto ( " Ingrese el mensaje a e n c r i p t a r" ); // Quitar espacios del mensaje i n g r e s a d o msg = c . Q u i t a r E s p a c i o s( msg ); // D e t e r m i n a r el tamanio del Cuadrado ( nro . filas = nro . columnas ) int n r o _ f i l a s = c . C u a d r a d o P e r f e c t o( msg ); // A l g o r i t m o de e n c r i p t a c i o n String msg2 = c . E n c r i p t a r( msg , n r o _ f i l a s); Usuario . mensaje ( msg2 ); } }
Criterios de soluci on M etodo QuitarEspacios: En este m etodo tenemos que recorrer el String e ir obteniendo cada caracter con el m etodo charAt y revisar si es igual al caracter que representa el espacio. Si no es igual lo concatenamos al String nal. As el String que retornamos no contiene ning un espacio. M etodo CuadradoPerfecto: En este m etodo tenemos que determinar el n umero de las (igual al n umero de columnas). Para esto utilizamos el m etodo Math.sqrt con el largo del String, considerando que si la raiz no es exacta tenemos que sumar uno al resultado para poder considerar todas las letras del mensaje. M etodo Encriptar: Lo primero que tenemos que hacer es revisar si el mensaje ocupa todas las posiciones del cuadrado. De no ser as debemos rellenar los caracteres que faltan con @. Despu es para encriptar lo importante es recorrer bien el String. As , partimos desde el comienzo y con un ciclo vamos recorriendo todo el String. Dentro de este ciclo implementamos otro, el cual vaya obteniendo los caracteres para concatenar en la respuesta nal. Para obtener los caracteres tenemos que avanzar tantas posiciones como el n umero de columnas tenga el cuadrado, as estaremos recorriendo el cuadrado leyendo por columna.
26
Posible soluci on
public class Cypher { public String E n c r i p t a r( String s , int total ) { String r e s p u e s t a = " " ; // aniadir c a r a c t e r e s extra while ( s . length () < ( total * total )) s = s + "@"; // llenar el cuadrado for ( int i = 0; i < total ; i ++) { for ( int j = i ; j < s . length (); j = j + total ) r e s p u e s t a = r e s p u e s t a + s . charAt ( j ); } return r e s p u e s t a; } public int C u a d r a d o P e r f e c t o( String s ) { int total = ( int ) Math . sqrt ( s . length ()); if ( total * total != s . length ()) total ++; return total ; } public String Q u i t a r E s p a c i o s( String s ) { String otro = " " ; for ( int i = 0; i < s . length (); i ++) { if ( s . charAt ( i ) != ) otro += s . charAt ( i ); } return otro ; } }
27
inicial. Si no, calculamos cuantas letras nos faltan y adem as del primer apellido concatenamos las letras que faltan del segundo apellido. M etodo nombreUsuarioFinal: Recibimos el String con los nombres de usuario ya existente y utilizando el m etodo contains revisamos si el nombre de usuario formado est a contenido en los nombres de usuarios recibidos. Si es as , generamos aleatoriamente dos n umeros: uno que determine la posici on y otro que sea el n umero a intercalar en esa posici on. Luego con el m etodo substring separamos el nombre de usuario inicial en dos y luego concatenamos la primera mitad, m as el d gito generado aleatoriamente m as la segunda mitad y tenemos el nombre de usuario nal. Posible soluci on
import i i c 1 1 0 3 P a c k a g e .*; public class N o m b r e d e U s u a r i o { private String n o m b r e R e a l; private String n o m U s u I n i; private String n o m b r e U s u a r i o; private String nombre1 , nombre2 , apellido1 , a p e l l i d o 2; public N o m b r e d e U s u a r i o( String nom1 , String nom2 , String ap1 , String ap2 ) { nombre1 = nom1 ; nombre2 = nom2 ; a p e l l i d o 1 = ap1 ; a p e l l i d o 2 = ap2 ; if ( nom2 . length () == 0) { n o m b r e R e a l = nombre1 + " " + a p e l l i d o 1 + " " + a p e l l i d o 2; } else { n o m b r e R e a l = nombre1 + " " + nombre2 + " " + a p e l l i d o 1 + " " + a p e l l i d o 2; } } public void n o m b r e U s u a r i o I n i c i a l() { if ( nombre2 . length () == 0) { n o m U s u I n i = " " + nombre1 . charAt (0) + nombre1 . charAt (1); } else { n o m U s u I n i = " " + nombre1 . charAt (0) + nombre2 . charAt (0); } if ( a p e l l i d o 1. length () >= 6) { n o m U s u I n i = n o m U s u I n i + a p e l l i d o 1. s u b s t r i n g(0 , 6); } else { int k = 6 - a p e l l i d o 1. length (); n o m U s u I n i = n o m U s u I n i + a p e l l i d o 1 + a p e l l i d o 2. s u b s t r i n g(0 , k ); } } public void n o m b r e U s u a r i o F i n a l( String usuarios ) { if (! usuarios . contains ( n o m U s u I n i)){ n o m b r e U s u a r i o = n o m U s u I n i; } else { int p = A l e a t o r i o. entero (1 , 7); int q = A l e a t o r i o. entero (1 , 9); n o m b r e U s u a r i o = n o m U s u I n i. s u b s t r i n g(0 , p ) + q + n o m U s u I n i. s u b s t r i n g( p + 1 , 8); } } }
29
punto . o coma , o una letra may uscula) para agregar espacios cuando corresponda y formamos dos strings: uno que represente las letras iniciales de cada l nea y otro las nales, tomando en cuenta que al que represente las letras nales hay que ir agregando los nuevos caracteres al inicio y no al nal. As despu es concatenamos estos dos Strings y tenemos el mensaje descifrado. Posible soluci on
public class D e s c i f r a d o r { private String texto ; public D e s c i f r a d o r( String texto ) { this . texto = texto ; } public String d e s c u b r i r M e n s a j e() { String r e s u l t a d o I z q u i e r d o = " " + texto . charAt (0); String r e s u l t a d o D e r e c h o = " " ; char c a r a c t e r I z q u i e r d o; char c a r a c t e r D e r e c h o; for ( int i = 1; i < texto . length () - 1; i ++) { char c a r a c t e r A c t u a l = texto . charAt ( i ); if ( c a r a c t e r A c t u a l == \n ) { c a r a c t e r I z q u i e r d o = texto . charAt ( i - 1); c a r a c t e r D e r e c h o = texto . charAt ( i + 1); r e s u l t a d o I z q u i e r d o += i n t e r p r e t a r C a r a c t e r( c a r a c t e r D e r e c h o); r e s u l t a d o D e r e c h o = i n t e r p r e t a r C a r a c t e r( c a r a c t e r I z q u i e r d o) + r e s u l t a d o D e r e c h o; } } return r e s u l t a d o I z q u i e r d o + r e s u l t a d o D e r e c h o; } private String i n t e r p r e t a r C a r a c t e r( char caracter ) { if ( caracter >= A && caracter <= Z ) { return " " + caracter ; } else if ( caracter == . || caracter == , ) { return " " ; } return " " + caracter ; } }
31
Las letras de una palabra tambi en van separadas entre s por 1 espacio, al nal de la serie de puntos no debe se considera como si ir un espacio. Otras consideraciones: la letra K se considera que es una C, la letra N fuera N, se ignora todo otro s mbolo fuera de la matriz de claves. Se pide que implemente el m etodo aTap de la clase Cipher que recibe dos Strings, uno contiene el mensaje original, y el otro un String con los caracteres de la matriz, ambos Strings en may usculas. El m etodo aTap devuelve un String conteniendo la serie de puntos equivalentes en el Tap Code. Note que si recibe como mensaje un String vac o o nulo, debe retornar el mismo mensaje original sin ning un cambio.
import i i c 1 1 0 3 P a c k a g e .*; public class P r i n c i p a l { public static void main ( String [] args ) { String matriz = " A B C D E F G H I J L M N O P Q R S T U V W X Y Z" ; Cypher c = new Cypher (); String mensaje = Usuario . texto ( " Mensaje ? " ); // C o n v i e r t e el mensaje a m a y u s c u l a s mensaje = mensaje . t o U p p e r C a s e(); Usuario . mensaje ( c . aTap ( mensaje , matriz )); } } public class Cypher { public String aTap ( String original , String matriz ) { // I m p l e m e n t a r el metodo que c o n v i e r t e a original en una // lista de puntos s i g u i e n d o las reglas del TapCode } }
Criterios de soluci on Lo primero que tenemos que hacer en el m etodo aTap es revisar que el String original recibido como par ametro no sea vac o. Si es as , simplemente retornamos el mismo String. IIC1103 Cap tulo 5: Strings 32
Si el String no est a vac o debemos recorrerlo con un ciclo para obtener cada letra que lo compone, utilizando y cambiarlas para esto el m etodo charAt. Al obtener la letra debemos revisar si se trata de una C o una N a C y N respectivamente. Luego tenemos que encontrar la posici on de la letra en la matriz recibida como par ametro. Si vemos la matriz como un String extendido podemos ver que la la de la letra estar a dada por la posici on de la letra en el String divido en 5 (ya que son 5 las y 5 columnas). Y la columna de la letra estar a dada por el resto de la divisi on de la posici on de la letra en el String por 5. Despu es de eso s olo tenemos que imprimir tantos puntos como la la y la columna encontrada, separando cada uno con un espacio. Posible soluci on
public String aTap ( String original , String matriz ) { if (( original == null ) || original . equals ( " " )) { return original ; } String puntos = " " ; for ( int i = 0; i < original . length (); i ++) { String letra = " " + original . charAt ( i ); if ( letra . equals ( " K " )) { letra = " C " ; } else if ( letra . equals (" N " )) { letra = " N " ; } int n = -1 , m = -1; if ( matriz . indexOf ( letra ) >= 0) { n = matriz . indexOf ( letra ) / 5; m = matriz . indexOf ( letra ) - n * 5; } if ( n >= 0 && n >= 0) { for ( int j = 0; j <= n ; j ++) { puntos = puntos + " . " ; } puntos = puntos + " " ; for ( int j = 0; j <= m ; j ++) { puntos = puntos + " . " ; } } puntos = puntos + " " ; } // NO DEBE INCLUIR UN ESPACIO AL FINAL if ( puntos . length () > 0) { puntos = puntos . s u b s t r i n g(0 , puntos . length () - 1); } return puntos ; }
33
Adem as cada familia debe ser capaz de retorna el promedio de edad de la familia, para que as el main pueda mostrarlos. Incremento 3 Por u ltimo debe ser posible buscar el n umero de integrantes que tiene un cierto pasatiempo en cada familia. Pudiendo tambi en realizar esta b usqueda en un g enero en particular. Nuevamente debe cumplir con lo denido en el main.
import i i c 1 1 0 3 P a c k a g e .*; public class P r i n c i p a l { public static void main ( String [] args ) { /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Iteracion 1 */ // Creamos todas las familias con sus r e s p e c t i v a s personas y p a s a t i e m p o s Familia f1 = new Familia ( " Palma S e p u l v e d a" ); Persona p11 = new Persona (" Juan " , 25 , 0); p11 . a g r e g a r P a s a t i e m p o( " Futbol " ); p11 . a g r e g a r P a s a t i e m p o( " Piano " ); Persona p12 = new Persona (" Maria " , 43 , 1); p12 . a g r e g a r P a s a t i e m p o( " Leer " ); Persona p13 = new Persona (" Pedro " , 12 , 0); p13 . a g r e g a r P a s a t i e m p o( " TV " ); p13 . a g r e g a r P a s a t i e m p o( " Futbol " );
34
Persona p14 = new Persona (" Pablo " , 48 , 0); p14 . a g r e g a r P a s a t i e m p o( " Leer " ); p14 . a g r e g a r P a s a t i e m p o( " Futbol " ); p14 . a g r e g a r P a s a t i e m p o( " Comer " ); f1 . a g r e g a r I n t e g r a n t e( p11 ); f1 . a g r e g a r I n t e g r a n t e( p12 ); f1 . a g r e g a r I n t e g r a n t e( p13 ); f1 . a g r e g a r I n t e g r a n t e( p14 ); Familia f2 = new Familia ( " Langdon Alarcon " ); Persona p21 = new Persona (" Carolina " , 13 , 1); p21 . a g r e g a r P a s a t i e m p o( " Bailar " ); p21 . a g r e g a r P a s a t i e m p o( " Leer " ); Persona p22 = new Persona (" Isabel " , 17 , 1); p22 . a g r e g a r P a s a t i e m p o( " Cantar " ); p22 . a g r e g a r P a s a t i e m p o( " Leer " ); p22 . a g r e g a r P a s a t i e m p o( " Futbol " ); Persona p23 = new Persona (" Jose " , 30 , 0); p23 . a g r e g a r P a s a t i e m p o( " Futbol " ); p23 . a g r e g a r P a s a t i e m p o( " Comer " ); f2 . a g r e g a r I n t e g r a n t e( p21 ); f2 . a g r e g a r I n t e g r a n t e( p22 ); f2 . a g r e g a r I n t e g r a n t e( p23 ); Familia f3 = new Familia ( " Eterovic Zavala " ); Persona p31 = new Persona (" Yadran " , 45 , 0); p31 . a g r e g a r P a s a t i e m p o( " Tenis " ); p31 . a g r e g a r P a s a t i e m p o( " Leer " ); Persona p32 = new Persona (" Tere " , 19 , 1); p32 . a g r e g a r P a s a t i e m p o( " Comer " ); p32 . a g r e g a r P a s a t i e m p o( " Leer " ); p32 . a g r e g a r P a s a t i e m p o( " Bailar " ); Persona p33 = new Persona (" Sole " , 30 , 1); p33 . a g r e g a r P a s a t i e m p o( " Leer " ); Persona p34 = new Persona (" S e b a s t i a n" , 52 , 0); p33 . a g r e g a r P a s a t i e m p o( " Tenis " ); p33 . a g r e g a r P a s a t i e m p o( " Cocinar " ); p33 . a g r e g a r P a s a t i e m p o( " Comer " ); Persona p35 = new Persona (" F r a n c i s c o" , 35 , 0); p33 . a g r e g a r P a s a t i e m p o( " Futbol " ); p33 . a g r e g a r P a s a t i e m p o( " Leer " ); Persona p36 = new Persona (" Matias " , 25 , 0); p33 . a g r e g a r P a s a t i e m p o( " Futbol " ); p33 . a g r e g a r P a s a t i e m p o( " Cocinar " ); f3 . a g r e g a r I n t e g r a n t e( p31 ); f3 . a g r e g a r I n t e g r a n t e( p32 ); f3 . a g r e g a r I n t e g r a n t e( p33 ); f3 . a g r e g a r I n t e g r a n t e( p34 ); f3 . a g r e g a r I n t e g r a n t e( p35 ); // El metodo agregar persona debe retornar false si no es posible // hacerlo porque ya esta llena la familia . if (! f3 . a g r e g a r I n t e g r a n t e( p36 )) { Usuario . m e n s a j e C o n s o l a( " No se pudo agregar " + p36 . g e t N o m b r e() + " a la familia " + f3 . g e t A p e l l i d o s ()); } Familia f4 = new Familia ( " Peralta Jara " ); Persona p41 = new Persona (" Fernando " , 26 , 0); p41 . a g r e g a r P a s a t i e m p o( " Tenis " ); p41 . a g r e g a r P a s a t i e m p o( " Leer " ); p41 . a g r e g a r P a s a t i e m p o( " Cantar " ); Persona p42 = new Persona (" Cata " , 24 , 1); p42 . a g r e g a r P a s a t i e m p o( " Bailar " ); p42 . a g r e g a r P a s a t i e m p o( " Yoga " ); p42 . a g r e g a r P a s a t i e m p o( " Cocinar " ); p42 . a g r e g a r P a s a t i e m p o( " Viajar " ); f4 . a g r e g a r I n t e g r a n t e( p41 ); f4 . a g r e g a r I n t e g r a n t e( p42 ); /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Iteracion 2 */ // M o s t r a m o s cada familia f1 . m o s t r a r F a m i l i a (); f2 . m o s t r a r F a m i l i a (); f3 . m o s t r a r F a m i l i a (); f4 . m o s t r a r F a m i l i a ();
35
// M o s t r a m o s el promedio de edad de cada familia Usuario . m e n s a j e C o n s o l a( " Edad Familia : " + f1 . g e t A p e l l i d o s() + f1 . p r o m e d i o E d a d ()); Usuario . m e n s a j e C o n s o l a( " Edad Familia : " + f2 . g e t A p e l l i d o s() + f2 . p r o m e d i o E d a d ()); Usuario . m e n s a j e C o n s o l a( " Edad Familia : " + f3 . g e t A p e l l i d o s() + f3 . p r o m e d i o E d a d ()); Usuario . m e n s a j e C o n s o l a( " Edad Familia : " + f4 . g e t A p e l l i d o s() + f4 . p r o m e d i o E d a d ());
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Iteracion 3 */ // Buscamos la cantidad de personas con p a s a t i e m p o Futbol en cada // familia Usuario . m e n s a j e C o n s o l a( " Personas que les gusta el futbol Familia : " + f1 . g e t A p e l l i d o s() + " - " + f1 . i n t e g r a n t e s C o n P a s a t i e m p o( " Futbol " )); Usuario . m e n s a j e C o n s o l a( " Personas que les gusta el futbol Familia : " + f2 . g e t A p e l l i d o s() + " - " + f2 . i n t e g r a n t e s C o n P a s a t i e m p o( " Futbol " )); Usuario . m e n s a j e C o n s o l a( " Personas que les gusta el futbol Familia : " + f3 . g e t A p e l l i d o s() + " - " + f3 . i n t e g r a n t e s C o n P a s a t i e m p o( " Futbol " )); Usuario . m e n s a j e C o n s o l a( " Personas que les gusta el futbol Familia : " + f4 . g e t A p e l l i d o s() + " - " + f4 . i n t e g r a n t e s C o n P a s a t i e m p o( " Futbol " )); // Ahora m o s t r a m o s la cantidad de mujeres que les gusta leer por cada // familia Usuario . m e n s a j e C o n s o l a( " Mujeres que les gusta leer Familia : " + f1 . g e t A p e l l i d o s() + " - " + f1 . i n t e g r a n t e s C o n P a s a t i e m p o P o r G e n e r o( " Leer " , 1)); Usuario . m e n s a j e C o n s o l a( " Mujeres que les gusta leer Familia : " + f2 . g e t A p e l l i d o s() + " - " + f2 . i n t e g r a n t e s C o n P a s a t i e m p o P o r G e n e r o( " Leer " , 1)); Usuario . m e n s a j e C o n s o l a( " Mujeres que les gusta leer Familia : " + f3 . g e t A p e l l i d o s() + " - " + f3 . i n t e g r a n t e s C o n P a s a t i e m p o P o r G e n e r o( " Leer " , 1)); Usuario . m e n s a j e C o n s o l a( " Mujeres que les gusta leer Familia : " + f4 . g e t A p e l l i d o s() + " - " + f4 . i n t e g r a n t e s C o n P a s a t i e m p o P o r G e n e r o( " Leer " , 1)); } }
Criterios de soluci on Clase Persona Atributos: Declaramos los atributos necesarios seg un nos indican en el enunciado: dos String, uno para el nombre y otro para los pasatiempos y dos enteros, uno para representar la edad y otro para representar el g enero. Constructor: Lo declaramos seg un el uso mostrado en la clase Principal. Recibe como par ametros el nombre, la edad y el genero y los asigna a los atributos correspondientes. M etodo agragarPasatiempo: Lo declaramos seg un el uso mostrado en la clase Principal. Recibe como par ametro un String con el hobbie a agregar y tenemos que concatenarlo al String que almacena los pasatiempos. Getters: Seg un el uso dado en la clase Principal necesitamos 3 m etodos get para obtener el nombre, la edad y el g enero. M etodo tienePasatiempo: Este m etodo sirve para revisar si la persona tiene un determinado pasatiempo (para cumplir con lo pedido en el incremento 3), puede hacerse tambi en s olo en la clase Familia. Lo que hacemos es buscar el pasatiempo generando todos los substrings desde la lista de pasatiempos que tengan el mismo largo que el pasatiempo recibido y comparar hasta encontrar alguna coincidencia. M etodo mostrar: Revisamos el g enero de la persona y seg un eso mostramos en Consola su edad seguida de Hombre o Mujer seg un corresponda. IIC1103 Cap tulo 5: Strings 36
Clase Familia: Atributos: Declaramos los atributos necesarios seg un lo que se nos indica en el enunciado: un String para guardar los apellidos y cuatro objetos de la clase Persona que representen a los integrantes. Constructor: Lo declaramos seg un el uso mostrado en la clase Principal. Recibe como par ametro un String con los apellidos y lo asigna al atributo correspondiente. M etodo agregarIntegrante: Lo declaramos seg un el uso mostrado en la clase Principal. Recibe como par ametro un objeto de la clase Persona. Tenemos que revisar a qu e objeto, de los 4 que tenemos como atributos, debemos asignarlo, revisando cu al de ellos es todav a null. Retornamos true o false seg un se pudo o no asignar el integrante. M etodo promedioEdad: Recorremos todas las personas y obtenemos su edad (cuidando que el integrante no sea null) calculando con esto el promedio. M etodo mostrarFamilia: Mostramos en la consola los apellidos de la familia y por cada persona mostramos su edad y si es hombre o mujer. M etodo integrantesConPasatiempo: Para no implementar un m etodo dos veces simplemente llamamos al m etodo integrantesConPasatiempoPorGenero deniendo un valor inv alido para el g enero. M etodo integrantesConPasatiempoPorGenero: Recorremos todas las personas y en cada una revisamos que no sea nula y que tenga el pasatiempo solicitado (llamando al m etodo que implementamos en la clase Persona). Adem as, en caso que el g enero sea v alido, tambi en revisamos que el genero de la persona corresponda. Si se cumplen ambas condiciones aumentamos el contador de personas, el cual retornamos al nalizar el m etodo. Posible soluci on
import i i c 1 1 0 3 P a c k a g e .*; public class Familia { // D e f i n i m o s los a t r i b u t o s n e c e s a r i o s private String a p e l l i d o s; // D e f i n i m o s las personas que pueden integrar la familia private Persona i n t e g r a n t e 1; private Persona i n t e g r a n t e 2; private Persona i n t e g r a n t e 3; private Persona i n t e g r a n t e 4; private Persona i n t e g r a n t e 5; public Familia ( String a p e l l i d o s) { this . a p e l l i d o s = a p e l l i d o s; } public Persona o b t e n e r P e r s o n a( int idx ) { // O b t e n e m o s la persona segun el indice de ella if ( idx == 0) return i n t e g r a n t e 1; else if ( idx == 1) return i n t e g r a n t e 2; else if ( idx == 2) return i n t e g r a n t e 3; else if ( idx == 3) return i n t e g r a n t e 4; else return i n t e g r a n t e 5; } public boolean a g r e g a r I n t e g r a n t e( Persona p ) { // Para agregar un nuevo i n t e g r a n t e buscamos aquel que aun sea nulo if ( i n t e g r a n t e 1 == null ) { integrante1 = p; } else if ( i n t e g r a n t e 2 == null ) { integrante2 = p;
37
} else if ( i n t e g r a n t e 3 integrante3 = p; } else if ( i n t e g r a n t e 4 integrante4 = p; } else if ( i n t e g r a n t e 5 integrante5 = p; } else { // Si no hay ninguno return false ; } return true ; }
public double p r o m e d i o E d a d () { // D e c l a r a m o s una variable donde a c u m u l a r e m o s double promedio = 0; int count = 0; // R e c o r r e m o s todas las personas for ( int i = 0; i < 5; i ++) { Persona p = o b t e n e r P e r s o n a( i ); if ( p != null ) { // En caso de estar la persona a c u m u l a m o s su edad promedio += p . getEdad (); count ++; } } return promedio / count ; } public int i n t e g r a n t e s C o n P a s a t i e m p o( String hobbie ) { // Llamamos al metodo que busca con genero d e f i n i e n d o un valor invalido // para el genero return i n t e g r a n t e s C o n P a s a t i e m p o P o r G e n e r o( hobbie , -1); } public int i n t e g r a n t e s C o n P a s a t i e m p o P o r G e n e r o( String hobbie , int genero ) { int count = 0; // R e c o r r e m o s todas las personas for ( int i = 0; i < 5; i ++) { Persona p = o b t e n e r P e r s o n a( i ); // R e v i s a m o s que no sea nula y que tenga el p a s a t i e m p o s o l i c i t a d o. // Ademas en caso de que el // genero sea valido tambien r e s t r i n g i m o s por el if ( p != null && p . t i e n e P a s a t i e m p o( hobbie ) && ( genero == -1 || p . g e t G e n e r o() == genero )) count ++; } return count ; } public void m o s t r a r F a m i l i a () { // M o s t r a m o s los a p e l l i d o s y luego a cada una de las personas Usuario . m e n s a j e C o n s o l a( " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " ); Usuario . m e n s a j e C o n s o l a( " Familia : " + a p e l l i d o s); for ( int i = 0; i < 5; i ++) { Persona p = o b t e n e r P e r s o n a( i ); if ( p != null ) { p . mostrar (); } } Usuario . m e n s a j e C o n s o l a( " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " ); } public String g e t A p e l l i d o s () { return a p e l l i d o s; } } import i i c 1 1 0 3 P a c k a g e .*; public class Persona { // D e f i n i m o s los a t r i b u t o s minimos n e c e s a r i o s private String nombre ; private int edad ; private int genero ; private String p a s a t i e m p o s;
38
public Persona ( String nombre , int edad , int genero ) { // I n i c i a l i z a m o s los valores para la persona , en un p r i n c i p i o no tiene // p a s a t i e m p o s this . nombre = nombre ; this . edad = edad ; this . genero = genero ; this . p a s a t i e m p o s = " " ; } public void a g r e g a r P a s a t i e m p o( String hobbie ) { // Al agregar un p a s a t i e m p o lo a g r e g a m o s al String que los r e p r e s e n t a p a s a t i e m p o s += " - " + hobbie ; } public String g e t N o m b r e() { return nombre ; } public int getEdad () { return edad ; } public int g e t G e n e r o() { return genero ; } public boolean t i e n e P a s a t i e m p o( String hobbie ) { // Buscamos el p a s a t i e m p o g e n e r a n d o todos los s u b s t r i n g s desde la lista // de p a s a t i e m p o s que tengan el mismo largo que el p a s a t i e m p o recibido for ( int i = 0; i <= p a s a t i e m p o s. length () - hobbie . length (); i ++) { String aux = p a s a t i e m p o s. s u b s t r i n g(i , i + hobbie . length ()); if ( aux . e q u a l s I g n o r e C a s e( hobbie )) { return true ; } } return false ; } public void mostrar () { if ( genero == 0) { Usuario . m e n s a j e C o n s o l a( nombre + " ( " + edad + " - Hombre ) " ); } else { Usuario . m e n s a j e C o n s o l a( nombre + " ( " + edad + " - Mujer ) " ); } } }
39
40
import i i c 1 1 0 3 P a c k a g e .*; public class P r i n c i p a l { public static void main ( String [] args ) { /* * I n c r e m e n t o 1 */ // Creamos marcas y a g r e g a m o s modelos con d i s t i n t a s c a r a c t e r i s t i c a s Marca marca1 = new Marca ( " Hyundai " ); Modelo modelo11 = new Modelo ( " Accent " , 2008 , 0); modelo11 . a g r e g a r C a r a c t e r i s t i c a( " Llantas " ); modelo11 . a g r e g a r C a r a c t e r i s t i c a( " A l z a v i d r i o s E l e c t r i c o s" ); modelo11 . a g r e g a r C a r a c t e r i s t i c a( " Radio CD " ); modelo11 . a g r e g a r C a r a c t e r i s t i c a( " Mecanico " ); modelo11 . a g r e g a r C a r a c t e r i s t i c a( " Aire A c o n d i c i o n a d o" ); Modelo modelo21 = new Modelo ( " Sonata " , 2007 , 0); modelo21 . a g r e g a r C a r a c t e r i s t i c a( " Aire A c o n d i c i o n a d o" ); modelo21 . a g r e g a r C a r a c t e r i s t i c a( " A u t o m a t i c o" ); modelo21 . a g r e g a r C a r a c t e r i s t i c a( " N e b l i n e r o s" ); modelo21 . a g r e g a r C a r a c t e r i s t i c a( " A l z a v i d r i o s E l e c t r i c o s" ); modelo21 . a g r e g a r C a r a c t e r i s t i c a( " Radio CD " ); modelo21 . a g r e g a r C a r a c t e r i s t i c a( " Alarma " ); modelo21 . a g r e g a r C a r a c t e r i s t i c a( " Tapiz de cuero " ); modelo21 . a g r e g a r C a r a c t e r i s t i c a( " Air Bag " ); modelo21 . a g r e g a r C a r a c t e r i s t i c a( " D i r e c c i o n Asistida " ); Modelo modelo31 = new Modelo ( "H -1 " , 2005 , 1); modelo31 . a g r e g a r C a r a c t e r i s t i c a( " Alarma " ); modelo31 . a g r e g a r C a r a c t e r i s t i c a( " Mecanico " ); modelo31 . a g r e g a r C a r a c t e r i s t i c a( " Radio CD " ); modelo31 . a g r e g a r C a r a c t e r i s t i c a( " D i r e c c i o n Asistida " ); marca1 . a g r e g a r M o d e l o( modelo11 ); marca1 . a g r e g a r M o d e l o( modelo21 ); marca1 . a g r e g a r M o d e l o( modelo31 ); Marca marca2 = new Marca ( " Toyota " ); Modelo modelo12 = new Modelo ( " Hilux " , 2008 , 2); modelo12 . a g r e g a r C a r a c t e r i s t i c a( " 4 x4 " ); modelo12 . a g r e g a r C a r a c t e r i s t i c a( " Llantas " ); modelo12 . a g r e g a r C a r a c t e r i s t i c a( " Radio CD " ); modelo12 . a g r e g a r C a r a c t e r i s t i c a( " Mecanico " ); modelo12 . a g r e g a r C a r a c t e r i s t i c a( " N e b l i n e r o s" ); modelo12 . a g r e g a r C a r a c t e r i s t i c a( " D i r e c c i o n Asistida " ); modelo12 . a g r e g a r C a r a c t e r i s t i c a( " Aire A c o n d i c i o n a d o" ); modelo12 . a g r e g a r C a r a c t e r i s t i c a( " Air Bag " ); Modelo modelo22 = new Modelo ( " Yaris " , 2007 , 0); modelo22 . a g r e g a r C a r a c t e r i s t i c a( " Alarma " ); modelo22 . a g r e g a r C a r a c t e r i s t i c a( " Aire A c o n d i c i o n a d o" ); modelo22 . a g r e g a r C a r a c t e r i s t i c a( " Radio CD " ); modelo22 . a g r e g a r C a r a c t e r i s t i c a( " Mecanico " ); modelo22 . a g r e g a r C a r a c t e r i s t i c a( " A l z a v i d r i o s E l e c t r i c o s" ); modelo22 . a g r e g a r C a r a c t e r i s t i c a( " D i r e c c i o n Asistida " ); Modelo modelo32 = new Modelo ( " Auris " , 2008 , 1); modelo32 . a g r e g a r C a r a c t e r i s t i c a( " N e b l i n e r o s" ); modelo32 . a g r e g a r C a r a c t e r i s t i c a( " A l z a v i d r i o s E l e c t r i c o s" ); modelo32 . a g r e g a r C a r a c t e r i s t i c a( " Air Bag " ); modelo32 . a g r e g a r C a r a c t e r i s t i c a( " A u t o m a t i c o" ); modelo32 . a g r e g a r C a r a c t e r i s t i c a( " Radio CD " ); Modelo modelo42 = new Modelo ( " Corolla " , 2006 , 0); modelo42 . a g r e g a r C a r a c t e r i s t i c a( " Radio CD " ); modelo42 . a g r e g a r C a r a c t e r i s t i c a( " Alarma " ); modelo42 . a g r e g a r C a r a c t e r i s t i c a( " A u t o m a t i c o" ); modelo42 . a g r e g a r C a r a c t e r i s t i c a( " Tapiz de cuero " ); modelo42 . a g r e g a r C a r a c t e r i s t i c a( " A l z a v i d r i o s E l e c t r i c o s" ); modelo42 . a g r e g a r C a r a c t e r i s t i c a( " Aire A c o n d i c i o n a d o" ); modelo42 . a g r e g a r C a r a c t e r i s t i c a( " N e b l i n e r o s" ); modelo42 . a g r e g a r C a r a c t e r i s t i c a( " Air Bag " ); modelo42 . a g r e g a r C a r a c t e r i s t i c a( " D i r e c c i o n Asistida " ); Modelo modelo52 = new Modelo ( " Yaris Sport " , 2008 , 1); modelo52 . a g r e g a r C a r a c t e r i s t i c a( " Radio CD " ); modelo52 . a g r e g a r C a r a c t e r i s t i c a( " A l z a v i d r i o s E l e c t r i c o s" ); marca2 . a g r e g a r M o d e l o( modelo12 ); marca2 . a g r e g a r M o d e l o( modelo22 ); marca2 . a g r e g a r M o d e l o( modelo32 ); marca2 . a g r e g a r M o d e l o( modelo42 ); if (! marca2 . a g r e g a r M o d e l o( modelo52 )) { Usuario . m e n s a j e C o n s o l a( " No se pudo agregar el modelo " + modelo52 . g e t M o d e l o() + " a la marca " + marca2 . g e t N o m b r e ());
41
} Marca marca3 = new Marca ( " Mercedes Benz " ); Modelo modelo13 = new Modelo ( " C 200 K " , 2008 , 1); modelo13 . a g r e g a r C a r a c t e r i s t i c a( " Llantas " ); modelo13 . a g r e g a r C a r a c t e r i s t i c a( " Radio CD " ); modelo13 . a g r e g a r C a r a c t e r i s t i c a( " A l z a v i d r i o s E l e c t r i c o s" ); modelo13 . a g r e g a r C a r a c t e r i s t i c a( " A u t o m a t i c o" ); modelo13 . a g r e g a r C a r a c t e r i s t i c a( " N e b l i n e r o s" ); modelo13 . a g r e g a r C a r a c t e r i s t i c a( " Alarma " ); modelo13 . a g r e g a r C a r a c t e r i s t i c a( " Tapiz de cuero " ); modelo13 . a g r e g a r C a r a c t e r i s t i c a( " Air Bag " ); modelo13 . a g r e g a r C a r a c t e r i s t i c a( " D i r e c c i o n Asistida " ); modelo13 . a g r e g a r C a r a c t e r i s t i c a( " Aire A c o n d i c i o n a d o" ); Modelo modelo23 = new Modelo ( " CLK 500 " , 2008 , 2); modelo23 . a g r e g a r C a r a c t e r i s t i c a( " Mecanico " ); modelo23 . a g r e g a r C a r a c t e r i s t i c a( " Alarma " ); modelo23 . a g r e g a r C a r a c t e r i s t i c a( " Air Bag " ); modelo23 . a g r e g a r C a r a c t e r i s t i c a( " A l z a v i d r i o s E l e t r i c o s" ); modelo23 . a g r e g a r C a r a c t e r i s t i c a( " N e b l i n e r o s" ); modelo23 . a g r e g a r C a r a c t e r i s t i c a( " Llantas " ); modelo23 . a g r e g a r C a r a c t e r i s t i c a( " D i r e c c i o n Asistida " ); modelo23 . a g r e g a r C a r a c t e r i s t i c a( " 4 x4 " ); modelo23 . a g r e g a r C a r a c t e r i s t i c a( " Radio CD " ); modelo23 . a g r e g a r C a r a c t e r i s t i c a( " Aire A c o n d i c i o n a d o" ); marca3 . a g r e g a r M o d e l o( modelo13 ); marca3 . a g r e g a r M o d e l o( modelo23 ); /* * I n c r e m e n t o 2 */ // M o s t r a m o s el catalogo completo de cada marca marca1 . i m p r i m i r C a t a l o g o (0); marca2 . i m p r i m i r C a t a l o g o (0); marca3 . i m p r i m i r C a t a l o g o (0); Usuario . m e n s a j e C o n s o l a( " " ); // M o s t r a m o s la cantidad de modelos del anio 2008 que oferta cada Usuario . m e n s a j e C o n s o l a( " La marca " + marca1 . g e t N o m b r e() + " tiene + marca1 . a u t o s D e l A n i o (2008) + " modelos anio 2008 en su catalogo . " ); Usuario . m e n s a j e C o n s o l a( " La marca " + marca2 . g e t N o m b r e() + " tiene + marca2 . a u t o s D e l A n i o (2008) + " modelos anio 2008 en su catalogo . " ); Usuario . m e n s a j e C o n s o l a( " La marca " + marca3 . g e t N o m b r e() + " tiene + marca3 . a u t o s D e l A n i o (2008) + " modelos anio 2008 en su catalogo . " ); marca " " "
/* * I n c r e m e n t o 3 */ // M o s t r a m o s el catalogo de cada marca solo con los modelos del anio // p r e f e r i d o int anio = Usuario . entero (" Ingrese el anio para el que desea revisar los modelos : " ); marca1 . i m p r i m i r C a t a l o g o( anio ); marca2 . i m p r i m i r C a t a l o g o( anio ); marca3 . i m p r i m i r C a t a l o g o( anio ); Usuario . m e n s a j e C o n s o l a( " " ); // Ahora m o s t r a m o s la cantidad de autos que tienen aire a c o n d i c i o n a d o Usuario . m e n s a j e C o n s o l a( " La marca " + marca1 . g e t N o m b r e() + " tiene " + marca1 . m o d e l o s C o n C a r a c t e r i s t i c a( " Aire a c o n d i c i o n a d o" ) + " modelos de a u t o m o v i l e s con aire a c o n d i c i o n a d o en su catalogo . " ); Usuario . m e n s a j e C o n s o l a( " La marca " + marca2 . g e t N o m b r e() + " tiene " + marca2 . m o d e l o s C o n C a r a c t e r i s t i c a( " Aire a c o n d i c i o n a d o" ) + " modelos de a u t o m o v i l e s con aire a c o n d i c i o n a d o en su catalogo . " ); Usuario . m e n s a j e C o n s o l a( " La marca " + marca3 . g e t N o m b r e() + " tiene " + marca3 . m o d e l o s C o n C a r a c t e r i s t i c a( " Aire a c o n d i c i o n a d o" ) + " modelos de a u t o m o v i l e s con aire a c o n d i c i o n a d o en su catalogo .\ n " ); // F i n a l m e n t e m o s t r a m o s la cantidad de autos tipo sedan que tienen aire // a c o n d i c i o n a d o Usuario . m e n s a j e C o n s o l a( " La marca " + marca1 . g e t N o m b r e() + " tiene " + marca1 . m o d e l o s C o n C a r a c t e r i s t i c a P o r T i p o( " Aire a c o n d i c i o n a d o" , 0)
42
+ " modelos de a u t o m o v i l e s tipo sedan con aire a c o n d i c i o n a d o en Usuario . m e n s a j e C o n s o l a( " La marca " + marca2 . g e t N o m b r e() + " tiene " marca2 . m o d e l o s C o n C a r a c t e r i s t i c a P o r T i p o( " Aire a c o n d i c i o n a d o" , 0) + " modelos de a u t o m o v i l e s tipo sedan con aire a c o n d i c i o n a d o en Usuario . m e n s a j e C o n s o l a( " La marca " + marca3 . g e t N o m b r e() + " tiene " + marca3 . m o d e l o s C o n C a r a c t e r i s t i c a P o r T i p o( " Aire a c o n d i c i o n a d o" , + " modelos de a u t o m o v i l e s tipo sedan con aire a c o n d i c i o n a d o en } }
Criterios de soluci on Clase Modelo Atributos: Declaramos los atributos necesarios seg un nos indican en el enunciado: dos String, uno para el nombre y otro para las caracter sticas y dos enteros, uno para representar el a no y otro para representar el tipo (camioneta, sed an, etc) Constructor: Lo declaramos seg un el uso mostrado en la clase Principal. Recibe como par ametros el nombre, el a no y el tipo y los asigna a los atributos correspondientes. M etodo agragarCaracteristica: Lo declaramos seg un el uso mostrado en la clase Principal. Recibe como par ametro un String con la caracter stica a agregar y tenemos que concatenarlo al String que almacena las caracter sticas. Getters: Seg un el uso dado en la clase Principal necesitamos 3 m etodos get para obtener el nombre del modelo, el a no y el tipo. M etodo tieneCaracteristica: Este m etodo sirve para revisar si el modelo tiene una determinada caracter stica (para cumplir con lo pedido en el incremento 3), puede hacerse tambi en s olo en la clase Marca. Lo que hacemos es buscar la caracter stica generando todos los substrings desde la lista de caracter sticas que tengan el mismo largo que la caracter stica recibida y comparar hasta encontrar alguna coincidencia. M etodo mostrar: Revisamos el tipo y seg un eso mostramos en Consola el nombre del modelo, su a no seguido de Sed an, Station Wagon o Camioneta, seg un corresponda. Clase Marca: Atributos: Declaramos los atributos necesarios seg un lo que se nos indica en el enunciado: un String para guardar el nombre y cuatro objetos de la clase Modelo que representen a los modelos de auto que tiene la Marca. Constructor: Lo declaramos seg un el uso mostrado en la clase Principal. Recibe como par ametro un String con el nombre de la marca y lo asigna al atributo correspondiente. M etodo agregarModelo: Lo declaramos seg un el uso mostrado en la clase Principal. Recibe como par ametro un objeto de la clase Modelo. Tenemos que revisar a qu e objeto, de los 4 que tenemos como atributos, debemos asignarlo, revisando cu al de ellos es todav a null. Retornamos true o false seg un se pudo o no asignar el modelo. M etodo getNombre: Retorna el nombre de la marca. M etodo autosDelAnio: Recorremos todos los modelos y obtenemos su a no (cuidando que el objeto no sea null) y lo comparamos con el a no recibido como par ametro. Retornamos el n umero de veces que la comparaci on fue exitosa. M etodo imprimirCatalogo: Mostramos en la consola el nombre de la marca y el n umero de autos del a no (seg un el par ametro recibido) llamando al m etodo autosDelAnio. Luego, por cada Modelo llamamos al m etodo que muestra su nombre y su tipo. M etodo modelosConCaracteristica: Para no implementar un m etodo dos veces simplemente llamamos al m etodo modelosConCaracteristicaPorTipo deniendo un valor inv alido para el tipo. IIC1103 Cap tulo 5: Strings 43
M etodo modelosConCaracteristicaPorTipo: Recorremos todos los modelos y en cada uno revisamos que no sea nulo y que tenga la caracter stica solicitada (llamando al m etodo que implementamos en la clase Modelo). Adem as, en caso que el tipo sea v alido, tambi en revisamos que el tipo del modelo corresponda. Si se cumplen ambas condiciones aumentamos el contador de modelos, el cual retornamos al nalizar el m etodo. Posible soluci on
import i i c 1 1 0 3 P a c k a g e .*; public class Marca { // D e f i n i m o s los a t r i b u t o s n e c e s a r i o s private String nombre ; // D e f i n i m o s los modelos de auto que tiene la Marca private Modelo modelo0 ; private Modelo modelo1 ; private Modelo modelo2 ; private Modelo modelo3 ; public Marca ( String nombre ) { this . nombre = nombre ; } public Modelo o b t e n e r M o d e l o( int indice ) { // O b t e n e m o s el modelo segun su indice if ( indice == 0) { return modelo0 ; } else if ( indice == 1) { return modelo1 ; } else if ( indice == 2) { return modelo2 ; } else { return modelo3 ; } } public boolean a g r e g a r M o d e l o( Modelo modelo ) { // Para agregar una nueva marca , buscamos el primero de los a t r i b u t o s // que aun sea nulo if ( modelo0 == null ) { modelo0 = modelo ; } else if ( modelo1 == null ) { modelo1 = modelo ; } else if ( modelo2 == null ) { modelo2 = modelo ; } else if ( modelo3 == null ) { modelo3 = modelo ; } else { // Si no hay ninguno vacio entonces r e t o r n a m o s false return false ; } return true ; } public int a u t o s D e l A n i o( int anio ) { // D e c l a r a m o s una variable para contar , y r e c o r r e m o s los modelos // buscando aquellos que c o i n c i d a n con el anio int contador = 0; for ( int i = 0; i < 4; i ++) { Modelo modelo = o b t e n e r M o d e l o( i ); if ( modelo != null && modelo . getAnio () == anio ) { contador ++; } } return contador ; } public int m o d e l o s C o n C a r a c t e r i s t i c a( String c a r a c t e r i s t i c a) { // Llamamos al metodo que busca tambien por tipo de auto , d e f i n i e n d o un // valor invalido para dicho p a r a m e t r o return m o d e l o s C o n C a r a c t e r i s t i c a P o r T i p o( caracteristica , -1); }
44
public int m o d e l o s C o n C a r a c t e r i s t i c a P o r T i p o( String caracteristica , int tipo ) { // R e c o r r e m o s todos los modelos de la marca , r e v i s a n d o que no sean nulos // y que tengan la c a r a c t e r i s t i c a solicitada , // r e s t r i n g i e n d o ademas por el tipo de auto en caso de que el p a r a m e t r o // c o r r e s p o n d i e n t e sea valido , y los contamos int contador = 0; for ( int i = 0; i < 4; i ++) { Modelo modelo = o b t e n e r M o d e l o( i ); if ( modelo != null && modelo . t i e n e C a r a c t e r i s t i c a( c a r a c t e r i s t i c a) && ( tipo == -1 || modelo . getTipo () == tipo )) { contador ++; } } return contador ; } public void i m p r i m i r C a t a l o g o( int anio ) { Usuario . m e n s a j e C o n s o l a( " \ n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " ); Usuario . m e n s a j e C o n s o l a( " Marca : " + nombre ); if ( anio != 0) { Usuario . m e n s a j e C o n s o l a( " El catalogo presenta " + a u t o s D e l A n i o( anio ) + " modelos del anio " + anio + " : " ); } for ( int i = 0; i < 4; i ++) { Modelo modelo = o b t e n e r M o d e l o( i ); if ( modelo != null && ( anio == 0 || modelo . getAnio () == anio )) { modelo . mostrar (); } } Usuario . m e n s a j e C o n s o l a( " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " ); } public String g e t N o m b r e() { return nombre ; } } import i i c 1 1 0 3 P a c k a g e .*; public class Modelo { // D e f i n i m o s los a t r i b u t o s minimos n e c e s a r i o s private String nombre ; private int anio ; private int tipo ; private String c a r a c t e r i s t i c a s; public Modelo ( String modelo , int anio , int tipo ) { // I n i c i a l i z a m o s los valores para el auto this . nombre = modelo ; this . anio = anio ; this . tipo = tipo ; this . c a r a c t e r i s t i c a s = " " ; } public void a g r e g a r C a r a c t e r i s t i c a( String c a r a c t e r i s t i c a) { // A g r e g a m o s la c a r a c t e r i s t i c a al atributo ( String ) c o r r e s p o n d i e n t e c a r a c t e r i s t i c a s += " - " + c a r a c t e r i s t i c a; } public boolean t i e n e C a r a c t e r i s t i c a( String c a r a c t e r i s t i c a) { // Buscamos c a r a c t e r i s t i c a g e n e r a n d o todos los s u b s t r i n g s desde el // atributo c o r r e s p o n d i e n t e // que tengan el mismo largo que la c a r a c t e r i s t i c a en el p a r a m e t r o for ( int i = 0; i <= c a r a c t e r i s t i c a s. length () - c a r a c t e r i s t i c a. length (); i ++) { String aux = c a r a c t e r i s t i c a s. s u b s t r i n g(i , i + c a r a c t e r i s t i c a. le ngth ()); if ( aux . e q u a l s I g n o r e C a s e( c a r a c t e r i s t i c a)) { return true ; } } return false ; } public void mostrar () { if ( tipo == 0) { Usuario . m e n s a j e C o n s o l a( " \ t " + nombre + " , " + anio + " , Sedan " ); } else if ( tipo == 1) {
45
Usuario . m e n s a j e C o n s o l a( " \ t " + nombre + " , " + anio + " , Station Wagon " ); } else { Usuario . m e n s a j e C o n s o l a( " \ t " + nombre + " , " + anio + " , C a m i o n e t a" ); } } public String g e t M o d e l o() { return nombre ; } public int getAnio () { return anio ; } public int getTipo () { return tipo ; } }
46
47
import i i c 1 1 0 3 P a c k a g e .*; public class P r i n c i p a l { public static void main ( String [] args ) { /* * I n c r e m e n t o 1 */ // Creamos los r e s t a u r a n t e s y a g r e g a m o s platos con d i s t i n t o s // i n g r e d i e n t e s R e s t a u r a n t r1 = new R e s t a u r a n t( " Italia Nostra " ); Plato plato11 = new Plato (" E s p a g u e t i a la c a r b o n a r a" , 3890 , 1); plato11 . a g r e g a r I n g r e d i e n t e( " e s p a g u e t i" ); plato11 . a g r e g a r I n g r e d i e n t e( " tocino " ); plato11 . a g r e g a r I n g r e d i e n t e( " aceite de oliva " ); plato11 . a g r e g a r I n g r e d i e n t e( " huevo " ); plato11 . a g r e g a r I n g r e d i e n t e( " queso p a r m e s a n o" ); plato11 . a g r e g a r I n g r e d i e n t e( " ajo " ); Plato plato21 = new Plato (" Ravioli " , 4980 , 1); plato21 . a g r e g a r I n g r e d i e n t e( " raviolis " ); plato21 . a g r e g a r I n g r e d i e n t e( " queso ricotta " ); plato21 . a g r e g a r I n g r e d i e n t e( " perejil fresco " ); plato21 . a g r e g a r I n g r e d i e n t e( " huevo " ); Plato plato31 = new Plato (" M a c a r o n e s con jamon " , 4550 , 1); plato31 . a g r e g a r I n g r e d i e n t e( " m a c a r o n e s" ); plato31 . a g r e g a r I n g r e d i e n t e( " crema " ); plato31 . a g r e g a r I n g r e d i e n t e( " jamon cocido " ); plato31 . a g r e g a r I n g r e d i e n t e( " queso p a r m e s a n o" ); Plato plato41 = new Plato (" Gnoquis con Salsa B o l o n i e s a" , 3200 , 1); plato41 . a g r e g a r I n g r e d i e n t e( " carne " ); plato41 . a g r e g a r I n g r e d i e n t e( " Gnoquis " ); plato41 . a g r e g a r I n g r e d i e n t e( " z a n a h o r i a" ); plato41 . a g r e g a r I n g r e d i e n t e( " tomate " ); plato41 . a g r e g a r I n g r e d i e n t e( " aceite de oliva " ); Plato plato51 = new Plato (" C i a l d e l l a pullese " , 2950 , 0); plato51 . a g r e g a r I n g r e d i e n t e( " tomate " ); plato51 . a g r e g a r I n g r e d i e n t e( " aceite de oliva " ); plato51 . a g r e g a r I n g r e d i e n t e( " tostadas i n t e g r a l e s" ); r1 . a g r e g a r P l a t o( plato11 ); r1 . a g r e g a r P l a t o( plato21 ); r1 . a g r e g a r P l a t o( plato31 ); r1 . a g r e g a r P l a t o( plato41 ); r1 . a g r e g a r P l a t o( plato51 ); R e s t a u r a n t r2 = new R e s t a u r a n t( " Mexico Lindo " ); Plato plato12 = new Plato (" Papas rellenas " , 4600 , 1); plato12 . a g r e g a r I n g r e d i e n t e( " papas " ); plato12 . a g r e g a r I n g r e d i e n t e( " huevo " ); plato12 . a g r e g a r I n g r e d i e n t e( " queso " ); plato12 . a g r e g a r I n g r e d i e n t e( " jamon " ); Plato plato22 = new Plato (" Tortilla de verduras " , 3130 , 0); plato22 . a g r e g a r I n g r e d i e n t e( " pollo " ); plato22 . a g r e g a r I n g r e d i e n t e( " pimenton " ); plato22 . a g r e g a r I n g r e d i e n t e( " queso " ); plato22 . a g r e g a r I n g r e d i e n t e( " c h a m p i n i o n e s" ); plato22 . a g r e g a r I n g r e d i e n t e( " cebolla " ); Plato plato32 = new Plato (" Carne a la crema " , 4200 , 1); plato32 . a g r e g a r I n g r e d i e n t e( " carne " ); plato32 . a g r e g a r I n g r e d i e n t e( " crema " ); plato32 . a g r e g a r I n g r e d i e n t e( " leche " ); plato32 . a g r e g a r I n g r e d i e n t e( " perejil " ); plato32 . a g r e g a r I n g r e d i e n t e( " ajo " ); plato32 . a g r e g a r I n g r e d i e n t e( " oregano " ); plato32 . a g r e g a r I n g r e d i e n t e( " aceite de oliva " ); Plato plato42 = new Plato (" Pastel azteca " , 4600 , 1); plato42 . a g r e g a r I n g r e d i e n t e( " pollo " ); plato42 . a g r e g a r I n g r e d i e n t e( " tomate " ); plato42 . a g r e g a r I n g r e d i e n t e( " aceite de oliva " ); plato42 . a g r e g a r I n g r e d i e n t e( " queso p a r m e s a n o" ); plato42 . a g r e g a r I n g r e d i e n t e( " cebolla " ); plato42 . a g r e g a r I n g r e d i e n t e( " aji " ); plato42 . a g r e g a r I n g r e d i e n t e( " harina de maiz " ); Plato plato52 = new Plato (" Tacos poblanos " , 3590 , 0); plato52 . a g r e g a r I n g r e d i e n t e( " tomate " ); plato52 . a g r e g a r I n g r e d i e n t e( " huevo " ); plato52 . a g r e g a r I n g r e d i e n t e( " chorizo " ); plato52 . a g r e g a r I n g r e d i e n t e( " carne " ); plato52 . a g r e g a r I n g r e d i e n t e( " queso " ); plato52 . a g r e g a r I n g r e d i e n t e( " aji " );
48
plato52 . a g r e g a r I n g r e d i e n t e( " cebolla " ); Plato plato62 = new Plato (" Sopa mexicana " , 2990 , 1); plato62 . a g r e g a r I n g r e d i e n t e( " pollo " ); plato62 . a g r e g a r I n g r e d i e n t e( " porotos " ); plato62 . a g r e g a r I n g r e d i e n t e( " tomate " ); plato62 . a g r e g a r I n g r e d i e n t e( " ajo " ); r2 . a g r e g a r P l a t o( plato12 ); r2 . a g r e g a r P l a t o( plato22 ); r2 . a g r e g a r P l a t o( plato32 ); r2 . a g r e g a r P l a t o( plato42 ); r2 . a g r e g a r P l a t o( plato52 ); if (! r2 . a g r e g a r P l a t o( plato62 )) { Usuario . m e n s a j e C o n s o l a( " No se pudo agregar el plato \" " + plato52 . g e t N o m b r e() + " \" al R e s t a u r a n t \" " + r2 . g e t N o m b r e() + " \" " ); } R e s t a u r a n t r3 = new R e s t a u r a n t( " Hariko Kimasi " ); Plato plato13 = new Plato (" Sushi con c a m a r o n e s" , 4990 , 0); plato13 . a g r e g a r I n g r e d i e n t e( " arroz " ); plato13 . a g r e g a r I n g r e d i e n t e( " c a m a r o n e s" ); plato13 . a g r e g a r I n g r e d i e n t e( " pimienta " ); plato13 . a g r e g a r I n g r e d i e n t e( " vinagre " ); plato13 . a g r e g a r I n g r e d i e n t e( " limon " ); Plato plato23 = new Plato (" Ensalada Japonesa " , 4600 , 0); plato23 . a g r e g a r I n g r e d i e n t e( " e s p a r r a g o s" ); plato23 . a g r e g a r I n g r e d i e n t e( " rabanos " ); plato23 . a g r e g a r I n g r e d i e n t e( " carne " ); plato23 . a g r e g a r I n g r e d i e n t e( " coliflor " ); plato23 . a g r e g a r I n g r e d i e n t e( " pimenton " ); r3 . a g r e g a r P l a t o( plato13 ); r3 . a g r e g a r P l a t o( plato23 ); R e s t a u r a n t r4 = new R e s t a u r a n t( " Donia Juanita " ); Plato plato14 = new Plato (" Pastel de Choclo " , 3500 , 1); plato14 . a g r e g a r I n g r e d i e n t e( " choclo " ); plato14 . a g r e g a r I n g r e d i e n t e( " carne " ); plato14 . a g r e g a r I n g r e d i e n t e( " cebolla " ); plato14 . a g r e g a r I n g r e d i e n t e( " pollo " ); plato14 . a g r e g a r I n g r e d i e n t e( " leche " ); plato14 . a g r e g a r I n g r e d i e n t e( " a c e i t u n a s" ); Plato plato24 = new Plato (" Cazuela de Vacuno " , 4550 , 1); plato24 . a g r e g a r I n g r e d i e n t e( " carne " ); plato24 . a g r e g a r I n g r e d i e n t e( " papa " ); plato24 . a g r e g a r I n g r e d i e n t e( " zapallo " ); plato24 . a g r e g a r I n g r e d i e n t e( " z a n a h o r i a" ); plato24 . a g r e g a r I n g r e d i e n t e( " choclo " ); plato24 . a g r e g a r I n g r e d i e n t e( " poroto verde " ); plato24 . a g r e g a r I n g r e d i e n t e( " arroz " ); Plato plato34 = new Plato (" Mote con h u e s i l l o s" , 1200 , 0); plato34 . a g r e g a r I n g r e d i e n t e( " mote " ); plato34 . a g r e g a r I n g r e d i e n t e( " h u e s i l l o s" ); r4 . a g r e g a r P l a t o( plato14 ); r4 . a g r e g a r P l a t o( plato24 ); r4 . a g r e g a r P l a t o( plato34 ); /* * I n c r e m e n t o 2 */ // M o s t r a m o s el menu completo de cada r e s t a u r a n t r1 . i m p r i m i r M e n u (0); r2 . i m p r i m i r M e n u (0); r3 . i m p r i m i r M e n u (0); r4 . i m p r i m i r M e n u (0); Usuario . m e n s a j e C o n s o l a( " " ); // M o s t r a m o s la cantidad de platos bajo 4.500 que incluye cada // r e s t a u r a n t en su menu Usuario . m e n s a j e C o n s o l a( " El R e s t a u r a n t " + r1 . g e t N o m b r e() + " tiene " + r1 . p l a t o s E n P r e c i o (4500) + " platos con precio bajo los 4.500 en su menu . " ); Usuario . m e n s a j e C o n s o l a( " El R e s t a u r a n t " + r2 . g e t N o m b r e() + " tiene " + r2 . p l a t o s E n P r e c i o (4500) + " platos con precio bajo los 4.500 en su menu . " ); Usuario . m e n s a j e C o n s o l a( " El R e s t a u r a n t " + r3 . g e t N o m b r e() + " tiene " + r3 . p l a t o s E n P r e c i o (4500) + " platos con precio bajo los 4.500 en su menu . " ); Usuario . m e n s a j e C o n s o l a( " El R e s t a u r a n t " + r4 . g e t N o m b r e() + " tiene " + r4 . p l a t o s E n P r e c i o (4500) + " platos con precio bajo los 4.500 en su menu . " );
49
/* * I n c r e m e n t o 3 */ // M o s t r a m o s el menu de cada r e s t a u r a n t solo con los platos dentro del // precio deseado int precio = Usuario . entero ( " Ingrese el maximo que esta d i s p u e s t o a pagar por el plato : " ); r1 . i m p r i m i r M e n u( precio ); r2 . i m p r i m i r M e n u( precio ); r3 . i m p r i m i r M e n u( precio ); r4 . i m p r i m i r M e n u( precio ); Usuario . m e n s a j e C o n s o l a( " " ); // Ahora m o s t r a m o s la cantidad de platos del menu que tienen carne // dentro de sus i n g r e d i e n t e s Usuario . m e n s a j e C o n s o l a( " El R e s t a u r a n t " + r1 . g e t N o m b r e() + " tiene en su menu " + r1 . p l a t o s C o n I n g r e d i e n t e( " carne " ) + " platos que tienen carne como uno de sus i n g r e d i e n t e s. " ); Usuario . m e n s a j e C o n s o l a( " El R e s t a u r a n t " + r2 . g e t N o m b r e() + " tiene en su menu " + r2 . p l a t o s C o n I n g r e d i e n t e( " carne " ) + " platos que tienen carne como uno de sus i n g r e d i e n t e s. " ); Usuario . m e n s a j e C o n s o l a( " El R e s t a u r a n t " + r3 . g e t N o m b r e() + " tiene en su menu " + r3 . p l a t o s C o n I n g r e d i e n t e( " carne " ) + " platos que tienen carne como uno de sus i n g r e d i e n t e s. " ); Usuario . m e n s a j e C o n s o l a( " El R e s t a u r a n t " + r4 . g e t N o m b r e() + " tiene en su menu " + r4 . p l a t o s C o n I n g r e d i e n t e( " carne " ) + " platos que tienen carne como uno de sus i n g r e d i e n t e s. " ); Usuario . m e n s a j e C o n s o l a( " " ); // F i n a l m e n t e m o s t r a m o s la cantidad de platos frios del menu que tienen // carne dentro de sus i n g r e d i e n t e s Usuario . m e n s a j e C o n s o l a( " El R e s t a u r a n t " + r1 . g e t N o m b r e() + " tiene en su + r1 . p l a t o s C o n I n g r e d i e n t e P o r T i p o( " carne " , 0) + " platos frios que tienen carne como uno de sus i n g r e d i e n t e s. " ); Usuario . m e n s a j e C o n s o l a( " El R e s t a u r a n t " + r2 . g e t N o m b r e() + " tiene en su + r2 . p l a t o s C o n I n g r e d i e n t e P o r T i p o( " carne " , 0) + " platos frios que tienen carne como uno de sus i n g r e d i e n t e s. " ); Usuario . m e n s a j e C o n s o l a( " El R e s t a u r a n t " + r3 . g e t N o m b r e() + " tiene en su + r3 . p l a t o s C o n I n g r e d i e n t e P o r T i p o( " carne " , 0) + " platos frios que tienen carne como uno de sus i n g r e d i e n t e s. " ); Usuario . m e n s a j e C o n s o l a( " El R e s t a u r a n t " + r4 . g e t N o m b r e() + " tiene en su + r4 . p l a t o s C o n I n g r e d i e n t e P o r T i p o( " carne " , 0) + " platos frios que tienen carne como uno de sus i n g r e d i e n t e s. " ); } }
Criterios de soluci on Clase Plato Atributos: Declaramos los atributos necesarios seg un nos indican en el enunciado: dos String, uno para el nombre y otro para los ingredientes y dos enteros, uno para representar el precio y otro para representar el tipo. Constructor: Lo declaramos seg un el uso mostrado en la clase Principal. Recibe como par ametros el nombre, el precio y el tipo y los asigna a los atributos correspondientes. M etodo agragarIngrediente: Lo declaramos seg un el uso mostrado en la clase Principal. Recibe como par ametro un String con el ingrediente a agregar y tenemos que concatenarlo al String que almacena todos los ingredientes. Getters: Seg un el uso dado en la clase Principal necesitamos 3 m etodos get para obtener el nombre, el precio y el tipo. M etodo tieneIngrediente: Este m etodo sirve para revisar si el plato tiene un determinado ingrediente (para cumplir con lo pedido en el incremento 3), puede hacerse tambi en s olo en la clase Restaurant. Lo que hacemos es buscar el ingrediente generando todos los substrings desde la lista de ingredientes que tengan el mismo largo que el ingrediente recibido y comparar hasta encontrar alguna coincidencia. M etodo mostrar: Revisamos el tipo del plato y seg un eso mostramos en Consola su nombre y precio seguido de Fr o o Cliente, seg un corresponda. IIC1103 Cap tulo 5: Strings 50
Clase Restaurant: Atributos: Declaramos los atributos necesarios seg un lo que se nos indica en el enunciado: un String para guardar el nombre y cuatro objetos de la clase Plato que representen a los platos que integran el men u del restaurant. Constructor: Lo declaramos seg un el uso mostrado en la clase Principal. Recibe como par ametro un String con el nombre y lo asigna al atributo correspondiente. M etodo agregarPlato: Lo declaramos seg un el uso mostrado en la clase Principal. Recibe como par ametro un objeto de la clase Plato. Tenemos que revisar a qu e objeto, de los 4 que tenemos como atributos, debemos asignarlo, revisando cu al de ellos es todav a null. Retornamos true o false seg un se pudo o no asignar el plato. M etodo getNombre: Retorna el nombre del restaurant. M etodo platosEnPrecio: Declaramos una variable para ir contando, y recorremos todos los platos revisando cu ales tienen precio igual o inferior al recibido como par ametro. Antes de revisar el precio siempre debemos chequear que el objeto no sea null. Retornamos el contador. M etodo precioPromedio: Recorremos todos los platos y obtenemos su precio (cuidando que el plato no sea null) calculando con esto el promedio. M etodo imprimirMenu: Mostramos en la consola el nombre del Restaurant junto con el precio promedio de sus platos (llamando al m etodo precioPromedio y cuantos platos tienen un precio menor o igual al recibido como par ametro (llamando al m etodo platosEnPrecio. Luego por cada plato llamamos al m etodo que muestra su nombre, precio y tipo. M etodo platosConIngrediente: Para no implementar un m etodo dos veces simplemente llamamos al m etodo platosConIngredientePorTipo deniendo un valor inv alido para el tipo. M etodo platosConIngredientePorTipo: Recorremos todos los platos y en cada uno una revisamos que no sea nulo y que tenga el ingrediente solicitado (llamando al m etodo que implementamos en la clase Plato). Adem as, en caso que el tipo sea v alido, tambi en revisamos que el tipo del plato corresponda. Si se cumplen ambas condiciones aumentamos el contador de platos, el cual retornamos al nalizar el m etodo. Posible soluci on
import i i c 1 1 0 3 P a c k a g e .*; public class Plato { // D e f i n i m o s los a t r i b u t o s minimos n e c e s a r i o s private String nombre ; private int precio ; private int tipo ; private String i n g r e d i e n t e s; public Plato ( String nombre , int precio , int tipo ) { // I n i c i a l i z a m o s los valores para la p r e p a r a c i o n this . nombre = nombre ; this . precio = precio ; this . tipo = tipo ; this . i n g r e d i e n t e s = " " ; } public void a g r e g a r I n g r e d i e n t e( String i n g r e d i e n t e) { // A g r e g a m o s el i n g r e d i e n t e al atributo ( String ) c o r r e s p o n d i e n t e i n g r e d i e n t e s += " - " + i n g r e d i e n t e; } public boolean t i e n e I n g r e d i e n t e( String i n g r e d i e n t e) { // Buscamos el i n g r e d i e n t e g e n e r a n d o todos los s u b s t r i n g s desde el // atributo c o r r e s p o n d i e n t e // que tengan el mismo largo que el i n g r e d i e n t e en el p a r a m e t r o for ( int i = 0; i <= i n g r e d i e n t e s. length () - i n g r e d i e n t e. length (); i ++) { String aux = i n g r e d i e n t e s. s u b s t r i n g(i , i + i n g r e d i e n t e. length ());
51
if ( aux . e q u a l s I g n o r e C a s e( i n g r e d i e n t e)) { return true ; } } return false ; } public void mostrar () { if ( tipo == 0) { Usuario . m e n s a j e C o n s o l a( " \ t " + nombre + " , " + precio + " , Frio " ); } else { Usuario . m e n s a j e C o n s o l a( " \ t " + nombre + " , " + precio + " , Caliente " ); } } public String g e t N o m b r e() { return nombre ; } public int g e t P r e c i o() { return precio ; } public int getTipo () { return tipo ; } } import i i c 1 1 0 3 P a c k a g e .*; public class R e s t a u r a n t { // D e f i n i m o s los a t r i b u t o s n e c e s a r i o s private String nombre ; // D e f i n i m o s los platos que integran el menu del R e s t a u r a n t private Plato plato0 ; private Plato plato1 ; private Plato plato2 ; private Plato plato3 ; private Plato plato4 ; public R e s t a u r a n t( String nombre ) { this . nombre = nombre ; } public Plato o b t e n e r P l a t o( int indice ) { // O b t e n e m o s el plato segun su indice if ( indice == 0) { return plato0 ; } else if ( indice == 1) { return plato1 ; } else if ( indice == 2) { return plato2 ; } else if ( indice == 3) { return plato3 ; } else { return plato4 ; } } public boolean a g r e g a r P l a t o( Plato plato ) { // Para agregar un nuevo plato , buscamos el primero de los a t r i b u t o s que // aun sea nulo if ( plato0 == null ) { plato0 = plato ; } else if ( plato1 == null ) { plato1 = plato ; } else if ( plato2 == null ) { plato2 = plato ; } else if ( plato3 == null ) { plato3 = plato ; } else if ( plato4 == null ) { plato4 = plato ; } else { // Si no hay ninguno vacio entonces r e t o r n a m o s false return false ; } return true ;
52
} public int p l a t o s E n P r e c i o( int precio ) { // D e c l a r a m o s una variable para contar , y r e c o r r e m o s los platos buscando // aquellos con precio igual o inferior al indicado int contador = 0; for ( int i = 0; i < 5; i ++) { Plato plato = o b t e n e r P l a t o( i ); if ( plato != null && plato . g e t P r e c i o() <= precio ) { contador ++; } } return contador ; } public double p r e c i o P r o m e d i o() { // D e c l a r a m o s una variable para contar , y r e c o r r e m o s los platos // c o n t a n d o l o s y a c u m u l a n d o sus precios int contador = 0 , p r e c i o T o t a l = 0; for ( int i = 0; i < 5; i ++) { Plato plato = o b t e n e r P l a t o( i ); if ( plato != null ) { p r e c i o T o t a l += plato . g e t P r e c i o (); contador ++; } } return p r e c i o T o t a l / contador ; } public int p l a t o s C o n I n g r e d i e n t e( String i n g r e d i e n t e) { // Llamamos al metodo que busca tambien por tipo de plato , d e f i n i e n d o un // valor invalido para dicho p a r a m e t r o return p l a t o s C o n I n g r e d i e n t e P o r T i p o( ingrediente , -1); } public int p l a t o s C o n I n g r e d i e n t e P o r T i p o( String ingrediente , int tipo ) { // R e c o r r e m o s todos los platos del restaurant , r e v i s a n d o que no sean // nulos y que tengan el i n g r e d i e n t e deseado , // r e s t r i n g i e n d o ademas por el tipo de plato en caso de que el p a r a m e t r o // c o r r e s p o n d i e n t e sea valido , y los contamos int contador = 0; for ( int i = 0; i < 5; i ++) { Plato plato = o b t e n e r P l a t o( i ); if ( plato != null && plato . t i e n e I n g r e d i e n t e( i n g r e d i e n t e) && ( tipo == -1 || plato . getTipo () == tipo )) { contador ++; } } return contador ; } public void i m p r i m i r M e n u( int precio ) { Usuario . m e n s a j e C o n s o l a( " \ n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " ); Usuario . m e n s a j e C o n s o l a( " R e s t a u r a n t: " + nombre + " \ nPrecio Promedio de sus platos : " + p r e c i o P r o m e d i o ()); if ( precio != 0) { Usuario . m e n s a j e C o n s o l a( " El menu incluye " + p l a t o s E n P r e c i o( precio ) + " platos con precio igual o menor a " + precio + " : " ); } for ( int i = 0; i < 5; i ++) { Plato plato = o b t e n e r P l a t o( i ); if ( plato != null && ( precio == 0 || plato . g e t P r e c i o() <= precio )) { plato . mostrar (); } } Usuario . m e n s a j e C o n s o l a( " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " ); } public String g e t N o m b r e() { return nombre ; } }
53