+ All Categories

Strings

Date post: 07-Jun-2015
Category:
Upload: robert-wolf
View: 70 times
Download: 0 times
Share this document with a friend
Popular Tags:
53
Pontificia Universidad Cat´ olica de Chile Escuela de Ingenier´ ıa Departamento de Ciencia de la Computaci´ on IIC1103 — Introducci´ on a la Programaci´ on Cap´ ıtulo 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, tambi´ en pueden ser inicializados como tales, a trav´ es del constructor: String s = new String(); // String vacio String s = new String("Hola"); // String "Hola" etodos de la clase String La clase String tiene una gran variedad de m´ etodos ´ utiles. La lista completa puede encontrarse en la documen- taci´on oficial (http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html). A continuaci´ on explicamos los m´ etodos 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(); // 4 int m = texto2.length(); // 8 int p = texto3.length(); // 0 int q = texto4.length(); // 1 char charAt(int index) Retorna el caracter que se encuentra en la posici´on dada por index. Si index es mayor o igual que el largo del String, el programa se caer´ a al ejecutar, aunque Eclipse no le avisar´ a al respecto (no es capaz de prever dicho comportamiento), y al compilar tampoco habr´ a errores. Por esta raz´on, cada vez que utilice este m´ etodo debe primero revisar el largo del String. String texto = "¡Hola Juanito!"; char c1 = texto.charAt(0); // ’¡’ char c2 = texto.charAt(1); // ’H’ char c3 = texto.charAt(13); // ’!’ char c4 = texto.charAt(20); // error char c5 = texto.charAt( texto.length() - 1 ); // ’!’ IIC1103 – Cap´ ıtulo 5: Strings 1
Transcript
Page 1: Strings

Pontificia Universidad Catolica de ChileEscuela de IngenierıaDepartamento de Ciencia de la Computacion

IIC1103 — Introduccion a la Programacion

Capıtulo 5: Strings

Resumen teorico

Los Strings son una secuencia de caracteres, incluyendo letras (mayusculas y minusculas), signos, espacios,caracteres especiales, etc. En palabras simples, los Strings sirven para guardar palabras, oraciones, etc. Enjava los Strings son objetos, tipo String. Al momento de crearlos, la manera mas 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 vacioString s = new String("Hola"); // String "Hola"

Metodos de la clase String

La clase String tiene una gran variedad de metodos utiles. La lista completa puede encontrarse en la documen-tacion oficial (http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html). A continuacion explicamoslos metodos que mas 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(); // 4int m = texto2.length(); // 8int p = texto3.length(); // 0int q = texto4.length(); // 1

char charAt(int index)

Retorna el caracter que se encuentra en la posicion dada por index. Si index es mayor o igual que el largo delString, el programa se caera al ejecutar, aunque Eclipse no le avisara al respecto (no es capaz de prever dichocomportamiento), y al compilar tampoco habra errores. Por esta razon, cada vez que utilice este metododebe primero revisar el largo del String.

String texto = "¡Hola Juanito!";char c1 = texto.charAt(0); // ’¡’char c2 = texto.charAt(1); // ’H’char c3 = texto.charAt(13); // ’!’char c4 = texto.charAt(20); // errorchar c5 = texto.charAt( texto.length() - 1 ); // ’!’

IIC1103 – Capıtulo 5: Strings 1

Page 2: Strings

Ejemplo de como 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 parametro. La coincidencia debe serexacta (se distingue mayusculas de minusculas, por ejemplo, y los caracteres con tilde no son iguales a losque no lo llevan).

String texto = "¡Hola Juanito!";boolean b1 = texto.startsWith("¡"); // trueboolean b2 = texto.startsWith("¡Hola ") // trueboolean b3 = texto.startsWith("¡hola Juanito!") // falseboolean b4 = texto.startsWith("¡Hola Juanito! ") // falseboolean b5 = texto.startsWith("¡Hola Juanito!") // true

boolean startsWith(String s, int k)

Como el metodo anterior, pero comienza a revisar desde el ındice (posicion) k, sin importar lo que hayaantes. Si k == 0, entonces el metodo es equivalente al anterior.

String texto = "¡Hola Juanito!";boolean b1 = texto.startsWith("Hola", 1); // trueboolean b2 = texto.startsWith(" Juanito!", 5); // trueboolean b3 = texto.startsWith("a", 7); // falseboolean b4 = texto.startsWith("¡", 20); // false

int indexOf(char c)

Devuelve un entero que indica la posicion donde aparece por primera vez el caracter c. Si el caracter noaparece en todo el String, devuelve -1.

String texto = "¡Hola Juanito!";int n = texto.indexOf(’o’); // 2int m = texto.indexOf(’ ’); // 5int p = texto.indexOf(’¡’); // 0int q = texto.indexOf(’z’); // -1

int indexOf(String s)

Similar al anterior, solo que devuelve la posicion donde aparece por primera vez un determinado String.

String texto = "En la arboleda un arbolito";int n = texto.indexOf("arbol"); // 6int m = texto.indexOf("arbol"); // -1int p = texto.indexOf("boli"); // 20int q = texto.indexOf("bol"); // 8

IIC1103 – Capıtulo 5: Strings 2

Page 3: Strings

int indexOf(char c, int fromIndex) y int indexOf(String s, int fromIndex)

Como el metodo indexOf(String s), pero comienza a buscar desde la posicion fromIndex.

int lastIndexOf(char c), int lastIndexOf(String s), int lastIndexOf(char c, int fromIndex), intlastIndexOf(String s, int fromIndex)

Como indexOf(char c), pero en vez de buscar la primera aparicion del char c, busca la ultima. Retorna -1 sino lo encuentra. Se definen de manera analoga a los anteriores:

boolean equals(String s)

Retorna true cuando ambos String son exactamente iguales. Esto quiere decir que el largo de ambos es elmismo, y que en cada posicion encontramos el mismo caracter.

String texto1 = "casa";String texto2 = "caza";String texto3 = "casi";String texto4 = "casa";String texto5 = "CaSa";boolean b1 = texto1.equals(texto3); // falseboolean b2 = texto4.equals(texto1); // trueboolean b3 = texto3.equals(texto1); // falseboolean b4 = texto1.equals(texto5); // false

boolean equalsIgnoreCase(String s)

Retorna true cuando ambos String son iguales, sin importar mayusculas y minusculas.

String texto1 = "casa";String texto2 = "caza";String texto3 = "casi";String texto4 = "casa";String texto5 = "CaSa";boolean b1 = texto1.equalsIgnoreCase(texto3); // falseboolean b2 = texto4.equalsIgnoreCase(texto1); // trueboolean b3 = texto3.equalsIgnoreCase(texto1); // falseboolean b4 = texto1.equalsIgnoreCase(texto5); // true

int compareTo(String s)

Este metodo compara lexicograficamente dos String. Parte en el primer par de caracteres hasta encontrarun par de char distintos. Si encuentra dos caracteres distintos, retorna la diferencia entre ellos (recuerde quechar funciona como un numero entero). Si uno de los String comienza con el otro, retorna el numero decaracteres adicionales que tiene. Si ambos String son iguales, retorna 0.

String texto = "radiografıa";int n = texto.compareTo("radio"); // 6int m = texto.compareTo("radiologıa"); // -5int p = texto.compareTo("rabia"); // 2int q = texto.compareTo("ralentizar"); // -8int r = texto.compareTo("radiografia"); // 132int s = texto.compareTo("radiografıa"); // 0

IIC1103 – Capıtulo 5: Strings 3

Page 4: Strings

String substring(int inicio, int fin)

Retorna una parte del String: desde la posicion inicio hasta la posicion fin.

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 rapido";String t2 = t1.replaceAll("auto", "avion")); // "El avion volaba rapido"

IIC1103 – Capıtulo 5: Strings 4

Page 5: Strings

Los Strings soportan todos los caracteres de la tabla ASCII:

Fuente de referencia:http://users.physik.fu-berlin.de/~goerz/blog/wp-content/uploads/2008/09/ascii.gif

Para utilizarlos se puede “castear” un numero entero (la representacion decimal del caracter segun la tablaASCII) a un “char”.

char c = (char) 36; // signo pesos

Ademas se pueden utilizar ciertos caracteres especiales, anteponiendo \:

Descripcion RepresentacionBarra invertida \\Tabulacion horizontal \tSalto de Lınea \nComillas simples \’Comillas dobles \"

IIC1103 – Capıtulo 5: Strings 5

Page 6: Strings

Ejemplos

Problema 1: Varios

Enunciado

Escriba metodos 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 muchosautos” queda “Habian muchos autos”.

Cuente la cantidad de ocurrencias de una palabra en un texto, por ejemplo “hola” en “El gato deciahola muchas veces al dia, hola”, retorna 2.

Criterios de solucion

Para rotar la palabra basta con crear un nuevo String (nueva variable) e ir concatenandole las le-tras de nuestro String original, pero recorriendo el original desde atras hacia adelante (for por sulargo/length).

Muy similar al anterior, se puede hacer de dos maneras. Se le puede concatenar el string obtenido conel 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 “ ” lamejor manera es guardar la posicion donde esta la palabra buscada y ocuparla para separar la oracionen dos substrings, uno con todos los caracteres a la izquierda de la posicion y otro a la derecha. Luegoconcatenamos 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 esta, si la posiciones distinta de -1 sumamos uno a la cantidad de veces que encontramos la palabra. Es importante cambiarla posicion desde la que buscamos en nuestro String ya que, o si no, podemos contar infinitas veces lamisma palabra.

IIC1103 – Capıtulo 5: Strings 6

Page 7: Strings

Posible solucion

import iic1103Package.*;public class Principal {

public static String palindromizar(String palindrome) {// obtengo el largo de la palabra enviadaint largo = palindrome.length ();

// iteramos hasta el largo menos 2for (int i = largo - 2; i >= 0; i--) {

// le agregamos la ultima letrapalindrome = palindrome + palindrome.charAt (i);

}

return palindrome; // retorno el palindrome}

public static String darVuelta(String palabra ) {// aqui guardamos el resultadoString palabraRotada = "";

// parto desde el final y termino en el principiofor (int i = palabra .length () - 1; i >= 0; i--) {

// le voy agregando los caracterespalabraRotada = palabraRotada + palabra .charAt(i);

}

// retorno la palabra rotadareturn palabraRotada;

}

public static int buscarCantidad(String palabra , String textoAUsar) {// Contamos cuantas veces esta la palabraint veces = 0;int pos = 0;

while (pos != -1) {// Buscamos string y contamos , buscamos desde pos+1 para no volver a// leer la misma palabrapos = textoAUsar. indexOf (palabra , pos + 1);// si pos es distinta de -1 contamos una vez masif (pos != -1) {

veces++;}

}return veces;

}

public static boolean buscarPalabra(String palabra , String textoAUsar) {// Busca la palabraint pos = textoAUsar. indexOf (palabra );

if (pos != -1) {// Agregamos "_"String textoAMostrar = textoAUsar.substring(0, pos) + "_"

+ textoAUsar.substring(pos);Usuario .mensajeConsola(textoAMostrar);return true;

} else {Usuario .mensajeConsola("No fue encontrado el string " + palabra

+ " en el texto ");return false;

}}

public static void main(String [] args) {

String nombre = "auto";Usuario .mensajeConsola(palindromizar(nombre ));Usuario .mensajeConsola(darVuelta(nombre ));buscarPalabra("hola", "El gato decia hola muchas veces al dia, hola");

}

}

IIC1103 – Capıtulo 5: Strings 7

Page 8: Strings

Problema 2: Clase String

Enunciado

Un desarrollador esta construyendo la clase String de Java, pero a medio camino deja el tema botado y se vadel paıs. Sin poder contactarlo, le piden a usted completar la clase, sabiendo que la representacion interna,constructores y operadores ya existen, y se encuentran ya disponibles los siguientes metodos:

char charAt(int index) Retorna el caracter en la posicion index.int compareTo(String another) Compara dos strings lexicograficamente.int length() Retorna el largo del string.

Para poder arreglar este dilema, le piden a usted desarrollar los siguientes metodos (utilizando solo lo yaconstruido):

String substring(int begin, int end) Retorna el substring que va desde la posicion begina la posicion end, inclusive. Devuelve null si existealgun problema con los ındices recibidos.

String toUpperCase() Retorna un string equivalente al actual, pero contodas las letras convertidas a mayusculas. Ignorecaracteres que no pertenezcan al alfabeto ingles.

static valueOf(int i) Retorna el string que representa al entero i.int indexOf(String str, int from) 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). Solo encuentra str aa partir del ındice from.

Criterios de solucion

Metodo substring: Lo primero que debemos hacer es revisar que los parametros recibidos correspondana ındices validos segun el largo del String. Si el inicio es menor que cero y el fin mayor que el largo delString -1 entonces retornamos false. Si no, para obtener un substring, debemos implementar un ciclo(for por ejemplo) que recorra el String completo, desde el inicio hasta el fin recibidos como parametros,y vaya obteniendo cada char con el metodo charAt y lo vaya concatenando, formando ası el substringa retornar.

Metodo toUpperCase: Para cambiar las letras a mayuscula debemos implementar un ciclo que recorratodo el String obteniendo cada uno de sus caracteres con el metodo charAt. Luego revisamos cadacaracter si es que esta en minuscula, 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 esta en minuscula lo quetenemos que hacer es al inicio de las mayusculas ’A’ sumarle la distancia del caracter en minuscula alinicio de las minusculas ’a’. Ası, tendremos el mismo caracter pero ahora en mayuscula.

Metodo valueOf: Para pasar el valor entero a String tenemos que revisar primero si el numero esnegativo o positivo. Si el numero es negativo tenemos que agregar un guion ’-’ al String resultante.Luego recorremos el numero y vamos obteniendo cada uno de sus dıgitos (dividiendo el numero por10 y obteniendo el resto) y para cada dıgito obtenemos el char que corresponde y lo concatenamos alString que representa el resultado de pasar el numero a String.

Metodo indexOf: En este metodo lo que tenemos que hacer es recorrer todo el String, partiendo desdeel inicio ingresado por el usuario. Dentro del ciclo debemos revisar el String ingresado como parametro(el buscado) para revisar cada uno de sus caracteres y compararlos con el String original. Ası si todoslos caracteres coinciden devolvemos la posicion donde encontramos el primer caracter que fue igual.

