package alfabeto;
import java.util.Scanner;
public class Alfabeto2 {
//Variables de uso global
static char[] alfabeto; //Caracteres del alfabeto
static String[] lenguaje; //Palabras del lenguaje
static boolean palabrasHanDeSerPares; //Indicador de si las palabras han de ser pares
//Programa principal
public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
System.out.print("Introduzca alfabeto: ");
alfabeto = teclado.nextLine().toCharArray(); //Automaticamente se convierte en array de char
System.out.print("¿Palabras han de ser pares?(S/N): ");
if (teclado.nextLine().toLowerCase().equals("s"))
palabrasHanDeSerPares = true;
else
palabrasHanDeSerPares = false;
System.out.println(palabrasHanDeSerPares?"Se asume que las palabras han de ser PARES":"Se asume que las palabras han de ser IMPARES");
System.out.println("Introduzca ahora las palabras del lenguaje, separadas por comas:");
lenguaje = teclado.nextLine().split(","); //Automaticamente se convierte en array de String
if (compruebaLenguaje()) {
System.out.println("\nEl lenguaje ha sido verificado.");
System.out.print("\nIntroduzca ahora palabra ha comprobar: ");
String palabra = teclado.nextLine();
/*
* Puesto que ya tenemos un lenguaje validado, nos basta con comprobar si esta palabra
* coincide con algunas de las palabras de nuestro lenguaje
*/
System.out.println(palabraPerteneceALenguaje(palabra)?"\nSI pertenece al lenguaje":
"\nNO pertenece al lenguaje");
}
else {
System.out.println("\nEl lenguaje contiene palabras no acordes con el alfabeto indicado.");
}
System.out.println("\n\t\tFIN DE PROGRAMA");
teclado.close();
}
/**
* Sencillo método que confirma si la longitud de una palabra es par.<br>
* La longitud será par si al dividir entre 2, su resto equivale a 0.
* @param pal <b>String</b> palabra a comprobar.
* @return <b>true</b> si es par, <b>false</b> en caso contrario.
*/
static boolean palabraEsPar(String pal) {
return (pal.length() % 2 == 0);
}
/**
* Sencillo método que confirma si la longitud de una palabra es impar.<br>
* La longitud será impar si al dividir entre 2, su resto es distinto de 0.
* @param pal <b>String</b> palabra a comprobar.
* @return <b>true</b> si es impar, <b>false</b> en caso contrario.
*/
static boolean palabraEsImpar(String pal) {
return (pal.length() % 2 != 0);
}
/**
* Comprueba si una palabra contiene caracteres acordes al <i>alfabeto</i> establecido
* y por lo tanto es una palabra válida.
* @param pal <b>String</b> palabra a comprobar.
* @return <b>true</b> si la palabra es válida, <b>false</b> en caso contrario.
*/
static boolean palabraPerteneceAlfabeto(String pal) {
//Comprobamos caracter a caracter con un bucle
for (int i = 0; i < pal.length(); i++) {
boolean pertenece = false; //Si encontramos caracter dentro alfabeto, adoptará valor true
char caracter = pal.charAt(i);
for (int j = 0; j < alfabeto.length; j++) { //Buscamos caracter dentro del alfabeto
if (alfabeto[j] == caracter)
pertenece = true;
}
//Si variable "pertenece" conserva valor false, es que la palabra contiene caracteres no válidos.
if (!pertenece)
return false; //Esto finaliza este método indicando que la palabra NO es válida.
}
//Si el bucle principal ha finalizado sin retornar false, es que la palabra es válida.
return true;
}
/**
* Comprueba si las palabras del <i>lenguaje</i> son válidas según el <i>alfabeto</i> establecido.<br>
* Las comprobaciones consisten en comprobar si las palabras cumplen con la longitud (par o impar)
* indicada por el usuario y si cada palabra esta construida con caracteres propios del <i>alfabeto</i>.
* @return <b>true</b> si el <i>lenguaje</i> es válido, <b>false</b> en caso contrario.
*/
static boolean compruebaLenguaje() {
//Primera comprobación, si las palabras son pares o impares según se haya indicado
if (palabrasHanDeSerPares) {
//Devolveremos false si encontramos alguna palabra IMPAR
for (String palabra: lenguaje)
if (palabraEsImpar(palabra))
return false;
}
else {
//Devolveremos false si encontramos alguna palabra PAR
for (String palabra: lenguaje)
if (palabraEsPar(palabra))
return false;
}
//Segunda comprobación, si las palabras estan construidas con caracteres del alfabeto.
for (String palabra: lenguaje)
if (!palabraPerteneceAlfabeto(palabra))
return false; //Se ha encontrado una palabra no acorde al alfabeto.
//Finalizadas las comprobaciones sin retornar false, es que el lenguaje es acorde al alfabeto.
return true;
}
static boolean palabraPerteneceALenguaje(String pal) {
boolean pertenece = false;
for (String palabra: lenguaje) {
if (palabra.equals(pal))
pertenece = true;
}
return pertenece; //Solo tendrá valor true, si se encontro palabra coincidente en el lenguaje.
}
}