Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Javier1996 en 24 de Agosto 2015, 19:42
-
Hola, aquí mi solución, creo que abuse un poco de las condicionales y variables, pero no se me ocurrió otra forma. espero que este bien.
Saludos!!
import java.util.Scanner;
public class Compara{
public static void main (String [] args){
//primera entrada
String entrada1 = "";
System.out.println("Porfavor ingrese la entrada 1");
Scanner escanear1 = new Scanner(System.in);
entrada1 = escanear1.nextLine();
//segunda entrada
String entrada2 = "";
System.out.println("Porfavor ingrese la entrada 2");
Scanner escanear2 = new Scanner(System.in);
entrada2 = escanear2.nextLine();
int i = 0;//variable para la primera entrada
int j = 0;//variable para la segunda entrada
int c = 0;//Contador de palabra
int d = 0;//variable para establecer la sentencia break
int m = 0;//Variable con el numero de caracteres de la cadenas mas corta
while ( true ){
if ( entrada1.length() > entrada2.length() ){ d = entrada1.length(); m = entrada2.length();}
if ( entrada1.length() < entrada2.length() ){ d = entrada2.length(); m = entrada1.length();}
if ( entrada1.length() == entrada2.length() ){ d = entrada1.length(); m = entrada2.length();}
c++;
if ( i < m && j < m ){
boolean verdad = entrada1.substring( i, i+1).equals(entrada2.substring( j, j+1) );
System.out.println("¿Letra " + c + " igual en las dos palabras? " + verdad);
}
if ( entrada1.length() > entrada2.length() && j >= entrada2.length() ){
System.out.println("¿Letra " + c + " igual en las dos palabras? \nLa palabra 2 no tiene letra " + c);
}
if ( entrada1.length() < entrada2.length() && i >= entrada1.length() ){
System.out.println("¿Letra " + c + " igual en las dos palabras? \nLa palabra 1 no tiene letra " + c);
}
i ++;
j ++;
if ( i == d && j == d){break;}
}//Cierre del bucle
}//Cierre del main
}//Cierre de la clase
-
Hola!
Cosas a mejorar:
- La forma de nombrar las clases. Lee lo que se explica en https://www.aprenderaprogramar.com/foros/index.php?topic=3035.msg13698#msg13698
Sería un mejor nombre de clase ComparadorDePalabras o algo así en lugar de Compara
- No debe usarse un bucle while donde la condición sea while (true) porque esto es un mal diseño. Lee lo que se explica en https://www.aprenderaprogramar.com/foros/index.php?topic=3074
Al haber usado while (true) te obliga a usar un break. Debes eliminar tanto el while (true) como el break. break es una forma no adecuada para salir de un bucle, lee lo que se explica en https://www.aprenderaprogramar.com/foros/index.php?topic=3060
- También recomiendo dar nombres descriptivos a las variables (excepto contadores en bucles for o similar), por ejemplo
int m = 0;//Variable con el numero de caracteres de la cadenas mas corta
int numCharCadenaCorta = 0;//Variable con el numero de caracteres de la cadenas mas corta
Si los nombres son descriptivos el código resulta más fácil de estudiar y mantener y en general se considera mejor programación.
Con todo lo indicado deberías intentar reescribir el ejercicio.
Saludos!
-
Hola Cesar
Muchas gracias por tu consejo, tienes toda la razón.
aquí el código con las correcciones.
Saludos!!
import java.util.Scanner;
public class CompararDosPalabras{
public static void main (String [] args){
//primera entrada
String entrada1 = "";
System.out.println("Porfavor ingrese la entrada 1");
Scanner escanear1 = new Scanner(System.in);
entrada1 = escanear1.nextLine();
//segunda entrada
String entrada2 = "";
System.out.println("Porfavor ingrese la entrada 2");
Scanner escanear2 = new Scanner(System.in);
entrada2 = escanear2.nextLine();
//Variables
int c = 0;//Contador de palabra
int NumCharCadenaLarga = 0;//variable con el numero de caracteres de la cadena mas larga
int NumCharCadenaCorta = 0;//Variable con el numero de caracteres de la cadenas mas corta
if ( entrada1.length() > entrada2.length() ){ NumCharCadenaLarga = entrada1.length(); NumCharCadenaCorta = entrada2.length();}
if ( entrada1.length() < entrada2.length() ){ NumCharCadenaLarga = entrada2.length(); NumCharCadenaCorta = entrada1.length();}
if ( entrada1.length() == entrada2.length() ){ NumCharCadenaLarga = entrada1.length(); NumCharCadenaCorta = entrada2.length();}
while ( c <= NumCharCadenaLarga ){
if ( c < NumCharCadenaCorta ){
boolean verdad = entrada1.substring( c, c+1).equals(entrada2.substring( c, c+1) );
System.out.println("¿Letra " + (c+1) + " igual en las dos palabras? " + verdad);
}
if ( entrada1.length() > entrada2.length() && c >= entrada2.length() ){
System.out.println("¿Letra " + c + " igual en las dos palabras? \nLa palabra 2 no tiene letra " + c);
}
if ( entrada1.length() < entrada2.length() && c >= entrada1.length() ){
System.out.println("¿Letra " + c + " igual en las dos palabras? \nLa palabra 1 no tiene letra " + c);
}
c ++;
}//Cierre del bucle
//Mensaje para verificar que el programa funciona correctamente, solo ignoren esta parte =P
System.out.println("Ha finalizado la comparacion \nLa primera entrada consta de " + entrada1.length() + " caracteres" +
"\nLa segunda entrada consta de " + entrada2.length() + " caracteres");
}//Cierre del main
}//Cierre de la clase
-
Hola ahora mucho mejor
Al nombrar las clases conviene pensar qué será el objeto. Un objeto como este será un Comparador, no un Comparar, por ello es más adecuado un nombre como ComparadorDeDosPalabras, tenerlo en cuenta para los próximos ejercicios.
Una cosa que se puede mejorar es esta:
if ( entrada1.length() > entrada2.length() ){ NumCharCadenaLarga = entrada1.length(); NumCharCadenaCorta = entrada2.length();}
if ( entrada1.length() < entrada2.length() ){ NumCharCadenaLarga = entrada2.length(); NumCharCadenaCorta = entrada1.length();}
if ( entrada1.length() == entrada2.length() ){ NumCharCadenaLarga = entrada1.length(); NumCharCadenaCorta = entrada2.length();}
Si te fijas la primera condición y la tercera llevan a la misma acción. Por ello ahorraríamos código si escribimos:
if ( entrada1.length() >= entrada2.length() ){ NumCharCadenaLarga = entrada1.length(); NumCharCadenaCorta = entrada2.length();}
if ( entrada1.length() < entrada2.length() ){ NumCharCadenaLarga = entrada2.length(); NumCharCadenaCorta = entrada1.length();}
También deberías corregir un pequeño error que tienes en los índices. Por ejemplo esta ejecución:
Porfavor ingrese la entrada 1
pan
Porfavor ingrese la entrada 2
pt
¿Letra 1 igual en las dos palabras? true
¿Letra 2 igual en las dos palabras? false
¿Letra 2 igual en las dos palabras?
La palabra 2 no tiene letra 2
¿Letra 3 igual en las dos palabras?
La palabra 2 no tiene letra 3
Ha finalizado la comparacion
La primera entrada consta de 3 caracteres
La segunda entrada consta de 2 caracteres
Si te fijas Letra 2 se repite y dice que la palabra 2 no tiene letra 2 lo cual no es correcto, el programa está bien pero tienes que corregir los índices para que los mensajes que salgan por pantalla sean los correctos. Debes siempre probar los programas varias veces para comprobar que funcionen bien y que den los mensajes correctos.
Saludos!
-
Hola Cesar
Gracias por tus observaciones, se me había pasado por alto ese detalle de los indice.
Le prestare mas atención a esos detalles de ahora en adelante.
por si acaso subo el código con las mejoras.
Muchas gracias por tu tiempo.
Saludos!!
import java.util.Scanner;
public class CompararDosPalabras{
public static void main (String [] args){
//primera entrada
String entrada1 = "";
System.out.println("Porfavor ingrese la entrada 1");
Scanner escanear1 = new Scanner(System.in);
entrada1 = escanear1.nextLine();
//segunda entrada
String entrada2 = "";
System.out.println("Porfavor ingrese la entrada 2");
Scanner escanear2 = new Scanner(System.in);
entrada2 = escanear2.nextLine();
//Variables
int c = 0;//Contador de palabra
int NumCharCadenaLarga = 0;//variable con el numero de caracteres de la cadena mas larga
int NumCharCadenaCorta = 0;//Variable con el numero de caracteres de la cadenas mas corta
if ( entrada1.length() >= entrada2.length() ){ NumCharCadenaLarga = entrada1.length(); NumCharCadenaCorta = entrada2.length();}
if ( entrada1.length() < entrada2.length() ){ NumCharCadenaLarga = entrada2.length(); NumCharCadenaCorta = entrada1.length();}
while ( c < NumCharCadenaLarga ){
if ( c < NumCharCadenaCorta ){
boolean verdad = entrada1.substring( c, c+1).equals(entrada2.substring( c, c+1) );
System.out.println("¿Letra " + (c+1) + " igual en las dos palabras? " + verdad);
}
if ( entrada1.length() > entrada2.length() && c >= entrada2.length() ){
System.out.println("¿Letra " + (c+1) + " igual en las dos palabras? \nLa palabra 2 no tiene letra " + (c+1));
}
if ( entrada1.length() < entrada2.length() && c >= entrada1.length() ){
System.out.println("¿Letra " + (c+1) + " igual en las dos palabras? \nLa palabra 1 no tiene letra " + (c+1));
}
c ++;
}//Cierre del bucle
//Mensaje para verificar que el programa funciona correctamente, solo ignoren esta parte =P
System.out.println("Ha finalizado la comparacion \nLa primera entrada consta de " + entrada1.length() + " caracteres" +
"\nLa segunda entrada consta de " + entrada2.length() + " caracteres");
}//Cierre del main
}//Cierre de la clase
-
Hola! Cuanto más practiques y veas código más soltura irás adquiriendo así que a seguir avanzando!
Saludos