IIC1103 – Capıtulo 5: Strings 8

Page 9: Strings

Posible solucion

/*** Retorna el substring que va desde la posicion begin a la posicion end,* inclusive. Devuelve null si existe algun problema con los indices* recibido .*/

public String substring(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 equivalente al actual, pero con todas las letras* convertidas a mayuscula. Ignora caracteres que no pertenezcan al alfabeto* ingles*/

public String toUpperCase() {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 representa 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 encuentra el string str en el string actual ,* o -1 si es que no se encuentra (o cualquier otro problema ). Solo* encuentra 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;

}

IIC1103 – Capıtulo 5: Strings 9

Page 10: Strings

Problema 3: Iniciando un Juego

Enunciado

Debemos crear un algoritmo que permita inicializar un juego. Para ello debe pedir un texto al usuario enque se indiquen los datos necesarios. La primera palabra de este texto representara el modo en el cual se va ajugar, pudiendo ser MULTI, PC o DEMO. Luego viene un signo punto y coma (;) seguido por los nombres delos jugadores que intervendran en el juego separados entre ellos por un guion (-). En caso de ser en modo PCsolamente viene el nombre de un jugador, en cambio si es modo MULTI pueden venir entre 2 y 4 nombres.Los siguientes son un ejemplo del texto que se ingresa:

MULTI;Marcos-Karen-Marcelo-Rosa

PC;Marcos

Para el primer texto su programa debiera iniciarse en modo Multi usuario para cuatro jugadores, con losnombres ahı descritos.En caso de ingresarse el segundo texto, su programa debiera inicializarse en modo versus PC, con un unicousuario llamado Marcos.

Criterios de solucion

Se nos pide reconocer un texto ingresado por el usuario. Como datos nos dan que los separadores son “;”y “-”, para ello nuestro programa tiene que ser capaz de buscar el caracter “;” (charAt()), en una primerainstancia para poder realizar la separacion. Luego se nos pide verificar que la primera parte correspondaa “MULTI”, “PC” o “DEMO” (validacion con equals). Con la segunda parte de esta division hacemos lomismo que al principio y separamos por “-”, verificando que la cantidad de jugadores ingresados correspondaa la senalada segun el enunciado.

Posible solucion

import iic1103Package.*;public class Principal {

public static void main(String [] args) {while (true) {

String x = Usuario .texto("Ingrese el mensaje a validar ");if (Validador(x))

break ;}

}

// Metodo que valida el texto que es ingresadostatic boolean Validador(String validar ) {

int donde = validar .indexOf (";"); // buscamos el separador ";"if (donde == -1 && !validar .equalsIgnoreCase("DEMO")) {

Usuario .mensaje ("No es un formato valido");return false;

} else if (validar . equalsIgnoreCase("DEMO")) {// Notamos el tipo DEMOUsuario .mensaje ("Tipo de juego: DEMO");return true;

}String parte1 = validar . substring(0, donde);String parte2 = validar . substring(donde + 1);String mensaje = "";// Buscamos la contidad de jugadoresint jugadores = cantidad_jugadores(parte2 );if (jugadores > 4) {

// No pueden existir mas de 4 jugadores:Usuario .mensaje ("No es un formato valido: Ingreso mas de 4 jugadores");return false;

}

IIC1103 – Capıtulo 5: Strings 10

Page 11: Strings

if (parte1. equalsIgnoreCase("PC")) {if (jugadores == 0) {

// El tipo PC requiere minimo 1 jugadorUsuario .mensaje ("No es un formato valido: No especifico jugadores para Pc");return false;

}mensaje = "Tipo de juego: PC" + ’\n’ + jugadores(parte2 );

} else if (parte1. equalsIgnoreCase("MULTI")) {if (jugadores < 2) {

// El tipo MULTI requiere minimo 2 jugadoresUsuario .mensaje ("No es un formato valido: no ingreso suficientes jugadores para el tipo Multi");return false;

}mensaje = "Tipo de juego: MULTI" + ’\n’ + jugadores(parte2 );

} else {Usuario .mensaje ("No es un formato valido");return false;

}Usuario .mensaje (mensaje );return true;

}

// Metodo que Determina la cantidad de jugadores existentesstatic int cantidad_jugadores(String jugadores) {

if (jugadores.length () == 0) {return 0;

}int cantidad = 1;for (int i = 0; i < jugadores.length (); i++) {

if (jugadores.charAt(i) == ’-’) {cantidad ++;

}}return cantidad ;

}

// Metodo que retorna El mensaje correspondiente de los jugadoresstatic String jugadores(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 siguiente jugadory++;mensaje += "\nJugador " + y + ": ";

} else {mensaje += parte2.charAt(k);

}}return mensaje ;

}}

IIC1103 – Capıtulo 5: Strings 11

Page 12: Strings

Problema 4: Double

Enunciado

Haga un codigo que permita determinar si un texto ingresado es un double, independiente que el numero esteseparado con: ’.’ o ’,’. De esta forma podemos usar seguros el metodo Double.ParseDouble(String str);.

Criterios de solucion

Observamos que esta es una validacion simple, solo debemos verificar que los caracteres sean numeros, signonegativo, o separadores validos, ademas de que solo exista un separador.Adicionalmente podemos hacer el metodo que transforme las comas en puntos, para que Java pueda manejarel numero.

Posible solucion

import iic1103Package.*;public class Principal {

public static void main(String [] args) {while (true) {

String x = Usuario .texto("Ingrese el decimal a validar ");if (esDouble (x)) {

x = remplazar(x);double numero = Double .parseDouble(x);Usuario .mensaje ("El numero ingresado es: " + numero );break ;

}}

}

// Metodo que valida si un numero es decimalstatic boolean esDouble (String aComprobar) {

if (aComprobar.length () == 0) {// Si es vacio no sera un doublereturn false;

}int comas = 0;if (!(48 <= (int) aComprobar.charAt (0) && (int) aComprobar.charAt (0) <= 57)

&& !((int) aComprobar.charAt (0) == 44 || (int) aComprobar.charAt (0) == 46) && (int) aComprobar.charAt (0) != 45) {

return false;// Si no es un numero, ni un separador ni un signo// ’-’... no es un double

}for (int i = 1; i < aComprobar.length (); i++) {

boolean esnumero = 48 <= (int) aComprobar.charAt(i)&& (int) aComprobar.charAt(i) <= 57;

boolean escoma = (int) aComprobar.charAt(i) == 44|| (int) aComprobar.charAt(i) == 46;

if (!esnumero && !escoma ) {return false;

} else if (aComprobar.charAt(i) == 44 || aComprobar.charAt(i) == 46) {comas++;if (comas > 1)

return false;}

}Usuario .mensaje ("Es un double ");return true;

}

// Metodo que reemplaza la primera ’,’ por ’.’static String remplazar(String s) {

int donde = s.indexOf (",");if(donde !=-1) {

return (s.substring(0, donde) + ’.’ + s. substring(donde + 1));}else{

return s;}

}}

IIC1103 – Capıtulo 5: Strings 12

Page 13: Strings

Problema 5: Operaciones

Enunciado

Realice un metodo que reciba un String con una operacion basica (+,!, ", /) y devuelve el resultado deesa operacion. Por ejemplo si recibe 4,5 + 35 debe devolver 39,5. Para esto puede ocupar solo los siguientesmetodos de la clase String:

charAt, length

Criterios de solucion

Lo primero que debemos hacer es identificar cual es la operacion que se encuentra en el String. Para estoutilizamos un ciclo (un for por ejemplo), para recorrer todo el String e ir obteniendo cada uno de loscaracteres con el metodo charAt. Cada caracter lo comparamos con una de las posibles operaciones. Alencontrar la operacion guardamos el caracter y tambien la posicion donde la encontramos para luego obtenerlos numeros que vienen en el String.Para recuperar los numeros del String, como solo podemos utilizar el metodo charAt, lo que hacemos son dosciclos, uno que recorra la primera parte del string obteniendo cada uno de los caracteres y concatenandolosen un nuevo String que represente el primer numero, y el segundo ciclo que haga lo mismo pero con lasegunda parte del String.Luego transformamos los Strings que representan a los numeros en variables de tipo double y revisando laoperacion encontrada retornamos el resultado de la operacion.

Posible solucion

public double Operacion(String op) {// Debemos identificar cual es la operacion que se encuentra en el Stringchar 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 identificar los valores involucradosdouble valor1 = 0, valor2 = 0;String aux = "";for (int i = 0; i < posOp; i++) {

aux += op.charAt(i);}valor1 = Double. parseDouble(aux);aux = "";for (int i = posOp + 1; i < op.length (); i++) {

aux += op.charAt(i);}valor2 = Double. parseDouble(aux);

if (opDada == ’+’) {return valor1 + valor2;

} else if (opDada == ’-’) {return valor1 - valor2;

} else if (opDada == ’*’) {return valor1 * valor2;

} else {return valor1 / valor2;

}}

IIC1103 – Capıtulo 5: Strings 13

Page 14: Strings

Problema 6: Palabra Abecedaria

Enunciado

Una palabra se dice abecedaria si las letras que la forman se encuentran en orden alfabetico si son leıdas deizquierda a derecha. Por ejemplo, las siguientes palabras cumplen con ser abecedarias:

Amor, filo, chintz, luz, dinos.

Escriba un metodo que permita determinar si una palabra es abecedaria. El metodo debe recibir un stringcomo parametro y retornar verdadero en caso que la palabra sea abecedaria, y falso en caso contrario. Paraesto puede ocupar solo los siguientes metodos de la clase String:

charAt, length, equals, compareTo

Criterios de solucion

Para revisar si la palabra es abecedaria tenemos que ir revisando cada uno de los caracteres y ver que ningunosea mayor (lexicograficamente) que el siguiente. Para eso lo mejor es utilizar un ciclo, un for por ejemplo,para recorrer la palabra entera, caracter por caracter. Utilizando el metodo charAt obtenemos el caracteractual y el siguiente y comparamos si el actual es mayor que el siguiente. Si esto ocurre retornamos false, delo contrario seguimos revisando el resto de la palabra.Ademas de esto tenemos que considerar que pueden haber caracteres en mayuscula, los cuales para que loanterior funcione debemos pasarlos a minuscula. Para esto simplemente le restamos el inicio de las letrasmayusculas (’A’) y le sumamos el inicio de las letras minusculas (’a’).

Posible solucion

public class Palabra {

public boolean abecedaria(String palabra ) {for (int i = 0; i < palabra .length () - 1; i++) {

char primeraLetra = palabra .charAt(i);char segundaLetra = palabra .charAt(i + 1);if (primeraLetra >= ’A’ && primeraLetra <= ’Z’)

primeraLetra = (char) ((int) primeraLetra - (int) ’A’ + (int) ’a’);if (segundaLetra >= ’A’ && segundaLetra <= ’Z’)

segundaLetra = (char) ((int) segundaLetra - (int) ’A’ + (int) ’a’);

if (primeraLetra > segundaLetra)return false;

}return true;

}}

IIC1103 – Capıtulo 5: Strings 14

Page 15: Strings

Problema 7: Combinacion

Enunciado

Implemente una clase llamada Combinacion, la cual recibe dos String en el constructor. Su clase debe tenerun metodo que reciba un char y retorne la cantidad de apariciones de ese char en ambos textos. Un metodoque retorne un String formado por la intercalacion de las letras que forman ambos textos. Otro metodo queretorne el resultado de la comparacion entre dos substrings de los textos, recibiendo como parametros losındices iniciales y finales para cada uno de ellos. Finalmente un metodo que permita reemplazar un ciertochar por otro en ambos textos.Para esto puede ocupar solo los siguientes metodos de la clase String:

charAt, length, equals, compareTo

Criterios de solucion

Lo primero que debemos hacer es declarar la clase Combinacion con dos atributos de tipo String. Luegodebemos crear el constructor, el cual reciba dos Strings como parametros y los asigne a los atributoscorrespondientes.

Para el metodo encargado de contar las apariciones de un char entregado como parametro, lo quetenemos que hacer es un ciclo (for por ejemplo) que recorra ambos Strings y vaya comparando cadauno de sus caracteres, utilizando el metodo charAt e ir contando en una variable cuantas veces elcaracter es igual al recibido como parametro.

Para el metodo que intercale ambos Strings lo que tenemos que hacer es nuevamente implementar unciclo 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 metodotenemos que revisar siempre que el String aun no se acabe ya que puede ocurrir que uno sea mas largoque el otro, en tal caso simplemente intercalamos hasta que se termine el menor y luego concatenamosel resto del mayor.

Para el metodo que compara dos substrings de los textos debemos primero obtener los substrings segunlos datos de inicio y fin recibidos como parametros. Para esto implementamos ciclos que recorran losstrings desde el inicio hasta el fin recibidos como parametros y vayan formando los dos substrings,concatenando los caracteres que se obtienen utilizando el metodo charAt. Luego utilizando el metodoequals o compareTo, revisamos si son iguales, y retornamos true o false segun corresponda.

Para el metodo que reemplace un char por otro lo que podemos hacer es implementar un ciclo querecorra ambos textos y que vaya obteniendo, con el metodo charAt, cada uno de los caracteres. Revi-samos el caracter comparando si es igual al que se quiere reemplazar. Si es ası, concatenamos el nuevochar, si no lo es, concatenamos el char original, formando ası el texto con los caracteres reemplazados.

IIC1103 – Capıtulo 5: Strings 15

Page 16: Strings

Posible solucion

public class Combinacion {private String texto1;private String texto2;

public Combinacion(String t1 , String t2) {texto1 = t1;texto2 = t2;

}

public int Apariciones(char c) {String t = texto1 + texto2 ;int apariciones = 0;for (int i = 0; i < t.length (); i++) {

if (t.charAt(i) == c) {apariciones++;

}}return apariciones;

}

public String Intercalacion() {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) {// Obtenemos ambos substringsString 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 Reemplazar(char charOriginal , char charReemplazo) {String aux = "";for (int i = 0; i < texto1 .length (); i++) {

if (texto1.charAt(i) == charOriginal) {aux += charReemplazo;

} else {aux += texto1.charAt(i);

}}texto1 = aux;aux = "";for (int i = 0; i < texto2 .length (); i++) {

if (texto2.charAt(i) == charOriginal) {aux += charReemplazo;

} else {aux += texto2.charAt(i);

}}texto2 = aux;

}}

