Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Strings Java
Strings Java
Captulo 5: Strings
Resumen te
orico
Los Strings son una secuencia de caracteres, incluyendo letras (may
usculas y min
usculas), signos, espacios,
caracteres especiales, etc. En palabras simples, los Strings sirven para guardar palabras, oraciones, etc. En
java los Strings son objetos, tipo String. Al momento de crearlos, la manera m
as sencilla es:
String hola = "Hello World";
Los Strings, al ser objetos, tambien pueden ser inicializados como tales, a traves del constructor:
String s = new String(); // String vacio
String s = new String("Hola"); // String "Hola"
M
etodos de la clase String
La clase String tiene una gran variedad de metodos u
tiles. La lista completa puede encontrarse en la documentacion oficial (http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html). A continuaci
on explicamos
los metodos que m
as se utilizan en este curso.
int length()
Sencillamente, retorna el largo (la cantidad de caracteres) de un String.
String texto1 = "Hola";
String texto2 = "(/.,;>.)";
String texto3 = "";
String texto4 = " ";
int n = texto1.length(); //
int m = texto2.length(); //
int p = texto3.length(); //
int q = texto4.length(); //
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
= "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 Captulo 5: Strings
//
//
//
//
false
true
false
false
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);
//
//
//
//
false
true
false
true
int compareTo(String s)
Este metodo compara lexicogr
aficamente 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 Captulo 5: Strings
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 Lnea
Comillas simples
Comillas dobles
Representaci
on
\\
\t
\n
\
\"
Ejemplos
Problema 1: Varios
Enunciado
Escriba metodos en Java que:
Rote una palabra, por ejemplo auto queda otua.
Ocupe una palabra para crear un palndrome, 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 metodo 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 posicion desde la que buscamos en nuestro String ya que, o si no, podemos contar infinitas 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 " );
}
}
charAt(int index)
compareTo(String another)
length()
Para poder arreglar este dilema, le piden a usted desarrollar los siguientes metodos (utilizando s
olo lo ya
construido):
String substring(int begin, int end)
String toUpperCase()
static valueOf(int i)
int indexOf(String str, int from)
Criterios de soluci
on
Metodo substring: Lo primero que debemos hacer es revisar que los par
ametros recibidos correspondan
a ndices validos seg
un el largo del String. Si el inicio es menor que cero y el fin 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 fin recibidos como par
ametros,
y vaya obteniendo cada char con el metodo charAt y lo vaya concatenando, formando as el substring
a retornar.
Metodo 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 metodo 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 estan 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.
Metodo 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 dgitos (dividiendo el n
umero por
10 y obteniendo el resto) y para cada dgito obtenemos el char que corresponde y lo concatenamos al
String que representa el resultado de pasar el n
umero a String.
Metodo indexOf: En este metodo 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 Captulo 5: Strings
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
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 metodo Double.ParseDouble(String str);.
Criterios de soluci
on
Observamos que esta es una validaci
on simple, s
olo debemos verificar que los caracteres sean n
umeros, signo
negativo, o separadores validos, adem
as de que s
olo exista un separador.
Adicionalmente podemos hacer el metodo 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 metodo que reciba un String con una operacion 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
metodos de la clase String:
charAt, length
Criterios de soluci
on
Lo primero que debemos hacer es identificar 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 metodo charAt. Cada caracter lo comparamos con una de las posibles operaciones. Al
encontrar la operaci
on guardamos el caracter y tambien 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 metodo 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 metodo que reciba un char y retorne la cantidad de apariciones de ese char en ambos textos. Un metodo
que retorne un String formado por la intercalaci
on de las letras que forman ambos textos. Otro metodo que
retorne el resultado de la comparaci
on entre dos substrings de los textos, recibiendo como par
ametros los
ndices iniciales y finales para cada uno de ellos. Finalmente un metodo que permita reemplazar un cierto
char por otro en ambos textos.
Para esto puede ocupar s
olo los siguientes metodos 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 metodo 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 metodo charAt e ir contando en una variable cuantas veces el
caracter es igual al recibido como par
ametro.
Para el metodo 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 metodo charAt.
As se concatena un caracter del primer String seguido de un caracter del segundo. En este metodo
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 metodo que compara dos substrings de los textos debemos primero obtener los substrings seg
un
los datos de inicio y fin recibidos como par
ametros. Para esto implementamos ciclos que recorran los
strings desde el inicio hasta el fin recibidos como par
ametros y vayan formando los dos substrings,
concatenando los caracteres que se obtienen utilizando el metodo charAt. Luego utilizando el metodo
equals o compareT o, revisamos si son iguales, y retornamos true o false seg
un corresponda.
Para el metodo que reemplace un char por otro lo que podemos hacer es implementar un ciclo que
recorra ambos textos y que vaya obteniendo, con el metodo 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
Problema 8: C
odigo Simple
Enunciado
Haga un programa que dado un mensaje y un n
umero codifique el mensaje, moviendo las letras un n
umero
de posiciones igual al n
umero ingresado, en la tabla ASCII. Por simplicidad puede transformar el mensaje a
min
usculas. Adem
as escriba en el main una prueba del funcionamiento del programa.
Criterios de soluci
on
Seg
un el enunciado, primero debemos pedir al usuario el mensaje a codificar y un n
umero (lo llamaremos base
del codigo). Dados estos n
umeros debemos obtener el valor de cada letra (s
olo las letras) en la tabla ASCII,
y sumarle la base. Luego imprimiremos el mensaje, para mostrar el mensaje codificado. Para decodificar el
mensaje el procedimiento es inverso, debemos restar la base, pero considerando que cambiaron los extremos
en que los caracteres corresponden a letras (se suma la base a cada extremo). Adem
as debemos decodificar
el mensaje con una base distinta, para mostrar que se requiere de esta para poder realizar la operaci
on.
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 ) {
String mensaje = Usuario . texto ( " Ingrese el mensaje que desea c o d i f i c a r. " );
int base = Usuario . entero (" Ingrese la base del codigo " );
String c o d i f i c a d o = c o d i f i c a r( mensaje , base );
Usuario . mensaje ( " C o d i f i c a d o:\ n " + c o d i f i c a d o);
Usuario . mensaje ( " D e c o d i f i c a d o Base 10:\ n " + d e c o d i f i c a r( codificado , 10));
Usuario . mensaje ( " D e c o d i f i c a d o Base " + base + " :\ n "
+ d e c o d i f i c a r( codificado , base ));
}
public static String c o d i f i c a r( String mensaje , int base ) {
String r e s u l t a d o = " " ;
mensaje = mensaje . t o L o w e r C a s e();
for ( int i = 0; i < mensaje . length (); i ++) {
if ( mensaje . charAt ( i ) >= 97 && mensaje . charAt ( i ) <= 122) {
r e s u l t a d o += ( char ) ( mensaje . charAt ( i ) + base );
} else {
r e s u l t a d o += ( char ) mensaje . charAt ( i );
}
}
return r e s u l t a d o;
}
public static String d e c o d i f i c a r( String mensaje , int base ) {
String r e s u l t a d o = " " ;
mensaje = mensaje . t o L o w e r C a s e();
for ( int i = 0; i < mensaje . length (); i ++) {
if ( mensaje . charAt ( i ) >= 97 + base
&& mensaje . charAt ( i ) <= 122 + base ) {
r e s u l t a d o += ( char ) ( mensaje . charAt ( i ) - base );
} else {
r e s u l t a d o += ( char ) mensaje . charAt ( i );
}
}
return r e s u l t a d o;
}
}
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 traves 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
18
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
Lo primero que debemos hacer, como nos indica el enunciado, es implementar el constructor de la clase. Este
debe recibir el n
umero que se sumar
a y restar
a para encriptar y desencriptar y guardarlo como atributo.
Adem
as, como debemos mostrar si el objeto pudo ser creado con exito, y el constructor no puede retornar
nada, agregamos otro atributo a la clase que indique si el objeto se cre
o bien o no.
Para el metodo encriptar lo que primero tenemos que hacer es revisar si el objeto se cre
o con exito. Si
no fue as retornamos el mensaje de error. Luego tenemos que determinar si el usuario desea encriptar o
desencriptar, para saber si sumar o restar a cada caracter. A continuaci
on, debemos sumar (o restar) tantas
posiciones como valor determinado por el usuario en el constructor, a cada caracter; si se pasade la z,
volvemos a la a. Como sabemos que los char se pueden operar como si fueran enteros, basta con sumar (o
restar) la cantidad adecuada a cada char del String.
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 metodos 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
Metodo QuitarEspacios: En este metodo tenemos que recorrer el String e ir obteniendo cada caracter
con el metodo charAt y revisar si es igual al caracter que representa el espacio. Si no es igual lo
concatenamos al String final. As el String que retornamos no contiene ning
un espacio.
Metodo CuadradoPerfecto: En este metodo tenemos que determinar el n
umero de filas (igual al
n
umero de columnas). Para esto utilizamos el metodo 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.
Metodo 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 @.
Despues 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 final. 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
28
29
30
31
Las letras de una palabra tambien van separadas entre s por 1 espacio, al final 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 smbolo fuera de la matriz de claves.
Se pide que implemente el metodo 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 metodo aTap
devuelve un String conteniendo la serie de puntos equivalentes en el Tap Code. Note que si recibe como
mensaje un String vaco 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 metodo aTap es revisar que el String original recibido como par
ametro
no sea vaco. Si es as, simplemente retornamos el mismo String.
IIC1103 Captulo 5: Strings
32
Si el String no est
a vaco debemos recorrerlo con un ciclo para obtener cada letra que lo compone, utilizando
y cambiarlas
para esto el metodo 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 fila de la letra estar
a dada por la posici
on de la letra en el
String divido en 5 (ya que son 5 filas y 5 columnas). Y la columna de la letra estar
a dada por el resto de
la division de la posici
on de la letra en el String por 5. Despues de eso solo tenemos que imprimir tantos
puntos como la fila 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 tambien realizar esta b
usqueda en un genero en particular. Nuevamente debe cumplir con lo definido 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
35
+ " - "
+ " - "
+ " - "
+ " - "
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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 genero.
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.
Metodo agragarPasatiempo: Lo declaramos seg
un el uso mostrado en la clase Principal. Recibe
como parametro 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 metodos get para obtener el nombre,
la edad y el genero.
Metodo tienePasatiempo: Este metodo sirve para revisar si la persona tiene un determinado
pasatiempo (para cumplir con lo pedido en el incremento 3), puede hacerse tambien solo 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.
Metodo mostrar: Revisamos el genero de la persona y seg
un eso mostramos en Consola su edad
seguida de Hombre o Mujer seg
un corresponda.
IIC1103 Captulo 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.
Metodo agregarIntegrante: Lo declaramos seg
un el uso mostrado en la clase Principal. Recibe
como parametro un objeto de la clase Persona. Tenemos que revisar a que objeto, de los 4 que
tenemos como atributos, debemos asignarlo, revisando cu
al de ellos es todava null. Retornamos
true o false seg
un se pudo o no asignar el integrante.
Metodo getApellidos: Retorna los apellidos de la familia.
Metodo promedioEdad: Recorremos todas las personas y obtenemos su edad (cuidando que el
integrante no sea null) calculando con esto el promedio.
Metodo mostrarFamilia: Mostramos en la consola los apellidos de la familia y por cada persona
mostramos su edad y si es hombre o mujer.
Metodo integrantesConPasatiempo: Para no implementar un metodo dos veces simplemente
llamamos al metodo integrantesConPasatiempoPorGenero definiendo un valor inv
alido para el
genero.
Metodo integrantesConPasatiempoPorGenero: Recorremos todas las personas y en cada una
revisamos que no sea nula y que tenga el pasatiempo solicitado (llamando al metodo que implementamos en la clase Persona). Ademas, en caso que el genero sea v
alido, tambien revisamos que
el genero de la persona corresponda. Si se cumplen ambas condiciones aumentamos el contador
de personas, el cual retornamos al finalizar el metodo.
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 ;
== null ) {
== null ) {
== null ) {
vacio entonces r e t o r n a m o s false
}
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
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
su catalogo . " );
+
su catalogo . " );
0)
su catalogo . " );
}
}
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 caractersticas 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.
Metodo agragarCaracteristica: Lo declaramos seg
un el uso mostrado en la clase Principal.
Recibe como par
ametro un String con la caracterstica a agregar y tenemos que concatenarlo al
String que almacena las caractersticas.
Getters: Seg
un el uso dado en la clase Principal necesitamos 3 metodos get para obtener el nombre
del modelo, el a
no y el tipo.
Metodo tieneCaracteristica: Este metodo sirve para revisar si el modelo tiene una determinada
caracterstica (para cumplir con lo pedido en el incremento 3), puede hacerse tambien solo en la
clase Marca. Lo que hacemos es buscar la caracterstica generando todos los substrings desde la
lista de caractersticas que tengan el mismo largo que la caracterstica recibida y comparar hasta
encontrar alguna coincidencia.
Metodo 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.
Metodo 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 que objeto, de los 4 que tenemos
como atributos, debemos asignarlo, revisando cu
al de ellos es todava null. Retornamos true o
false seg
un se pudo o no asignar el modelo.
Metodo getNombre: Retorna el nombre de la marca.
Metodo 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.
Metodo 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 metodo autosDelAnio. Luego, por cada Modelo
llamamos al metodo que muestra su nombre y su tipo.
Metodo modelosConCaracteristica: Para no implementar un metodo dos veces simplemente
llamamos al metodo modelosConCaracteristicaPorTipo definiendo un valor inv
alido para el
tipo.
IIC1103 Captulo 5: Strings
43
Metodo modelosConCaracteristicaPorTipo: Recorremos todos los modelos y en cada uno revisamos que no sea nulo y que tenga la caracterstica solicitada (llamando al metodo que implementamos en la clase Modelo). Adem
as, en caso que el tipo sea valido, tambien revisamos que el tipo
del modelo corresponda. Si se cumplen ambas condiciones aumentamos el contador de modelos,
el cual retornamos al finalizar el metodo.
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
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
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. " );
menu "
menu "
menu "
menu "
}
}
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.
Metodo agragarIngrediente: Lo declaramos seg
un el uso mostrado en la clase Principal. Recibe
como parametro 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 metodos get para obtener el nombre,
el precio y el tipo.
Metodo tieneIngrediente: Este metodo sirve para revisar si el plato tiene un determinado
ingrediente (para cumplir con lo pedido en el incremento 3), puede hacerse tambien solo 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.
Metodo mostrar: Revisamos el tipo del plato y seg
un eso mostramos en Consola su nombre y
precio seguido de Fro o Cliente, seg
un corresponda.
IIC1103 Captulo 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.
Metodo 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 que objeto, de los 4 que tenemos
como atributos, debemos asignarlo, revisando cu
al de ellos es todava null. Retornamos true o
false seg
un se pudo o no asignar el plato.
Metodo getNombre: Retorna el nombre del restaurant.
Metodo platosEnPrecio: Declaramos una variable para ir contando, y recorremos todos los platos
revisando cuales tienen precio igual o inferior al recibido como parametro. Antes de revisar el precio
siempre debemos chequear que el objeto no sea null. Retornamos el contador.
Metodo precioPromedio: Recorremos todos los platos y obtenemos su precio (cuidando que el
plato no sea null) calculando con esto el promedio.
Metodo imprimirMenu: Mostramos en la consola el nombre del Restaurant junto con el precio
promedio de sus platos (llamando al metodo precioPromedio y cuantos platos tienen un precio
menor o igual al recibido como par
ametro (llamando al metodo platosEnPrecio. Luego por cada
plato llamamos al metodo que muestra su nombre, precio y tipo.
Metodo platosConIngrediente: Para no implementar un metodo dos veces simplemente llamamos al metodo platosConIngredientePorTipo definiendo un valor inv
alido para el tipo.
Metodo platosConIngredientePorTipo: Recorremos todos los platos y en cada uno una revisamos que no sea nulo y que tenga el ingrediente solicitado (llamando al metodo que implementamos
en la clase Plato). Ademas, en caso que el tipo sea valido, tambien revisamos que el tipo del plato
corresponda. Si se cumplen ambas condiciones aumentamos el contador de platos, el cual retornamos al finalizar el metodo.
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