IIC1103 – Capıtulo 5: Strings 16

Page 17: Strings

Problema 8: Codigo Simple

Enunciado

Haga un programa que dado un mensaje y un numero codifique el mensaje, moviendo las letras un numerode posiciones igual al numero ingresado, en la tabla ASCII. Por simplicidad puede transformar el mensaje aminusculas. Ademas escriba en el main una prueba del funcionamiento del programa.

Criterios de solucion

Segun el enunciado, primero debemos pedir al usuario el mensaje a codificar y un numero (lo llamaremos basedel codigo). Dados estos numeros debemos obtener el valor de cada letra (solo las letras) en la tabla ASCII,y sumarle la base. Luego imprimiremos el mensaje, para mostrar el mensaje codificado. Para decodificar elmensaje el procedimiento es inverso, debemos restar la base, pero considerando que cambiaron los extremosen que los caracteres corresponden a letras (se suma la base a cada extremo). Ademas debemos decodificarel mensaje con una base distinta, para mostrar que se requiere de esta para poder realizar la operacion.

Posible solucion

import iic1103Package.*;

public class Principal {

public static void main(String [] args) {String mensaje = Usuario .texto("Ingrese el mensaje que desea codificar.");int base = Usuario .entero ("Ingrese la base del codigo");String codificado = codificar(mensaje , base);Usuario .mensaje ("Codificado:\n" + codificado);Usuario .mensaje ("Decodificado Base 10:\n" + decodificar(codificado , 10));Usuario .mensaje ("Decodificado Base " + base + ":\n"

+ decodificar(codificado , base));}

public static String codificar(String mensaje , int base) {String resultado = "";mensaje = mensaje . toLowerCase();for (int i = 0; i < mensaje .length (); i++) {

if (mensaje .charAt(i) >= 97 && mensaje .charAt(i) <= 122) {resultado += (char) (mensaje .charAt(i) + base);

} else {resultado += (char) mensaje .charAt(i);

}}return resultado;

}

public static String decodificar(String mensaje , int base) {String resultado = "";mensaje = mensaje . toLowerCase();for (int i = 0; i < mensaje .length (); i++) {

if (mensaje .charAt(i) >= 97 + base&& mensaje .charAt(i) <= 122 + base) {

resultado += (char) (mensaje .charAt(i) - base);} else {

resultado += (char) mensaje .charAt(i);}

}return resultado;

}}

IIC1103 – Capıtulo 5: Strings 17

Page 18: Strings

Problema 9: Ahorcado

Enunciado

Realice un programa en Java para jugar “Al ahorcado”. Recuerde que este juego consiste en tratar de adivinaruna palabra, letra por letra, en una cantidad preestablecida de intentos. Para este problema suponga que lapalabra (oracion 1) a adivinar es “hola mundo”, aceptando a lo mas 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 lasletras 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, sonen minuscula.

Criterios de solucion

El enunciado nos da pocas restricciones, salvo el mensaje y la cantidad de intentos. Pero sabemos quedebemos validar que el usuario ingrese solo una letra, comparar si corresponde a alguna(s) de la palabrasecreta, y de ser ası cambiarla. Repetir esto mientras no haya ganado (descifrado la palabra completa) operdido (alcanzado el maximo de errores permitidos).

Posible solucion

import iic1103Package.*;public class PrincipalAhorcado {

/** * Programa para jugar el juego del Ahorcado */public static void main(String [] args) {

String palabraClave = "hola mundo"; // palabra clave establecidaint intentos = 3; // cantidad de intentos establecidos// creamos un objetos de la clase AhorcadoAhorcado a1 = new Ahorcado (palabraClave , intentos );// mostramos el mensaje inicialUsuario .mensaje ("Bienvenido! "

+ "\nIntente adivinar la palabra secreta . Tiene " + intentos+ " intentos ");

// ciclo del juego (mientras pueda seguir jugando )while (a1.seguirJugando()) {

// mostrar lo que llevaUsuario .mensaje ("Hasta ahora lleva: " + a1.getPalabraActual());// guardaremos la letra que ingrese el usuarioString palabra = "";// verificamos que sea solo una letrawhile (palabra .length () != 1) {

palabra = Usuario .texto("Ingrese la letra que quiere descubrir: ");}// tomamos el primer caracter del stringchar c = palabra .charAt (0);// preguntar si esta en la palabra secretaa1.preguntarLetra(c);

}// fuera del while (se acabo el juego)// vemos si ganoif (a1.gano()) {

// mostramos el mensaje de felicitacionUsuario .mensaje ("Felicitaciones! Ha descubierto la palabra secreta ");

} else {// perdio , mostramos el mensaje avisandoUsuario .mensaje ("Ha perdido ." + "\n La palabra era: "

+ a1.getPalabraClave());}

}}

1si ingresa una oracion, los espacios no se deben ocultar, es decir, colocando el “ ”

IIC1103 – Capıtulo 5: Strings 18

Page 19: Strings

public class Ahorcado {// [ATRIBUTOS]String palabraClave; // palabra clave del juegoString palabraActual; // palabra que lleva el usuarioint intentosFallidos; // cantidad de intentos fallidosint intentosMaximo; // cantidad de intentos maximos por fallar// [METODOS ]// Constructor de la clasepublic Ahorcado (String palabraClave , int intentosMaximo) {

this.palabraClave = palabraClave;this.intentosFallidos = 0;this.intentosMaximo = intentosMaximo;this.palabraActual = ocultarPalabra(palabraClave);

}// getterspublic int getIntentosActual() {

return intentosFallidos;}public String getPalabraActual() {

return palabraActual;}public String getPalabraClave() {

return palabraClave;}

// Otros ...// metodo que determina si la letra esta en la palabra clavepublic void preguntarLetra(char c) {

if (this.palabraClave.contains (c + "")) {descubrirLetra(c);

} else {this.intentosFallidos++;

}}

// metodo que cambia cada "_" por la letra que correspondepublic void descubrirLetra(char c) {

String aux = "";for (int i = 0; i < this.palabraClave.length (); i++) {

if (this.palabraClave.charAt(i) == c) {aux += this.palabraClave.charAt(i);

} else {aux += this.palabraActual.charAt(i);

}}this.palabraActual = aux;

}

// esconde la palabra clave , cambiando cada caracter por "_"public String ocultarPalabra(String m) {

String s = "";for (int i = 0; i < m.length (); i++) {

if (m.charAt(i) == ’ ’) {s += " ";

} else {s += "_";

}}return s;

}

// determina si se puede seguir jugando (no ha ganado ni perdido )public boolean seguirJugando() {

if (this.intentosFallidos < this.intentosMaximo && !gano()) {return true;

} else {return false;

}}

// determina si ganopublic boolean gano() {

return this.palabraClave.equals(this.palabraActual);}

}

IIC1103 – Capıtulo 5: Strings 19

Page 20: Strings

Problema 10: Jerigonza

Enunciado

La jerigonza, jerigonzo o jerigoncio es una variante ludica del habla2. En jerigonza “escondido” se diceepescopondipidopo.Ademas del entretenimiento, tambien puede usarse como un modo de codificar el mensaje de forma que otraspersonas cercanas a los hablantes no acostumbrados a esta forma de hablar no consigan entender lo que loshablantes dicen.Se le pide realizar un programa que codifique, y decodifique, mensajes escritos en este dialecto. Para ello, sesabe que despues de cada vocal se agrega el sonido “p” y se repite la vocal 3. “Carlos” genera “Caparlopos”.Por simplicidad, puede asumir que el usuario ingresara texto sin tildes Ejemplo: (conversacion)

Hopolapa, ¿copomopo epestapas? (Hola, ¿como estas?)

Yopo epestopoypi bipiepen, ¿ypi tupu? (Yo estoy bien, ¿y tu?)

Tapambiepen, grapacipiapas. (Tambien, gracias.)

Epestapamopos hapablapandopo epen jeperipigoponzapa (Estamos hablando en jerigonza)

Epesopo yapa lopo sapabipiapa (Eso ya lo sabia)

Criterios de solucion

Es realmente facil. Debemos revisar cada letra: si es una vocal se repite como dice el enunciado, y cualquierotro caracter se deja igual, salvo la “y” que se considerara como vocal, siempre y cuando lo que siga nosea una vocal (en este caso, hay que cuidar que no pasemos el largo del string).

2http://es.wikipedia.org/wiki/Jerigonza3la letra “y” tambien sera considerada como vocal cuando corresponda, esto es, cuando no anteceda a alguna vocal

IIC1103 – Capıtulo 5: Strings 20

Page 21: Strings

Posible solucion

import iic1103Package.*;

public class Jerigonza {/*** Programa que escribe el texto ingresado por el usuario como Jerigonza.* (se asume que no ingresa ningun tipo de tilde)*/

public static void main(String [] args) {String texto = Usuario .texto("Ingrese el texto a Jerigonzar");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;

}}

IIC1103 – Capıtulo 5: Strings 21

Page 22: Strings

Problema 11: Cifrado ROT13

Enunciado

Implemente una clase para encriptar/desencriptar mensajes utilizando el mecanismo de cifrado ROT13.La clase debe contener por lo menos dos metodos:

public static String cifrar(String msg);Encripta un mensaje en ROT13.

public static String descifrar(String msg);Desencripta un mensaje en ROT13.

Descripcion de ROT13 (http://es.wikipedia.org/wiki/Rot13/):“ROT13 (“rotar 13 posiciones”) es un sencillo cifrado Cesar utilizado para ocultar un texto sustituyendo cadaletra por la letra que esta trece posiciones por delante en el alfabeto. A se convierte en N, B se convierte enO y ası hasta la M, que se convierte en Z. Luego la secuencia se invierte: N se convierte en A, O se convierteen B y ası hasta la Z, que se convierte en M. Este algoritmo se utiliza en foros de Internet como medio paraocultar de miradas casuales el final de un chiste, la solucion a un acertijo, un spoiler de una pelıcula o unahistoria, o algun texto ofensivo. ROT13 se ha descrito como el “equivalente en Usenet de una revista queimprime bocabajo la respuesta a un pasatiempo”.El nombre “ROT13” se origino en Usenet a principios de los 80, y el metodo se ha convertido en unestandar de facto. El ROT13 no proporciona seguridad criptografica real y no se usa para tales fines; dehecho, a menudo se usa como ejemplo canonico de cifrado debil. Otra caracterıstica de este cifrado es quees simetrico; esto es, para deshacer el ROT13, se aplica el mismo algoritmo, de manera que para cifrar ydescifrar se puede utilizar el mismo codigo.”

Criterios de solucion

Primero debemos tener en cuenta que este mecanismo solo toma en consideracion las 26 letras del abecedario,sin considerar la n. Luego, debemos sumar 13 posiciones a cada caracter; si se ”pasa”de la z, volvemos a laa. Como sabemos que lo char se pueden operar como si fueran enteros, basta con sumar 13 a cada char delString.Un punto muy importante es darse cuenta de que el mecanismo para descifrar es exactamente el mismo quepara cifrar, por lo tanto no hace falta replicar el codigo sino que simplemente el metodo descifrar(..) hara unllamado al metodo cifrar(..).

IIC1103 – Capıtulo 5: Strings 22

Page 23: Strings

Posible solucion

public class Cifrado {

// Declaro un metodo con nombre "cifrar "; retorna una variable de tipo// String y recibe como argumento otro String.public static String cifrar (String msg) {

// Creo una variable de tipo String y la inicializo 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// encuentra en la posicion i del String msg.char x = msg.charAt(i);

// A continuacion utilizare un "truco" para comparar caracteres// utilizando 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 variables 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 mayuscula")

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 resultado.msgRot13 += x;

}// Retorno el String cifrado .return msgRot13 ;

}

// En ROT13 el cifrado y descifrado se realiza con la misma funcion , por lo// tanto en el// metodo descifrar simplemten llamo al metodo cifrar y retorno su valor.public static String descifrar(String msg) {

return cifrar(msg);}

}

IIC1103 – Capıtulo 5: Strings 23

Page 24: Strings

Problema 12: Codificacion

Enunciado

El algoritmo de codificacion del capitan Crunch codifica un mensaje de texto tomando cada una de sus letrasy sumandole 13. Por ejemplo, se convierte la letra ’a’ en ’ n ’ y la letra ’ b ’ en ’ o’. Las letras que se obtienenforman una anillo al final, por lo que al codificar la letra ’z’ esta se convierte en ’m’. El procedimiento generalpara codificar entonces, corresponde a sumar 13 a cada una de las letras, y para decodificar restar 13 a cadaletra. El metodo del capitan Crunch se puede generalizar, de manera que, en lugar de agregar 13 a las letras,se agregue un numero cualquiera.Usted debera implementar la clase Codificador la cual permite codificar y decodificar mensajes usando elalgoritmo antes descrito. Puede suponer que el mensaje solo contiene letras minusculas del alfabeto ingles(i.e. sin ’ch’, ’ll’, ni ’n’). En detalle, su codigo debera cumplir con lo siguiente:

Su clase debe proveer de un metodo constructor que reciba como parametro la cantidad que se debesumar o restar a cada una de letras para codificar o decodificar un mensaje. El constructor debe verificarque el valor recibido sea un entero mayor o igual que 0, y menor o igual que 26. El constructor ademasdebe ser capaz de establecer si fue creado en forma exitosa para que cuando el objeto sea utilizadopara codificar o decodificar, se pueda determinar si la operacion se puede ejecutar o no.

Escriba un metodo que permita codificar y decodificar un mensaje. El metodo recibe como parametroel mensaje y un boolean que indica si se desea codificar (true) o decodificar (false). El metodo retornaun String con el mensaje codificado o decodificado segun sea el caso. En caso que el objeto codificadorno haya sido inicializado en forma exitosa retorna el mensaje ”#ERROR#”.

Para esto puede ocupar solo los siguientes metodos de la clase String:

charAt, length, equals, compareTo

Criterios de solucion

Lo primero que debemos hacer, como nos indica el enunciado, es implementar el constructor de la clase. Estedebe recibir el numero que se sumara y restara para encriptar y desencriptar y guardarlo como atributo.Ademas, como debemos mostrar si el objeto pudo ser creado con exito, y el constructor no puede retornarnada, agregamos otro atributo a la clase que indique si el objeto se creo bien o no.Para el metodo encriptar lo que primero tenemos que hacer es revisar si el objeto se creo con exito. Sino fue ası retornamos el mensaje de error. Luego tenemos que determinar si el usuario desea encriptar odesencriptar, para saber si sumar o restar a cada caracter. A continuacion, debemos sumar (o restar) tantasposiciones como valor determinado por el usuario en el constructor, a cada caracter; si se ”pasa”de la z,volvemos a la a. Como sabemos que los char se pueden operar como si fueran enteros, basta con sumar (orestar) la cantidad adecuada a cada char del String.

IIC1103 – Capıtulo 5: Strings 24

Page 25: Strings

Posible solucion

public class Codificador {private int millave ;private boolean habilitado;

public Codificador(int llave) {if (( llave >= 0) && (llave <= 26)) {

millave = llave;habilitado = true;

} else {habilitado = false;

}}

public String encriptar(String mensaje , boolean encriptar) {String encriptado = "";int cero = ’a’ - 1;

int llaveActual = millave ;if (! encriptar)

llaveActual *= -1;

for (int i = 0; i < mensaje .length (); i++) {char letra = mensaje .charAt(i);int valor = letra;if (letra != ’ ’) {

valor = letra + llaveActual - cero;if (encriptar) {

if (valor > 26)valor %= 26;

} else {if (valor < 0)

valor = 26 + valor;}valor += cero;

}encriptado += (char) (valor);

}

if (habilitado)return encriptado;

return "#ERROR#";}

}

IIC1103 – Capıtulo 5: Strings 25

Page 26: Strings

Problema 13: Encriptar

Enunciado

Se desea enviar mensajes encriptados. Para ello, Ud. debera crear un algoritmo que encripte un mensajecualquiera, siguiendo esta estrategia: Ordene el mensaje ingresado, de manera que forme un cuadrado perfecto(el numero de filas es igual al numero de columnas). No debe considerar los espacios en blanco. En caso deque el numero de letras no den un cuadrado perfecto, anada el caracter de relleno ”@”. Finalmente, lea elmensaje de arriba abajo y de izquierda a derecha. A continuacion se presenta un ejemplo:

// Mensaje original"Mensaje a ser encriptado"// Este seria nuestro cuadrado , se eliminan los espacios y se agregan @Mensajeaserencriptado@@@@// Mensaje resultante"Mjrioeeep@nant@ssca@aerd@"

Aquı se encuentra la clase principal Encriptador que hace uso de la clase Cypher. Ud. debera implementartodos los metodos de la clase Cypher que son invocados por el Encriptador:

import iic1103Package.*;public class Encriptador {

public static void main(String [] args) {Cypher c = new Cypher ();String msg = Usuario .texto("Ingrese el mensaje a encriptar");

// Quitar espacios del mensaje ingresadomsg = c.QuitarEspacios(msg);

// Determinar el tamanio del Cuadrado (nro. filas = nro. columnas )int nro_filas = c.CuadradoPerfecto(msg);

// Algoritmo de encriptacionString msg2 = c. Encriptar(msg , nro_filas);Usuario .mensaje (msg2);

}}

Criterios de solucion

Metodo QuitarEspacios: En este metodo tenemos que recorrer el String e ir obteniendo cada caractercon el metodo charAt y revisar si es igual al caracter que representa el espacio. Si no es igual loconcatenamos al String final. Ası el String que retornamos no contiene ningun espacio.

Metodo CuadradoPerfecto: En este metodo tenemos que determinar el numero de filas (igual alnumero de columnas). Para esto utilizamos el metodo Math.sqrt con el largo del String, considerandoque si la raiz no es exacta tenemos que sumar uno al resultado para poder considerar todas las letrasdel mensaje.

Metodo Encriptar: Lo primero que tenemos que hacer es revisar si el mensaje ocupa todas las posi-ciones 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 conun ciclo vamos recorriendo todo el String. Dentro de este ciclo implementamos otro, el cual vaya ob-teniendo los caracteres para concatenar en la respuesta final. Para obtener los caracteres tenemos queavanzar tantas posiciones como el numero de columnas tenga el cuadrado, ası estaremos recorriendo elcuadrado leyendo por columna.

IIC1103 – Capıtulo 5: Strings 26

Page 27: Strings

Posible solucion

public class Cypher {public String Encriptar(String s, int total) {

String respuesta = "";

// aniadir caracteres extrawhile (s.length () < (total * total))

s = s + "@";// llenar el cuadradofor (int i = 0; i < total; i++) {

for (int j = i; j < s.length (); j = j + total)respuesta = respuesta + s.charAt(j);

}return respuesta;

}

public int CuadradoPerfecto(String s) {int total = (int) Math.sqrt(s.length ());if (total * total != s.length ())

total ++;return total;

}

public String QuitarEspacios(String s) {String otro = "";for (int i = 0; i < s.length (); i++) {

if (s.charAt(i) != ’ ’)otro += s.charAt(i);

}return otro;

}}

IIC1103 – Capıtulo 5: Strings 27

Page 28: Strings

Problema 14: Nombre de Usuario

Enunciado

Cada alumno de la Universidad tiene un nombre de usuario, que es el nombre al cual se le envıa e-mail enel dominio de la Universidad. Este nombre de usuario se determina a partir del nombre real del alumno yesta compuesto por 8 caracteres que pueden ser letras o numeros.Escriba la clase NombredeUsuario, que tiene como atributos al menos el nombre real del alumno, el nombrede usuario inicial, y el nombre de usuario final. Ademas, esta clase debe tener al menos los siguientes tresmetodos:

Un constructor, que recibe como parametros cuatro strings, correspondientes al primer nombre, segundonombre, primer apellido y segundo apellido del alumno. Si el alumno tiene solo un nombre, el parametrocorrespondiente al segundo nombre es un String vacıo. En el atributo, el nombre real del alumnodebe quedar escrito en la forma familiar <primer nombre> <segundo nombre> <primer apellido><segundo apellido>, o bien <primer nombre> <primer apellido><segundo apellido> (notar que hay espacios en blanco).

Un metodo nombreUsuarioInicial, que determina el nombre de usuario inicial del alumno, a partir desu nombre real, y lo guarda en el atributo correspondiente. El nombre de usuario inicial esta formadopor la inicial del primer nombre, seguido por la inicial del segundo nombre, y seguido por las seisprimeras letras del primer apellido (para totalizar los 8 caracteres) Si el alumno no tiene segundonombre, entonces la inicial del segundo nombre es reemplazada por la segunda letra del primer nombre.Si el primer apellido tiene menos de seis letras, entonces las letras faltantes son reemplazadas por lasprimeras letras del segundo apellido.

Un metodo nombreUsuarioFinal , que recibe como parametro un string con todos los nombres deusuario validos en la Universidad (cada uno separado por un punto), y que determina el nombre deusuario final del alumno y lo guarda en el atributo correspondiente. Para determinar el nombre deusuario final hay que revisar el string de nombres de usuario validos. Si el nombre de usuario inicialno aparece en el string, entonces el nombre de usuario final es igual al inicial. En cambio, si el nombrede usuario inicial aparece en el string, entonces el nombre de usuario final se determina de la siguientemanera: se elige aleatoriamente un numero entre 1 y 7, y se cambia la letra que esta en esa posicionen el nombre de usuario inicial por uno de los dıgitos 1 al 9, tambien elegido aleatoriamente.

Suponga que siempre la cantidad de letras del apellido paterno mas la cantidad de letras del apellido maternoes al menos 6.

Criterios de solucion

Atributos: Lo primero que tenemos que hacer es declarar los atributos de la clase como nos indicanel enunciado. Para esto utilizamos 3 Strings para guardar el nombre de usuario inicial, el nombre realy el nombre de usuario final. Ademas podemos guardar los nombres y apellidos del usuario en otrosStrings.

Constructor: Recibimos los parametros que nos indica el enunciado y revisamos si el segundo nombreviene nulo. Segun esto formamos el nombre real.

Metodo nombreUsuarioInicial : Lo primero que tenemos que hacer es revisar si el usuario tienesegundo nombre. Si es ası tomamos el primer caracter (con el metodo charAt()) del primer nombre yel primer caracter del segundo nombre. Si no, tomamos los dos primeros caracteres del primer nombre.Concatenamos los caracteres obtenidos en el atributo que representa el nombre de usuario inicial.Luego, revisamos, con el metodo length(), si el apellido del usuario tienen mas de 6 letras. Si es ası,con el metodo substring obtenemos las 6 primeras letras y las concatenamos al nombre de usuario

IIC1103 – Capıtulo 5: Strings 28

Page 29: Strings

inicial. Si no, calculamos cuantas letras nos faltan y ademas del primer apellido concatenamos las letrasque faltan del segundo apellido.

Metodo nombreUsuarioFinal: Recibimos el String con los nombres de usuario ya existente y utilizandoel metodo contains revisamos si el nombre de usuario formado esta contenido en los nombres deusuarios recibidos. Si es ası, generamos aleatoriamente dos numeros: uno que determine la posiciony otro que sea el numero a intercalar en esa posicion. Luego con el metodo substring separamosel nombre de usuario inicial en dos y luego concatenamos la primera mitad, mas el dıgito generadoaleatoriamente mas la segunda mitad y tenemos el nombre de usuario final.

Posible solucion

import iic1103Package.*;public class NombredeUsuario {

private String nombreReal;private String nomUsuIni;private String nombreUsuario;private String nombre1 , nombre2 , apellido1 , apellido2;

public NombredeUsuario(String nom1 , String nom2 , String ap1, String ap2) {nombre1 = nom1;nombre2 = nom2;apellido1 = ap1;apellido2 = ap2;

if (nom2.length () == 0) {nombreReal = nombre1 + " " + apellido1 + " " + apellido2;

} else {nombreReal = nombre1 + " " + nombre2 + " " + apellido1 + " "

+ apellido2;}

}

public void nombreUsuarioInicial() {if (nombre2 .length () == 0) {

nomUsuIni = "" + nombre1 .charAt (0) + nombre1 .charAt (1);} else {

nomUsuIni = "" + nombre1 .charAt (0) + nombre2 .charAt (0);}

if (apellido1.length () >= 6) {nomUsuIni = nomUsuIni + apellido1.substring(0, 6);

} else {int k = 6 - apellido1. length ();nomUsuIni = nomUsuIni + apellido1 + apellido2.substring(0, k);

}}

public void nombreUsuarioFinal(String usuarios ) {

if (! usuarios .contains ( nomUsuIni)){nombreUsuario = nomUsuIni;

} else {int p = Aleatorio.entero (1, 7);int q = Aleatorio.entero (1, 9);nombreUsuario = nomUsuIni.substring(0, p) + q

+ nomUsuIni.substring(p + 1, 8);}

}}

IIC1103 – Capıtulo 5: Strings 29

Page 30: Strings

Problema 15: Mensaje Oculto

Enunciado

El servicio secreto le ha encomendado la tarea de implementar un programa que pueda descifrar mensajesocultos que se esperan recibir de un agente encubierto en la mafia de las revistas de farandula.Se espera que este agente utilice el primer y ultimo caracter de cada lınea de los textos para esconder losmensajes, de manera que para leer el mensaje se deben leer los primeros caracteres de cada lınea desde arribahacia abajo y luego seguir con los ultimos caracteres de cada lınea pero desde abajo hacia arriba (salvo laultima lınea, en la cual solo se considera en el mensaje su primer caracter). Ademas, si el caracter es una letramayuscula, implicara que comienza una nueva palabra en el mensaje oculto, mientras que si es un punto ‘.’o coma ‘,’ sera equivalente a un espacio (que separara dos palabras contiguas). Por ejemplo, si tenemos elsiguiente texto:

Mientras con ansias a su perroesperaba, muchas preocupacionesGustavo tenıa. Esperarunos minutos mas su espiritusocavaba escuchando el tic tactembloroso de su reloj. Sin embargo,a pesar de la larga espera, finalmenteEinstein, su perro, volvio a su apreciado habitatsembrando la alegrıa en su querido amigo.

El mensaje resultante sera “Me Gusta Este curso” (no se preocupe de mayusculas y minusculas en el mensajeresultante).

En concreto, se le solicita que escriba una clase Decifrador con un constructor que reciba el texto a descifrary un metodo descubrirMensaje que entregue como resultado el mensaje descifrado a partir del texto (sinperjuicio de que ademas agregue todos los atributos y metodos que estime necesarios). De esta manera, suclase debera poder ser usada de la siguiente forma:

String mensaje = "Mientras con ansias a su perro \n esperaba, muchas preocupaciones\nGustavo tenıa. Esperar\n unos minutos mas su espıritu\n socavaba escuchando el tic tac\ntembloroso de su reloj. Sin embargo,\n a pesar de la larga espera, finalmente \nEinstein,su perro, volvio a su habitat\n sembrando alegrıa en su querido amigo.";

Decifrador decifrador = new Decifrador(mensaje);

Usuario.mensaje(decifrador.descubrirMensaje());

NOTA: Puede suponer que no habra caracteres con tilde (a, e, ı,. . . ) ni n al principio y final de cada lınea.

Criterios de solucion

Constructor: Simplemente recibimos como parametro un String que represente el mensaje y lo asigna-mos al atributo de la clase.

Metodo descubrirMensaje: En este metodo recorremos el String buscando el caracter de fin de lınea(obtenemos cada caracter con el metodo charAt()). Cuando encontramos el salto de lınea obtenemosel caracter que esta a la izquierda (que serıa el ultimo caracter de la lınea) y el que esta a la derecha(que serıa el primer caracter de la siguiente lınea). Revisamos si se trata de un caracter especial (como

IIC1103 – Capıtulo 5: Strings 30

Page 31: Strings

punto ‘.’ o coma ‘,’ o una letra mayuscula) para agregar espacios cuando corresponda y formamos dosstrings: uno que represente las letras iniciales de cada lınea y otro las finales, tomando en cuenta queal que represente las letras finales hay que ir agregando los nuevos caracteres al inicio y no al final.Ası despues concatenamos estos dos Strings y tenemos el mensaje descifrado.

Posible solucion

public class Descifrador {private String texto;

public Descifrador(String texto) {this.texto = texto;

}

public String descubrirMensaje() {String resultadoIzquierdo = "" + texto.charAt (0);String resultadoDerecho = "";char caracterIzquierdo;char caracterDerecho;for (int i = 1; i < texto.length () - 1; i++) {

char caracterActual = texto.charAt(i);if (caracterActual == ’\n’) {

caracterIzquierdo = texto.charAt(i - 1);caracterDerecho = texto.charAt(i + 1);resultadoIzquierdo += interpretarCaracter(caracterDerecho);resultadoDerecho = interpretarCaracter(caracterIzquierdo)

+ resultadoDerecho;}

}return resultadoIzquierdo + resultadoDerecho;

}

private String interpretarCaracter(char caracter ) {if (caracter >= ’A’ && caracter <= ’Z’) {

return " " + caracter ;} else if (caracter == ’.’ || caracter == ’,’) {

return " ";}return "" + caracter ;

}}

IIC1103 – Capıtulo 5: Strings 31

Page 32: Strings

Problema 16: Tap Code

Enunciado

El Tap Code es una forma de encriptar mensajes usada por prisioneros en Vietnam. Es un metodo muysimple que consiste en traducir cada letra de un mensaje en una serie de sonidos hechos con metal, madera,etc. (”taps”) y pausas. Tambien puede ser representado graficamente. En este caso cada letra se traduce endos series de puntos separados por un espacio, que representan dos numeros indicando la fila y columna quecorresponde a la letra en una matriz de claves de 5x5. Por ejemplo, dada la matriz de la figura, la letra ”D”esta en la fila 1, columna 4, por lo que se representa por los puntos ”. ....”(1, 4).

La palabra ”MENSAJE” se traducirıa de la siguiente manera.

Las letras de una palabra tambien van separadas entre sı por 1 espacio, al final de la serie de puntos no debeir un espacio. Otras consideraciones: la letra K se considera que es una C, la letra N se considera como sifuera N, se ignora todo otro sımbolo fuera de la matriz de claves.Se pide que implemente el metodo aTap de la clase Cipher que recibe dos Strings, uno contiene el mensajeoriginal, y el otro un String con los caracteres de la matriz, ambos Strings en mayusculas. El metodo aTapdevuelve un String conteniendo la serie de puntos equivalentes en el Tap Code. Note que si recibe comomensaje un String vacıo o nulo, debe retornar el mismo mensaje original sin ningun cambio.

import iic1103Package.*;public class Principal {

public static void main(String [] args) {String matriz = "ABCDEFGHIJLMNOPQRSTUVWXYZ";Cypher c = new Cypher ();String mensaje = Usuario .texto("Mensaje ?");// Convierte el mensaje a mayusculasmensaje = mensaje . toUpperCase();Usuario .mensaje (c.aTap(mensaje , matriz ));

}}

public class Cypher {

public String aTap(String original , String matriz) {// Implementar el metodo que convierte a original en una//lista de puntos siguiendo las reglas del TapCode

}}

Criterios de solucion

Lo primero que tenemos que hacer en el metodo aTap es revisar que el String original recibido como parametrono sea vacıo. Si es ası, simplemente retornamos el mismo String.

IIC1103 – Capıtulo 5: Strings 32

Page 33: Strings

Si el String no esta vacıo debemos recorrerlo con un ciclo para obtener cada letra que lo compone, utilizandopara esto el metodo charAt. Al obtener la letra debemos revisar si se trata de una C o una N y cambiarlasa C y N respectivamente.Luego tenemos que encontrar la posicion de la letra en la matriz recibida como parametro. Si vemos la matrizcomo un String extendido podemos ver que la fila de la letra estara dada por la posicion de la letra en elString divido en 5 (ya que son 5 filas y 5 columnas). Y la columna de la letra estara dada por el resto dela division de la posicion de la letra en el String por 5. Despues de eso solo tenemos que imprimir tantospuntos como la fila y la columna encontrada, separando cada uno con un espacio.

Posible solucion

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 FINALif (puntos.length () > 0) {

puntos = puntos. substring(0, puntos.length () - 1);}return puntos;

}

IIC1103 – Capıtulo 5: Strings 33

Page 34: Strings

Problema 17: Integrantes Familia

Enunciado

Usted debera realizar un programa que permita manejar a los integrantes de distintas familias, ası comoa los pasatiempos de cada uno de esos integrantes. Para ello contara con un metodo main que ya vieneimplementado.El programa lo dividiremos en 3 subconjuntos incrementales. Le recomendamos no comenzar con el siguientesubconjunto hasta terminar y probar el funcionamiento correcto del subconjunto actual.No puede utilizar el metodo contains de la clase String.

Incremento 1

En este primer incremento debera definir lo basico de las clases Familia y Persona, de modo de podercrearlas. Una Persona esta caracterizada por su nombre, su edad y su genero, el cual se representa con un0 si es hombre o un 1 en caso que sea mujer. Ademas cada persona tiene sus pasatiempos, los cuales serepresentan con un string en el cual se van concatenando los pasatiempos que se van agregando. Su clasePersona debe cumplir con los usos dados en el main dado, el cual usted no puede modificar.Por su parte Familia esta caracterizado por los apellidos de la familia y por hasta 5 personas que son losintegrantes de la familia. Al igual que Persona, Familia debe poder ser utilizada con el main predefinido,por lo que debe coincidir los nombres de los metodos que ahı se encuentran ası como los parametros de cadauno.

Incremento 2

Ahora que ya estan creadas las familias, debe agregar los metodos necesarios a sus clases para que sea posiblemostrar en consola cada familia. Una familia se muestra indicando sus apellidos y el nombre, edad y generode cada uno de sus integrantes. Este es un ejemplo de como se muestra una familia en consola:***************************************************Familia : Palma SepulvedaJuan (25 - Hombre)Maria (43 - Mujer)Pedro (12 - Hombre)Pablo (48 - Hombre)***************************************************

Ademas cada familia debe ser capaz de retorna el promedio de edad de la familia, para que ası el main puedamostrarlos.

Incremento 3

Por ultimo debe ser posible buscar el numero de integrantes que tiene un cierto pasatiempo en cada familia.Pudiendo tambien realizar esta busqueda en un genero en particular. Nuevamente debe cumplir con lo defi-nido en el main.

import iic1103Package.*;public class Principal {

public static void main(String [] args) {/* ************************************************************************ Iteracion 1*/

// Creamos todas las familias con sus respectivas personas y pasatiemposFamilia f1 = new Familia ("Palma Sepulveda");Persona p11 = new Persona ("Juan", 25, 0);p11.agregarPasatiempo("Futbol ");p11.agregarPasatiempo("Piano");Persona p12 = new Persona ("Maria", 43, 1);p12.agregarPasatiempo("Leer");Persona p13 = new Persona ("Pedro", 12, 0);p13.agregarPasatiempo("TV");p13.agregarPasatiempo("Futbol ");

IIC1103 – Capıtulo 5: Strings 34

Page 35: Strings

Persona p14 = new Persona ("Pablo", 48, 0);p14.agregarPasatiempo("Leer");p14.agregarPasatiempo("Futbol ");p14.agregarPasatiempo("Comer");f1.agregarIntegrante(p11);f1.agregarIntegrante(p12);f1.agregarIntegrante(p13);f1.agregarIntegrante(p14);

Familia f2 = new Familia ("Langdon Alarcon ");Persona p21 = new Persona ("Carolina ", 13, 1);p21.agregarPasatiempo("Bailar ");p21.agregarPasatiempo("Leer");Persona p22 = new Persona ("Isabel", 17, 1);p22.agregarPasatiempo("Cantar ");p22.agregarPasatiempo("Leer");p22.agregarPasatiempo("Futbol ");Persona p23 = new Persona ("Jose", 30, 0);p23.agregarPasatiempo("Futbol ");p23.agregarPasatiempo("Comer");f2.agregarIntegrante(p21);f2.agregarIntegrante(p22);f2.agregarIntegrante(p23);

Familia f3 = new Familia ("Eterovic Zavala");Persona p31 = new Persona ("Yadran", 45, 0);p31.agregarPasatiempo("Tenis");p31.agregarPasatiempo("Leer");Persona p32 = new Persona ("Tere", 19, 1);p32.agregarPasatiempo("Comer");p32.agregarPasatiempo("Leer");p32.agregarPasatiempo("Bailar ");Persona p33 = new Persona ("Sole", 30, 1);p33.agregarPasatiempo("Leer");Persona p34 = new Persona (" Sebastian", 52, 0);p33.agregarPasatiempo("Tenis");p33.agregarPasatiempo("Cocinar ");p33.agregarPasatiempo("Comer");Persona p35 = new Persona (" Francisco", 35, 0);p33.agregarPasatiempo("Futbol ");p33.agregarPasatiempo("Leer");Persona p36 = new Persona ("Matias", 25, 0);p33.agregarPasatiempo("Futbol ");p33.agregarPasatiempo("Cocinar ");f3.agregarIntegrante(p31);f3.agregarIntegrante(p32);f3.agregarIntegrante(p33);f3.agregarIntegrante(p34);f3.agregarIntegrante(p35);// El metodo agregar persona debe retornar false si no es posible// hacerlo porque ya esta llena la familia .if (!f3.agregarIntegrante(p36)) {

Usuario .mensajeConsola("No se pudo agregar " + p36.getNombre()+ " a la familia " + f3.getApellidos());

}Familia f4 = new Familia ("Peralta Jara");Persona p41 = new Persona ("Fernando ", 26, 0);p41.agregarPasatiempo("Tenis");p41.agregarPasatiempo("Leer");p41.agregarPasatiempo("Cantar ");Persona p42 = new Persona ("Cata", 24, 1);p42.agregarPasatiempo("Bailar ");p42.agregarPasatiempo("Yoga");p42.agregarPasatiempo("Cocinar ");p42.agregarPasatiempo("Viajar ");f4.agregarIntegrante(p41);f4.agregarIntegrante(p42);

/* ************************************************************************ Iteracion 2*/

// Mostramos cada familiaf1.mostrarFamilia();f2.mostrarFamilia();f3.mostrarFamilia();f4.mostrarFamilia();

IIC1103 – Capıtulo 5: Strings 35

Page 36: Strings

// Mostramos el promedio de edad de cada familiaUsuario .mensajeConsola("Edad Familia : " + f1.getApellidos() + " - "

+ f1.promedioEdad());Usuario .mensajeConsola("Edad Familia : " + f2.getApellidos() + " - "

+ f2.promedioEdad());Usuario .mensajeConsola("Edad Familia : " + f3.getApellidos() + " - "

+ f3.promedioEdad());Usuario .mensajeConsola("Edad Familia : " + f4.getApellidos() + " - "

+ f4.promedioEdad());

/* ************************************************************************ Iteracion 3*/

// Buscamos la cantidad de personas con pasatiempo Futbol en cada// familiaUsuario .mensajeConsola("Personas que les gusta el futbol Familia : "

+ f1.getApellidos() + " - "+ f1.integrantesConPasatiempo("Futbol"));

Usuario .mensajeConsola("Personas que les gusta el futbol Familia : "+ f2.getApellidos() + " - "+ f2.integrantesConPasatiempo("Futbol"));

Usuario .mensajeConsola("Personas que les gusta el futbol Familia : "+ f3.getApellidos() + " - "+ f3.integrantesConPasatiempo("Futbol"));

Usuario .mensajeConsola("Personas que les gusta el futbol Familia : "+ f4.getApellidos() + " - "+ f4.integrantesConPasatiempo("Futbol"));

// Ahora mostramos la cantidad de mujeres que les gusta leer por cada// familiaUsuario .mensajeConsola("Mujeres que les gusta leer Familia : "

+ f1.getApellidos() + " - "+ f1.integrantesConPasatiempoPorGenero("Leer", 1));

Usuario .mensajeConsola("Mujeres que les gusta leer Familia : "+ f2.getApellidos() + " - "+ f2.integrantesConPasatiempoPorGenero("Leer", 1));

Usuario .mensajeConsola("Mujeres que les gusta leer Familia : "+ f3.getApellidos() + " - "+ f3.integrantesConPasatiempoPorGenero("Leer", 1));

Usuario .mensajeConsola("Mujeres que les gusta leer Familia : "+ f4.getApellidos() + " - "+ f4.integrantesConPasatiempoPorGenero("Leer", 1));

}}

Criterios de solucion

Clase Persona

• Atributos: Declaramos los atributos necesarios segun nos indican en el enunciado: dos String, unopara el nombre y otro para los pasatiempos y dos enteros, uno para representar la edad y otropara representar el genero.

• Constructor: Lo declaramos segun el uso mostrado en la clase Principal. Recibe como parametrosel nombre, la edad y el genero y los asigna a los atributos correspondientes.

• Metodo agragarPasatiempo: Lo declaramos segun el uso mostrado en la clase Principal. Recibecomo parametro un String con el hobbie a agregar y tenemos que concatenarlo al String quealmacena los pasatiempos.

• Getters: Segun 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 determinadopasatiempo (para cumplir con lo pedido en el incremento 3), puede hacerse tambien solo en laclase Familia. Lo que hacemos es buscar el pasatiempo generando todos los substrings desde lalista de pasatiempos que tengan el mismo largo que el pasatiempo recibido y comparar hastaencontrar alguna coincidencia.

• Metodo mostrar: Revisamos el genero de la persona y segun eso mostramos en Consola su edadseguida de ’Hombre’ o ’Mujer’ segun corresponda.

IIC1103 – Capıtulo 5: Strings 36

Page 37: Strings

Clase Familia:

• Atributos: Declaramos los atributos necesarios segun lo que se nos indica en el enunciado: un Stringpara guardar los apellidos y cuatro objetos de la clase Persona que representen a los integrantes.

• Constructor: Lo declaramos segun el uso mostrado en la clase Principal. Recibe como parametroun String con los apellidos y lo asigna al atributo correspondiente.

• Metodo agregarIntegrante: Lo declaramos segun el uso mostrado en la clase Principal. Recibecomo parametro un objeto de la clase Persona. Tenemos que revisar a que objeto, de los 4 quetenemos como atributos, debemos asignarlo, revisando cual de ellos es todavıa null. Retornamostrue o false segun 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 invalido para elgenero.

• Metodo integrantesConPasatiempoPorGenero: Recorremos todas las personas y en cada unarevisamos que no sea nula y que tenga el pasatiempo solicitado (llamando al metodo que imple-mentamos en la clase Persona). Ademas, en caso que el genero sea valido, tambien revisamos queel genero de la persona corresponda. Si se cumplen ambas condiciones aumentamos el contadorde personas, el cual retornamos al finalizar el metodo.

Posible solucion

import iic1103Package.*;

public class Familia {// Definimos los atributos necesariosprivate String apellidos;// Definimos las personas que pueden integrar la familiaprivate Persona integrante1;private Persona integrante2;private Persona integrante3;private Persona integrante4;private Persona integrante5;

public Familia (String apellidos) {this.apellidos = apellidos;

}

public Persona obtenerPersona(int idx) {// Obtenemos la persona segun el indice de ellaif (idx == 0)

return integrante1;else if (idx == 1)

return integrante2;else if (idx == 2)

return integrante3;else if (idx == 3)

return integrante4;else

return integrante5;}

public boolean agregarIntegrante(Persona p) {// Para agregar un nuevo integrante buscamos aquel que aun sea nuloif (integrante1 == null) {

integrante1 = p;} else if (integrante2 == null) {

integrante2 = p;

IIC1103 – Capıtulo 5: Strings 37

Page 38: Strings

} else if (integrante3 == null) {integrante3 = p;

} else if (integrante4 == null) {integrante4 = p;

} else if (integrante5 == null) {integrante5 = p;

} else {// Si no hay ninguno vacio entonces retornamos falsereturn false;

}return true;

}

public double promedioEdad() {// Declaramos una variable donde acumularemosdouble promedio = 0;int count = 0;// Recorremos todas las personasfor (int i = 0; i < 5; i++) {

Persona p = obtenerPersona(i);if (p != null) {

// En caso de estar la persona acumulamos su edadpromedio += p.getEdad ();count++;

}}return promedio / count;

}

public int integrantesConPasatiempo(String hobbie) {// Llamamos al metodo que busca con genero definiendo un valor invalido// para el generoreturn integrantesConPasatiempoPorGenero(hobbie , -1);

}

public int integrantesConPasatiempoPorGenero(String hobbie , int genero) {int count = 0;// Recorremos todas las personasfor (int i = 0; i < 5; i++) {

Persona p = obtenerPersona(i);// Revisamos que no sea nula y que tenga el pasatiempo solicitado.// Ademas en caso de que el// genero sea valido tambien restringimos por elif (p != null && p.tienePasatiempo(hobbie)

&& (genero == -1 || p.getGenero() == genero ))count++;

}return count;

}

public void mostrarFamilia() {// Mostramos los apellidos y luego a cada una de las personasUsuario .mensajeConsola("***************************************************");Usuario .mensajeConsola("Familia : " + apellidos);for (int i = 0; i < 5; i++) {

Persona p = obtenerPersona(i);if (p != null) {

p.mostrar ();}

}Usuario .mensajeConsola("***************************************************");

}

public String getApellidos() {return apellidos;

}}

import iic1103Package.*;

public class Persona {// Definimos los atributos minimos necesariosprivate String nombre;private int edad;private int genero;private String pasatiempos;

IIC1103 – Capıtulo 5: Strings 38

Page 39: Strings

public Persona (String nombre , int edad , int genero) {// Inicializamos los valores para la persona , en un principio no tiene// pasatiemposthis.nombre = nombre;this.edad = edad;this.genero = genero;this.pasatiempos = "";

}

public void agregarPasatiempo(String hobbie) {// Al agregar un pasatiempo lo agregamos al String que los representapasatiempos += " - " + hobbie;

}

public String getNombre() {return nombre;

}

public int getEdad () {return edad;

}

public int getGenero() {return genero;

}

public boolean tienePasatiempo(String hobbie) {// Buscamos el pasatiempo generando todos los substrings desde la lista// de pasatiempos que tengan el mismo largo que el pasatiempo recibidofor (int i = 0; i <= pasatiempos.length () - hobbie.length (); i++) {

String aux = pasatiempos.substring(i, i + hobbie.length ());if (aux.equalsIgnoreCase(hobbie )) {

return true;}

}return false;

}

public void mostrar () {if (genero == 0) {

Usuario .mensajeConsola( nombre + " (" + edad + " - Hombre)");} else {

Usuario .mensajeConsola( nombre + " (" + edad + " - Mujer)");}

}}

IIC1103 – Capıtulo 5: Strings 39

Page 40: Strings

Problema 18: Modelos de Automovil

Enunciado

Usted debera realizar un programa que permita manejar los modelos pertenecientes a distintas marcas deautomoviles, ası como las caracterısticas de estos modelos. Para ello debera trabajar con un metodo mainque ya viene implementado.El programa lo dividiremos en 3 subconjuntos incrementales. Le recomendamos no comenzar con el siguientesubconjunto hasta terminar y probar el funcionamiento correcto del subconjunto actual.

Incremento 1

En este primer incremento debera definir lo basico de las clases Marca y Modelo, para poder crearlas. UnModelo esta caracterizado por el nombre del modelo, el ano en que salio al mercado, y el tipo de vehıculoque es, el cual se representa con un 0 si corresponde a un modelo sedan, un 1 si se trata de un station wagon,y un 2 en caso que sea una camioneta. Ademas cada modelo tiene sus propias caracterısticas, las cuales serepresentan con un string en el cual se van concatenando las caracterısticas que se van agregando al modelo.Su clase Modelo debe cumplir con los usos dados en el main provisto, el cual usted no puede modificar.Por su parte, una Marca esta caracterizada por los modelos que componen su lınea de produccion, pudiendoser hasta cuatro como maximo. Al igual que Modelo, la clase Marca debe poder ser utilizada con el mainpredefinido, por lo que en su implementacion deben coincidir los nombres y parametros de los metodos queahı se encuentran.

Incremento 2

Ahora que ya estan creadas las marcas y sus modelos, debe agregar los metodos necesarios a sus clases paraque sea posible mostrar en consola el catalogo de cada marca. Para una marca, este catalogo se muestraindicando su nombre y, para cada uno de sus modelos, la informacion correspondiente al nombre del modelo,su ano y su tipo. Por ejemplo, para una de las marcas el mensaje debe mostrarse como el siguiente:

***************************************************Marca: Hyundai

Accent, 2008, SedanSonata, 2007, SedanH-1, 2005, Station Wagon

***************************************************

Ademas, cada marca debe ser capaz de retornar la cantidad de modelos del ano 2008 que posee en sucatalogo, para que ası el main pueda mostrar los mensajes correspondientes.

Incremento 3

Por ultimo, debe complementar sus clases de modo que sea posible imprimir el catalogo de cada marcasolo con los modelos correspondientes a un ano especıfico, como tambien buscar el numero de modelos quepresenten una cierta caracterıstica en cada marca, permitiendo adicionalmente realizar esta busqueda paraun tipo de vehıculo en particular. Nuevamente debe cumplir con lo ya definido en el metodo main que se leentrega al comenzar su trabajo.

IIC1103 – Capıtulo 5: Strings 40

Page 41: Strings

import iic1103Package.*;

public class Principal {public static void main(String [] args) {

/** Incremento 1 */// Creamos marcas y agregamos modelos con distintas caracteristicasMarca marca1 = new Marca("Hyundai ");Modelo modelo11 = new Modelo("Accent", 2008, 0);modelo11 . agregarCaracteristica("Llantas ");modelo11 . agregarCaracteristica("Alzavidrios Electricos");modelo11 . agregarCaracteristica("Radio CD");modelo11 . agregarCaracteristica("Mecanico ");modelo11 . agregarCaracteristica("Aire Acondicionado");Modelo modelo21 = new Modelo("Sonata", 2007, 0);modelo21 . agregarCaracteristica("Aire Acondicionado");modelo21 . agregarCaracteristica("Automatico");modelo21 . agregarCaracteristica("Neblineros");modelo21 . agregarCaracteristica("Alzavidrios Electricos");modelo21 . agregarCaracteristica("Radio CD");modelo21 . agregarCaracteristica("Alarma");modelo21 . agregarCaracteristica("Tapiz de cuero");modelo21 . agregarCaracteristica("Air Bag");modelo21 . agregarCaracteristica("Direccion Asistida ");Modelo modelo31 = new Modelo("H-1", 2005, 1);modelo31 . agregarCaracteristica("Alarma");modelo31 . agregarCaracteristica("Mecanico ");modelo31 . agregarCaracteristica("Radio CD");modelo31 . agregarCaracteristica("Direccion Asistida ");marca1 .agregarModelo(modelo11 );marca1 .agregarModelo(modelo21 );marca1 .agregarModelo(modelo31 );

Marca marca2 = new Marca("Toyota ");Modelo modelo12 = new Modelo("Hilux", 2008, 2);modelo12 . agregarCaracteristica("4x4");modelo12 . agregarCaracteristica("Llantas ");modelo12 . agregarCaracteristica("Radio CD");modelo12 . agregarCaracteristica("Mecanico ");modelo12 . agregarCaracteristica("Neblineros");modelo12 . agregarCaracteristica("Direccion Asistida ");modelo12 . agregarCaracteristica("Aire Acondicionado");modelo12 . agregarCaracteristica("Air Bag");Modelo modelo22 = new Modelo("Yaris", 2007, 0);modelo22 . agregarCaracteristica("Alarma");modelo22 . agregarCaracteristica("Aire Acondicionado");modelo22 . agregarCaracteristica("Radio CD");modelo22 . agregarCaracteristica("Mecanico ");modelo22 . agregarCaracteristica("Alzavidrios Electricos");modelo22 . agregarCaracteristica("Direccion Asistida ");Modelo modelo32 = new Modelo("Auris", 2008, 1);modelo32 . agregarCaracteristica("Neblineros");modelo32 . agregarCaracteristica("Alzavidrios Electricos");modelo32 . agregarCaracteristica("Air Bag");modelo32 . agregarCaracteristica("Automatico");modelo32 . agregarCaracteristica("Radio CD");Modelo modelo42 = new Modelo("Corolla ", 2006, 0);modelo42 . agregarCaracteristica("Radio CD");modelo42 . agregarCaracteristica("Alarma");modelo42 . agregarCaracteristica("Automatico");modelo42 . agregarCaracteristica("Tapiz de cuero");modelo42 . agregarCaracteristica("Alzavidrios Electricos");modelo42 . agregarCaracteristica("Aire Acondicionado");modelo42 . agregarCaracteristica("Neblineros");modelo42 . agregarCaracteristica("Air Bag");modelo42 . agregarCaracteristica("Direccion Asistida ");Modelo modelo52 = new Modelo("Yaris Sport", 2008, 1);modelo52 . agregarCaracteristica("Radio CD");modelo52 . agregarCaracteristica("Alzavidrios Electricos");marca2 .agregarModelo(modelo12 );marca2 .agregarModelo(modelo22 );marca2 .agregarModelo(modelo32 );marca2 .agregarModelo(modelo42 );if (! marca2. agregarModelo(modelo52 )) {

Usuario .mensajeConsola("No se pudo agregar el modelo "+ modelo52 . getModelo() + " a la marca "+ marca2.getNombre());

IIC1103 – Capıtulo 5: Strings 41

Page 42: Strings

}Marca marca3 = new Marca("Mercedes Benz");Modelo modelo13 = new Modelo("C 200 K", 2008, 1);modelo13 . agregarCaracteristica("Llantas ");modelo13 . agregarCaracteristica("Radio CD");modelo13 . agregarCaracteristica("Alzavidrios Electricos");modelo13 . agregarCaracteristica("Automatico");modelo13 . agregarCaracteristica("Neblineros");modelo13 . agregarCaracteristica("Alarma");modelo13 . agregarCaracteristica("Tapiz de cuero");modelo13 . agregarCaracteristica("Air Bag");modelo13 . agregarCaracteristica("Direccion Asistida ");modelo13 . agregarCaracteristica("Aire Acondicionado");Modelo modelo23 = new Modelo("CLK 500", 2008, 2);modelo23 . agregarCaracteristica("Mecanico ");modelo23 . agregarCaracteristica("Alarma");modelo23 . agregarCaracteristica("Air Bag");modelo23 . agregarCaracteristica("Alzavidrios Eletricos");modelo23 . agregarCaracteristica("Neblineros");modelo23 . agregarCaracteristica("Llantas ");modelo23 . agregarCaracteristica("Direccion Asistida ");modelo23 . agregarCaracteristica("4x4");modelo23 . agregarCaracteristica("Radio CD");modelo23 . agregarCaracteristica("Aire Acondicionado");marca3 .agregarModelo(modelo13 );marca3 .agregarModelo(modelo23 );

/** Incremento 2 */// Mostramos el catalogo completo de cada marcamarca1 .imprimirCatalogo(0);marca2 .imprimirCatalogo(0);marca3 .imprimirCatalogo(0);Usuario .mensajeConsola("");

// Mostramos la cantidad de modelos del anio 2008 que oferta cada marcaUsuario .mensajeConsola("La marca " + marca1. getNombre() + " tiene "

+ marca1. autosDelAnio(2008)+ " modelos anio 2008 en su catalogo .");

Usuario .mensajeConsola("La marca " + marca2. getNombre() + " tiene "+ marca2. autosDelAnio(2008)+ " modelos anio 2008 en su catalogo .");

Usuario .mensajeConsola("La marca " + marca3. getNombre() + " tiene "+ marca3. autosDelAnio(2008)+ " modelos anio 2008 en su catalogo .");

/** Incremento 3 */// Mostramos el catalogo de cada marca solo con los modelos del anio// preferidoint anio = Usuario .entero ("Ingrese el anio para el que desea revisar los modelos :");marca1 .imprimirCatalogo(anio);marca2 .imprimirCatalogo(anio);marca3 .imprimirCatalogo(anio);Usuario .mensajeConsola("");

// Ahora mostramos la cantidad de autos que tienen aire acondicionadoUsuario .mensajeConsola("La marca "

+ marca1.getNombre()+ " tiene "+ marca1. modelosConCaracteristica("Aire acondicionado")+ " modelos de automoviles con aire acondicionado en su catalogo .");

Usuario .mensajeConsola("La marca "+ marca2.getNombre()+ " tiene "+ marca2. modelosConCaracteristica("Aire acondicionado")+ " modelos de automoviles con aire acondicionado en su catalogo .");

Usuario .mensajeConsola("La marca "+ marca3.getNombre()+ " tiene "+ marca3. modelosConCaracteristica("Aire acondicionado")+ " modelos de automoviles con aire acondicionado en su catalogo .\n");

// Finalmente mostramos la cantidad de autos tipo sedan que tienen aire// acondicionadoUsuario .mensajeConsola("La marca "

+ marca1.getNombre()+ " tiene "+ marca1. modelosConCaracteristicaPorTipo("Aire acondicionado", 0)

IIC1103 – Capıtulo 5: Strings 42

Page 43: Strings

+ " modelos de automoviles tipo sedan con aire acondicionado en su catalogo .");Usuario .mensajeConsola("La marca " + marca2. getNombre() + " tiene " +

marca2. modelosConCaracteristicaPorTipo("Aire acondicionado", 0)+ " modelos de automoviles tipo sedan con aire acondicionado en su catalogo .");

Usuario .mensajeConsola("La marca "+ marca3. getNombre() + " tiene "+ marca3. modelosConCaracteristicaPorTipo("Aire acondicionado", 0)+ " modelos de automoviles tipo sedan con aire acondicionado en su catalogo .");

}}

Criterios de solucion

Clase Modelo

• Atributos: Declaramos los atributos necesarios segun nos indican en el enunciado: dos String, unopara el nombre y otro para las caracterısticas y dos enteros, uno para representar el ano y otropara representar el tipo (camioneta, sedan, etc)

• Constructor: Lo declaramos segun el uso mostrado en la clase Principal. Recibe como parametrosel nombre, el ano y el tipo y los asigna a los atributos correspondientes.

• Metodo agragarCaracteristica: Lo declaramos segun el uso mostrado en la clase Principal.Recibe como parametro un String con la caracterıstica a agregar y tenemos que concatenarlo alString que almacena las caracterısticas.

• Getters: Segun el uso dado en la clase Principal necesitamos 3 metodos get para obtener el nombredel modelo, el ano y el tipo.

• Metodo tieneCaracteristica: Este metodo sirve para revisar si el modelo tiene una determinadacaracterıstica (para cumplir con lo pedido en el incremento 3), puede hacerse tambien solo en laclase Marca. Lo que hacemos es buscar la caracterıstica generando todos los substrings desde lalista de caracterısticas que tengan el mismo largo que la caracterıstica recibida y comparar hastaencontrar alguna coincidencia.

• Metodo mostrar: Revisamos el tipo y segun eso mostramos en Consola el nombre del modelo, suano seguido de ’Sedan’, ’Station Wagon’ o ’Camioneta’, segun corresponda.

Clase Marca:

• Atributos: Declaramos los atributos necesarios segun lo que se nos indica en el enunciado: unString para guardar el nombre y cuatro objetos de la clase Modelo que representen a los modelosde auto que tiene la Marca.

• Constructor: Lo declaramos segun el uso mostrado en la clase Principal. Recibe como parametroun String con el nombre de la marca y lo asigna al atributo correspondiente.

• Metodo agregarModelo: Lo declaramos segun el uso mostrado en la clase Principal. Recibe comoparametro un objeto de la clase Modelo. Tenemos que revisar a que objeto, de los 4 que tenemoscomo atributos, debemos asignarlo, revisando cual de ellos es todavıa null. Retornamos true ofalse segun se pudo o no asignar el modelo.

• Metodo getNombre: Retorna el nombre de la marca.• Metodo autosDelAnio: Recorremos todos los modelos y obtenemos su ano (cuidando que el objeto

no sea null) y lo comparamos con el ano recibido como parametro. Retornamos el numero de vecesque la comparacion fue exitosa.

• Metodo imprimirCatalogo: Mostramos en la consola el nombre de la marca y el numero de autosdel ano (segun el parametro recibido) llamando al metodo autosDelAnio. Luego, por cada Modelollamamos al metodo que muestra su nombre y su tipo.

• Metodo modelosConCaracteristica: Para no implementar un metodo dos veces simplementellamamos al metodo modelosConCaracteristicaPorTipo definiendo un valor invalido para eltipo.

IIC1103 – Capıtulo 5: Strings 43

Page 44: Strings

• Metodo modelosConCaracteristicaPorTipo: Recorremos todos los modelos y en cada uno revi-samos que no sea nulo y que tenga la caracterıstica solicitada (llamando al metodo que implemen-tamos en la clase Modelo). Ademas, en caso que el tipo sea valido, tambien revisamos que el tipodel modelo corresponda. Si se cumplen ambas condiciones aumentamos el contador de modelos,el cual retornamos al finalizar el metodo.

Posible solucion

import iic1103Package.*;

public class Marca {// Definimos los atributos necesariosprivate String nombre;// Definimos los modelos de auto que tiene la Marcaprivate Modelo modelo0 ;private Modelo modelo1 ;private Modelo modelo2 ;private Modelo modelo3 ;

public Marca(String nombre) {this.nombre = nombre;

}

public Modelo obtenerModelo(int indice) {// Obtenemos el modelo segun su indiceif (indice == 0) {

return modelo0 ;} else if (indice == 1) {

return modelo1 ;} else if (indice == 2) {

return modelo2 ;} else {

return modelo3 ;}

}

public boolean agregarModelo(Modelo modelo) {// Para agregar una nueva marca , buscamos el primero de los atributos// que aun sea nuloif (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 retornamos falsereturn false;

}return true;

}

public int autosDelAnio(int anio) {// Declaramos una variable para contar, y recorremos los modelos// buscando aquellos que coincidan con el anioint contador = 0;for (int i = 0; i < 4; i++) {

Modelo modelo = obtenerModelo(i);if (modelo != null && modelo.getAnio () == anio) {

contador ++;}

}return contador ;

}

public int modelosConCaracteristica(String caracteristica) {// Llamamos al metodo que busca tambien por tipo de auto , definiendo un// valor invalido para dicho parametroreturn modelosConCaracteristicaPorTipo( caracteristica , -1);

}

IIC1103 – Capıtulo 5: Strings 44

Page 45: Strings

public int modelosConCaracteristicaPorTipo(String caracteristica , int tipo) {// Recorremos todos los modelos de la marca , revisando que no sean nulos// y que tengan la caracteristica solicitada ,// restringiendo ademas por el tipo de auto en caso de que el parametro// correspondiente sea valido , y los contamosint contador = 0;for (int i = 0; i < 4; i++) {

Modelo modelo = obtenerModelo(i);if (modelo != null && modelo. tieneCaracteristica(caracteristica)

&& (tipo == -1 || modelo.getTipo () == tipo)) {contador ++;

}}return contador ;

}

public void imprimirCatalogo(int anio) {Usuario .mensajeConsola("\n***************************************************");Usuario .mensajeConsola("Marca: " + nombre );if (anio != 0) {

Usuario .mensajeConsola("El catalogo presenta " + autosDelAnio(anio)+ " modelos del anio " + anio + ":");

}for (int i = 0; i < 4; i++) {

Modelo modelo = obtenerModelo(i);if (modelo != null && (anio == 0 || modelo.getAnio () == anio)) {

modelo.mostrar ();}

}Usuario .mensajeConsola("***************************************************");

}

public String getNombre() {return nombre;

}}

import iic1103Package.*;

public class Modelo {// Definimos los atributos minimos necesariosprivate String nombre;private int anio;private int tipo;private String caracteristicas;

public Modelo(String modelo , int anio , int tipo) {// Inicializamos los valores para el autothis.nombre = modelo;this.anio = anio;this.tipo = tipo;this.caracteristicas = "";

}

public void agregarCaracteristica(String caracteristica) {// Agregamos la caracteristica al atributo (String ) correspondientecaracteristicas += " - " + caracteristica;

}

public boolean tieneCaracteristica(String caracteristica) {// Buscamos caracteristica generando todos los substrings desde el// atributo correspondiente// que tengan el mismo largo que la caracteristica en el parametrofor (int i = 0; i <= caracteristicas.length () - caracteristica. length (); i++) {

String aux = caracteristicas.substring(i, i + caracteristica.length ());if (aux.equalsIgnoreCase(caracteristica)) {

return true;}

}return false;

}

public void mostrar () {if (tipo == 0) {

Usuario .mensajeConsola("\t" + nombre + ", " + anio + ", Sedan");} else if (tipo == 1) {

IIC1103 – Capıtulo 5: Strings 45

Page 46: Strings

Usuario .mensajeConsola("\t" + nombre + ", " + anio + ", Station Wagon");} else {

Usuario .mensajeConsola("\t" + nombre + ", " + anio + ", Camioneta");}

}

public String getModelo() {return nombre;

}

public int getAnio () {return anio;

}

public int getTipo () {return tipo;

}}

IIC1103 – Capıtulo 5: Strings 46

Page 47: Strings

Problema 19: Platos de un Menu

Enunciado

Usted debera realizar un programa que permita manejar los platos que conforman los menues de distintosrestaurantes, ası como los ingredientes de estos platos. Para ello debera trabajar con un metodo main queya viene implementado.El programa lo dividiremos en 3 subconjuntos incrementales. Le recomendamos no comenzar con el siguientesubconjunto hasta terminar y probar el funcionamiento correcto del subconjunto actual.

Incremento 1

En este primer incremento debera definir lo basico de las clases Restaurant y Plato, para poder crearlas.Un Plato esta caracterizado por su nombre, su precio y su tipo, el cual se representa con un 0 si correspondea un plato frıo o con un 1 si se trata de un plato caliente. Ademas cada plato tiene sus ingredientes esenciales,los cuales se representan con un string en el cual se van concatenando los ingredientes que se van agregandoal plato. Su clase Plato debe cumplir con los usos dados en el main provisto, el cual usted no puedemodificar.Por su parte, un Restaurant esta caracterizado por los platos que componen su menu, pudiendo ser hastacinco como maximo. Al igual que Plato, la clase Restaurant debe poder ser utilizada con el main predefinido,por lo que su implementacion debe coincidir con los nombres y parametros de los metodos que ahı seencuentran.

Incremento 2

Ahora que ya estan creados los restaurantes y sus platos, debe agregar los metodos necesarios a sus clasespara que sea posible mostrar en consola el menu de cada restaurant. El menu de un restaurant se muestraindicando el nombre de este, el precio promedio de los platos que ofrece y, para cada uno de sus platos, lainformacion correspondiente al nombre del plato, su precio y su tipo. Por ejemplo, para uno de los restaurantesel mensaje debe mostrarse como el siguiente:

***************************************************Restaurant: Dona JuanitaPrecio Promedio de sus platos: $3083.0

Pastel de Choclo, $3500, CalienteCazuela de Vacuno, $4550, CalienteMote con huesillos, $1200, Frio

***************************************************

Ademas, cada restaurant debe ser capaz de retornar la cantidad de platos en su menu cuyo precio sea igualo inferior a $4500, para que ası el main pueda mostrar los mensajes correspondientes.

Incremento 3

Por ultimo, debe complementar sus clases de modo que sea posible imprimir el menu de cada restaurantsolo con los platos cuyo precio no supere un precio determinado (especificado por el usuario), como tambienbuscar el numero de platos en el menu que presenten un determinado ingrediente en cada restaurant, permi-tiendo adicionalmente realizar esta busqueda para un tipo de plato en particular. Nuevamente debe cumplircon lo ya definido en el metodo main que se le entrega.

IIC1103 – Capıtulo 5: Strings 47

Page 48: Strings

import iic1103Package.*;

public class Principal {public static void main(String [] args) {

/** Incremento 1 */// Creamos los restaurantes y agregamos platos con distintos// ingredientesRestaurant r1 = new Restaurant("Italia Nostra");Plato plato11 = new Plato(" Espagueti a la carbonara", 3890, 1);plato11 .agregarIngrediente("espagueti");plato11 .agregarIngrediente("tocino");plato11 .agregarIngrediente("aceite de oliva");plato11 .agregarIngrediente("huevo");plato11 .agregarIngrediente("queso parmesano");plato11 .agregarIngrediente("ajo");Plato plato21 = new Plato("Ravioli ", 4980, 1);plato21 .agregarIngrediente("raviolis ");plato21 .agregarIngrediente("queso ricotta ");plato21 .agregarIngrediente("perejil fresco");plato21 .agregarIngrediente("huevo");Plato plato31 = new Plato(" Macarones con jamon", 4550, 1);plato31 .agregarIngrediente("macarones");plato31 .agregarIngrediente("crema");plato31 .agregarIngrediente("jamon cocido");plato31 .agregarIngrediente("queso parmesano");Plato plato41 = new Plato("Gnoquis con Salsa Boloniesa", 3200, 1);plato41 .agregarIngrediente("carne");plato41 .agregarIngrediente("Gnoquis ");plato41 .agregarIngrediente("zanahoria");plato41 .agregarIngrediente("tomate");plato41 .agregarIngrediente("aceite de oliva");Plato plato51 = new Plato(" Cialdella pullese ", 2950, 0);plato51 .agregarIngrediente("tomate");plato51 .agregarIngrediente("aceite de oliva");plato51 .agregarIngrediente("tostadas integrales");r1.agregarPlato(plato11 );r1.agregarPlato(plato21 );r1.agregarPlato(plato31 );r1.agregarPlato(plato41 );r1.agregarPlato(plato51 );

Restaurant r2 = new Restaurant("Mexico Lindo");Plato plato12 = new Plato("Papas rellenas ", 4600, 1);plato12 .agregarIngrediente("papas");plato12 .agregarIngrediente("huevo");plato12 .agregarIngrediente("queso");plato12 .agregarIngrediente("jamon");Plato plato22 = new Plato("Tortilla de verduras ", 3130, 0);plato22 .agregarIngrediente("pollo");plato22 .agregarIngrediente("pimenton ");plato22 .agregarIngrediente("queso");plato22 .agregarIngrediente("champiniones");plato22 .agregarIngrediente("cebolla ");Plato plato32 = new Plato("Carne a la crema", 4200, 1);plato32 .agregarIngrediente("carne");plato32 .agregarIngrediente("crema");plato32 .agregarIngrediente("leche");plato32 .agregarIngrediente("perejil ");plato32 .agregarIngrediente("ajo");plato32 .agregarIngrediente("oregano ");plato32 .agregarIngrediente("aceite de oliva");Plato plato42 = new Plato("Pastel azteca", 4600, 1);plato42 .agregarIngrediente("pollo");plato42 .agregarIngrediente("tomate");plato42 .agregarIngrediente("aceite de oliva");plato42 .agregarIngrediente("queso parmesano");plato42 .agregarIngrediente("cebolla ");plato42 .agregarIngrediente("aji");plato42 .agregarIngrediente("harina de maiz");Plato plato52 = new Plato("Tacos poblanos ", 3590, 0);plato52 .agregarIngrediente("tomate");plato52 .agregarIngrediente("huevo");plato52 .agregarIngrediente("chorizo ");plato52 .agregarIngrediente("carne");plato52 .agregarIngrediente("queso");plato52 .agregarIngrediente("aji");

IIC1103 – Capıtulo 5: Strings 48

Page 49: Strings

plato52 .agregarIngrediente("cebolla ");Plato plato62 = new Plato("Sopa mexicana ", 2990, 1);plato62 .agregarIngrediente("pollo");plato62 .agregarIngrediente("porotos ");plato62 .agregarIngrediente("tomate");plato62 .agregarIngrediente("ajo");r2.agregarPlato(plato12 );r2.agregarPlato(plato22 );r2.agregarPlato(plato32 );r2.agregarPlato(plato42 );r2.agregarPlato(plato52 );if (!r2.agregarPlato( plato62 )) {

Usuario .mensajeConsola("No se pudo agregar el plato \""+ plato52 . getNombre() + "\" al Restaurant \""+ r2.getNombre() + "\"");

}Restaurant r3 = new Restaurant("Hariko Kimasi");Plato plato13 = new Plato("Sushi con camarones", 4990, 0);plato13 .agregarIngrediente("arroz");plato13 .agregarIngrediente("camarones");plato13 .agregarIngrediente("pimienta ");plato13 .agregarIngrediente("vinagre ");plato13 .agregarIngrediente("limon");Plato plato23 = new Plato("Ensalada Japonesa ", 4600, 0);plato23 .agregarIngrediente("esparragos");plato23 .agregarIngrediente("rabanos ");plato23 .agregarIngrediente("carne");plato23 .agregarIngrediente("coliflor ");plato23 .agregarIngrediente("pimenton ");r3.agregarPlato(plato13 );r3.agregarPlato(plato23 );

Restaurant r4 = new Restaurant("Donia Juanita ");Plato plato14 = new Plato("Pastel de Choclo", 3500, 1);plato14 .agregarIngrediente("choclo");plato14 .agregarIngrediente("carne");plato14 .agregarIngrediente("cebolla ");plato14 .agregarIngrediente("pollo");plato14 .agregarIngrediente("leche");plato14 .agregarIngrediente("aceitunas");Plato plato24 = new Plato("Cazuela de Vacuno", 4550, 1);plato24 .agregarIngrediente("carne");plato24 .agregarIngrediente("papa");plato24 .agregarIngrediente("zapallo ");plato24 .agregarIngrediente("zanahoria");plato24 .agregarIngrediente("choclo");plato24 .agregarIngrediente("poroto verde");plato24 .agregarIngrediente("arroz");Plato plato34 = new Plato("Mote con huesillos", 1200, 0);plato34 .agregarIngrediente("mote");plato34 .agregarIngrediente("huesillos");r4.agregarPlato(plato14 );r4.agregarPlato(plato24 );r4.agregarPlato(plato34 );

/** Incremento 2 */// Mostramos el menu completo de cada restaurantr1.imprimirMenu(0);r2.imprimirMenu(0);r3.imprimirMenu(0);r4.imprimirMenu(0);Usuario .mensajeConsola("");

// Mostramos la cantidad de platos bajo 4.500 que incluye cada// restaurant en su menuUsuario .mensajeConsola("El Restaurant " + r1.getNombre()

+ " tiene " + r1.platosEnPrecio(4500)+ " platos con precio bajo los 4.500 en su menu.");

Usuario .mensajeConsola("El Restaurant " + r2.getNombre()+ " tiene " + r2.platosEnPrecio(4500)+ " platos con precio bajo los 4.500 en su menu.");

Usuario .mensajeConsola("El Restaurant " + r3.getNombre()+ " tiene " + r3.platosEnPrecio(4500)+ " platos con precio bajo los 4.500 en su menu.");

Usuario .mensajeConsola("El Restaurant " + r4.getNombre()+ " tiene " + r4.platosEnPrecio(4500)+ " platos con precio bajo los 4.500 en su menu.");

IIC1103 – Capıtulo 5: Strings 49

Page 50: Strings

/** Incremento 3 */// Mostramos el menu de cada restaurant solo con los platos dentro del// precio deseadoint precio = Usuario .entero("Ingrese el maximo que esta dispuesto a pagar por el plato:");r1.imprimirMenu(precio );r2.imprimirMenu(precio );r3.imprimirMenu(precio );r4.imprimirMenu(precio );Usuario .mensajeConsola("");

// Ahora mostramos la cantidad de platos del menu que tienen carne// dentro de sus ingredientesUsuario .mensajeConsola("El Restaurant " + r1.getNombre()

+ " tiene en su menu " + r1.platosConIngrediente("carne")+ " platos que tienen carne como uno de sus ingredientes.");

Usuario .mensajeConsola("El Restaurant " + r2.getNombre()+ " tiene en su menu " + r2.platosConIngrediente("carne")+ " platos que tienen carne como uno de sus ingredientes.");

Usuario .mensajeConsola("El Restaurant " + r3.getNombre()+ " tiene en su menu " + r3.platosConIngrediente("carne")+ " platos que tienen carne como uno de sus ingredientes.");

Usuario .mensajeConsola("El Restaurant " + r4.getNombre()+ " tiene en su menu " + r4.platosConIngrediente("carne")+ " platos que tienen carne como uno de sus ingredientes.");

Usuario .mensajeConsola("");

// Finalmente mostramos la cantidad de platos frios del menu que tienen// carne dentro de sus ingredientesUsuario .mensajeConsola("El Restaurant " + r1.getNombre() + " tiene en su menu "

+ r1.platosConIngredientePorTipo("carne", 0)+ " platos frios que tienen carne como uno de sus ingredientes.");

Usuario .mensajeConsola("El Restaurant " + r2.getNombre() + " tiene en su menu "+ r2.platosConIngredientePorTipo("carne", 0)+ " platos frios que tienen carne como uno de sus ingredientes.");

Usuario .mensajeConsola("El Restaurant " + r3.getNombre() + " tiene en su menu "+ r3.platosConIngredientePorTipo("carne", 0)+ " platos frios que tienen carne como uno de sus ingredientes.");

Usuario .mensajeConsola("El Restaurant " + r4.getNombre() + " tiene en su menu "+ r4.platosConIngredientePorTipo("carne", 0)+ " platos frios que tienen carne como uno de sus ingredientes.");

}}

Criterios de solucion

Clase Plato

• Atributos: Declaramos los atributos necesarios segun nos indican en el enunciado: dos String, unopara el nombre y otro para los ingredientes y dos enteros, uno para representar el precio y otropara representar el tipo.

• Constructor: Lo declaramos segun el uso mostrado en la clase Principal. Recibe como parametrosel nombre, el precio y el tipo y los asigna a los atributos correspondientes.

• Metodo agragarIngrediente: Lo declaramos segun el uso mostrado en la clase Principal. Recibecomo parametro un String con el ingrediente a agregar y tenemos que concatenarlo al String quealmacena todos los ingredientes.

• Getters: Segun 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 determinadoingrediente (para cumplir con lo pedido en el incremento 3), puede hacerse tambien solo en laclase Restaurant. Lo que hacemos es buscar el ingrediente generando todos los substrings desdela lista de ingredientes que tengan el mismo largo que el ingrediente recibido y comparar hastaencontrar alguna coincidencia.

• Metodo mostrar: Revisamos el tipo del plato y segun eso mostramos en Consola su nombre yprecio seguido de ’Frıo’ o ’Cliente’, segun corresponda.

IIC1103 – Capıtulo 5: Strings 50

Page 51: Strings

Clase Restaurant:

• Atributos: Declaramos los atributos necesarios segun lo que se nos indica en el enunciado: unString para guardar el nombre y cuatro objetos de la clase Plato que representen a los platos queintegran el menu del restaurant.

• Constructor: Lo declaramos segun el uso mostrado en la clase Principal. Recibe como parametroun String con el nombre y lo asigna al atributo correspondiente.

• Metodo agregarPlato: Lo declaramos segun el uso mostrado en la clase Principal. Recibe comoparametro un objeto de la clase Plato. Tenemos que revisar a que objeto, de los 4 que tenemoscomo atributos, debemos asignarlo, revisando cual de ellos es todavıa null. Retornamos true ofalse segun 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 preciosiempre debemos chequear que el objeto no sea null. Retornamos el contador.

• Metodo precioPromedio: Recorremos todos los platos y obtenemos su precio (cuidando que elplato no sea null) calculando con esto el promedio.

• Metodo imprimirMenu: Mostramos en la consola el nombre del Restaurant junto con el preciopromedio de sus platos (llamando al metodo precioPromedio y cuantos platos tienen un preciomenor o igual al recibido como parametro (llamando al metodo platosEnPrecio. Luego por cadaplato llamamos al metodo que muestra su nombre, precio y tipo.

• Metodo platosConIngrediente: Para no implementar un metodo dos veces simplemente llama-mos al metodo platosConIngredientePorTipo definiendo un valor invalido para el tipo.

• Metodo platosConIngredientePorTipo: Recorremos todos los platos y en cada uno una revisa-mos que no sea nulo y que tenga el ingrediente solicitado (llamando al metodo que implementamosen la clase Plato). Ademas, en caso que el tipo sea valido, tambien revisamos que el tipo del platocorresponda. Si se cumplen ambas condiciones aumentamos el contador de platos, el cual retor-namos al finalizar el metodo.

Posible solucion

import iic1103Package.*;

public class Plato {// Definimos los atributos minimos necesariosprivate String nombre;private int precio;private int tipo;private String ingredientes;

public Plato(String nombre, int precio , int tipo) {// Inicializamos los valores para la preparacionthis.nombre = nombre;this.precio = precio;this.tipo = tipo;this.ingredientes = "";

}

public void agregarIngrediente(String ingrediente) {// Agregamos el ingrediente al atributo (String ) correspondienteingredientes += " - " + ingrediente;

}

public boolean tieneIngrediente(String ingrediente) {// Buscamos el ingrediente generando todos los substrings desde el// atributo correspondiente// que tengan el mismo largo que el ingrediente en el parametrofor (int i = 0; i <= ingredientes.length () - ingrediente.length (); i++) {

String aux = ingredientes.substring(i, i + ingrediente.length ());

IIC1103 – Capıtulo 5: Strings 51

Page 52: Strings

if (aux.equalsIgnoreCase(ingrediente)) {return true;

}}return false;

}

public void mostrar () {if (tipo == 0) {

Usuario .mensajeConsola("\t" + nombre + ", " + precio + ", Frio");} else {

Usuario .mensajeConsola("\t" + nombre + ", " + precio + ", Caliente ");}

}

public String getNombre() {return nombre;

}

public int getPrecio() {return precio;

}

public int getTipo () {return tipo;

}}

import iic1103Package.*;

public class Restaurant {// Definimos los atributos necesariosprivate String nombre;// Definimos los platos que integran el menu del Restaurantprivate Plato plato0;private Plato plato1;private Plato plato2;private Plato plato3;private Plato plato4;

public Restaurant(String nombre) {this.nombre = nombre;

}

public Plato obtenerPlato(int indice) {// Obtenemos el plato segun su indiceif (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 agregarPlato(Plato plato) {// Para agregar un nuevo plato , buscamos el primero de los atributos que// aun sea nuloif (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 retornamos falsereturn false;

}return true;

IIC1103 – Capıtulo 5: Strings 52

Page 53: Strings

}

public int platosEnPrecio(int precio) {// Declaramos una variable para contar, y recorremos los platos buscando// aquellos con precio igual o inferior al indicadoint contador = 0;for (int i = 0; i < 5; i++) {

Plato plato = obtenerPlato(i);if (plato != null && plato.getPrecio() <= precio) {

contador ++;}

}return contador ;

}

public double precioPromedio() {// Declaramos una variable para contar, y recorremos los platos// contandolos y acumulando sus preciosint contador = 0, precioTotal = 0;for (int i = 0; i < 5; i++) {

Plato plato = obtenerPlato(i);if (plato != null) {

precioTotal += plato. getPrecio();contador ++;

}}return precioTotal / contador ;

}

public int platosConIngrediente(String ingrediente) {// Llamamos al metodo que busca tambien por tipo de plato , definiendo un// valor invalido para dicho parametroreturn platosConIngredientePorTipo(ingrediente , -1);

}

public int platosConIngredientePorTipo(String ingrediente , int tipo) {// Recorremos todos los platos del restaurant , revisando que no sean// nulos y que tengan el ingrediente deseado ,// restringiendo ademas por el tipo de plato en caso de que el parametro// correspondiente sea valido , y los contamosint contador = 0;for (int i = 0; i < 5; i++) {

Plato plato = obtenerPlato(i);if (plato != null && plato.tieneIngrediente(ingrediente)

&& (tipo == -1 || plato.getTipo () == tipo)) {contador ++;

}}return contador ;

}

public void imprimirMenu(int precio) {Usuario .mensajeConsola("\n***************************************************");Usuario .mensajeConsola("Restaurant: " + nombre

+ "\nPrecio Promedio de sus platos: " + precioPromedio());if (precio != 0) {

Usuario .mensajeConsola("El menu incluye " + platosEnPrecio( precio)+ " platos con precio igual o menor a " + precio + ":");

}for (int i = 0; i < 5; i++) {

Plato plato = obtenerPlato(i);if (plato != null && (precio == 0 || plato. getPrecio() <= precio )) {

plato.mostrar ();}

}Usuario .mensajeConsola("***************************************************");

}

public String getNombre() {return nombre;

}}

IIC1103 – Capıtulo 5: Strings 53


Recommended