Java - Lenguajes autómatas...capturar cualquier alfabeto y palabra y validar si pertenece los simbolos

 
Vista:
sin imagen de perfil
Val: 5
Ha aumentado su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

Lenguajes autómatas...capturar cualquier alfabeto y palabra y validar si pertenece los simbolos

Publicado por Sandra (3 intervenciones) el 27/01/2019 02:09:21
Buenas tardes...necesito hacer un programa con el cual puede capturar desde el teclado un alfabeto cualquiera, y una palabra ya sea o no con los símbolos del alfabeto, validar si todos los símbolos de la palabra en el alfabeto, de ser así que muestre la longitud de la palabra si no mostrar los símbolos que no pertenecen

ejemplo:
alfabeto:ab
palabra:bc
"c no pertenece al alfabeto"

alfabeto:ab
palabra:aa
longitud:2

para muchos será una bobada y muy fácil pero no logro hacerlo, si alguien me puede ayudar les agradecería
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Lenguajes autómatas...capturar cualquier alfabeto y palabra y validar si pertenece los simbolos

Publicado por Kabuto (1381 intervenciones) el 29/01/2019 01:02:25
Sería interesante que publicases tu código y así poder explicarte en que has fallado o que te ha faltado para completarlo.

De todos modos, aquí te dejo una posible solución.
Básicamente es pedir dos String, el alfabeto y la palabra.

Luego hay que recorrer mediante un bucle, cada caracter de la palabra, extraerlo, y comprobar si esta contenido en el alfabeto.
Para extraer cada caracter, podemos usar el metodo charAt();

Para ver si está contenido, podemos usar el metodo contains() de la clase String.

El problema es que charAt() nos proporciona un dato de tipo primitivo char y el metodo contains() nos pide que le pasemos como parámetro un String, no nos va a aceptar un simple char
¿Como solventarlo?
La clase Character (que representa datos de tipo char pero como objetos de clase) posee un método estático llamado Character.toString() que transforma un simple char en un objeto String.

Así que cogemos el char, lo transformamos a String y se lo pasamos a contains()

contains() nos dirá con true o false si el String que le hemos pasado (nuestro char) está contenido o no en el alfabeto.

Si devuelve true, no tenemos que hacer nada, simplemente pasamos a preguntar por el siguiente caracter de la palabra.
Pero si devuelve false, tenemos que mostrar en pantalla el caracter que hemos detectado que no pertenece al alfabeto.

Cuando termine el bucle de comprobar todos los caracteres de nuestra palabra, necesitamos saber si la palabra es válida o no para mostrar o no su longitud, tal y como pide el enunciado.
Para controlar si la palabra es valida o no, podemos valernos de un boolean.

Si el bucle for encuentra caracteres que no estan contenidos en el alfabeto, además de mostrar en pantalla dicho caracter, cambiará el valor de nuestra variable booleana a false.

Así al terminar el bucle for, podremos saber si la palabra ha sido válida o no.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.util.Scanner;
 
public class Alfabeto {
 
	public static void main(String[] args) {
 
		Scanner teclado = new Scanner(System.in);
 
		System.out.print("Introduzca alfabeto: ");
		String alfabeto = teclado.nextLine();
		System.out.print("Introduzca palabra: ");
		String palabra = teclado.nextLine();
 
		boolean palabraEsValida = true;
 
		//Comprobamos si cada letra de la palabra esta contenida o no en el alfabeto
		for (int i = 0; i < palabra.length(); i++)
		{
			String letra =  Character.toString(palabra.charAt(i)); //Convertimos el char en String...
			if (!alfabeto.contains(letra)) //...para poder usar el metodo String.contains()
			{
				palabraEsValida = false; //Si la letra NO está contenida, es que la palabra no es valida
				//Mostramos el caracter que no es valido.
				System.out.println(letra + " no pertenece al alfabeto");
			}
		}
 
		//Finalizado el bucle, comprobamos el boolean. Si conserva valor true,
		//es que la palabra era válida y hemos de mostrar su longitud
		if (palabraEsValida)
			System.out.println("Longitud: " + palabra.length());
 
		teclado.close();
	}
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 5
Ha aumentado su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

Lenguajes autómatas...capturar cualquier alfabeto y palabra y validar si pertenece los simbolos

Publicado por Sandra (3 intervenciones) el 10/02/2019 02:25:27
Hola, buenas noches, muchas gracias por su ayuda, lamentablemente no la vi a tiempo y resolvi el problema de una manera confusa pero funciona, su solución me parece muy buena y muy entendible, gracias...

Ahora vuelvo a tener un problema, ojalá me pueda ayudar con este programa. En el programa tengo que pedir cierto alfabeto, de ahí me debe preguntar si la palabra debe ser par, impar o pertenecer a un rango de valores, se ingresa el lenguaje y la palabra, debe de validarse si la palabra pertenece al alfabeto y por ende al lenguaje, pero por ejemplo:
alfabeto={0,1}
que sea par
lenguaje={00,01,10,11}
y si ingreso esta palabra
palabra=010 que es impar debe de decir que no pertenece al lenguaje

Espero que me puedan ayudar, ya que no sé como resolverlo, así es como tengo mi código, sé perfectamente que así no debe de ser.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package practica2;
 
import java.util.ArrayList;
import java.util.Scanner;
 
 
public class Practica2 {
 
 
    public static void main(String[] args) {
       Scanner d=new Scanner(System.in);
 
       String alfabeto,palabra,lenguaje;
       int longitud=0;
 
 
       System.out.println("Alfabeto");
       alfabeto=d.nextLine();
 
 
        System.out.println("Lenguaje");
        lenguaje=d.nextLine();
 
 
       System.out.println("Palabra");
       palabra=d.nextLine();
 
       ArrayList a=new ArrayList();
       ArrayList l=new ArrayList();
       ArrayList p=new ArrayList();
 
        for(char c:alfabeto.toCharArray()){
            a.add(c);
        }
        for(char c:lenguaje.toCharArray()){
            l.add(c);
        }
        for(char c:palabra.toCharArray()){
            p.add(c);
        }
 
         //Verifica(a,p);
         String chido=VerificaAlfabeto(a,p);
         if(chido.equals(palabra)){
            //longitud = palabra.length();
            //System.out.println("Longitud: "+longitud);
            System.out.println("Pertenece al alfabeto");
 
            String bien=VerificaLenguaje(l,p);
            if(bien.equals(palabra)){
                System.out.println("Pertenece al lenguaje");
 
 
 
                longitud=palabra.length();
                System.out.println("Longitud: " +longitud);
 
 
                if(longitud%2==0){
                    System.out.println("Es par");
                } else {
                    System.out.println("Es impar");
                }
 
            } else{
                System.out.println("["+ bien + "]" +" No pertenecen al lenguaje");
            }
 
        } else{
             System.out.println("["+ chido + "]" +" No pertenecen al alfabeto");
         }
 
    }
    public static  String VerificaAlfabeto(ArrayList<Character>a,ArrayList<Character>p){
            String Pert="";
            String NoPert="";
            boolean e=false;
            int n=0;
            int m=0;
 
        do{
            if(p.get(n)==a.get(m)){
                Pert=Pert+p.get(n).toString();
                n++;
                m=0;
 
            } else{
                if(m==(a.size()-1)){
 
                    NoPert=NoPert+p.get(n).toString()+" ";
                    e=true;
                    m=0;
                    n++;
 
                }
                else{
                    m++;
                }
 
            }
        }while(n<p.size());
 
         if(e==true){
            return NoPert;
                }else{
                      return Pert;
                }
 
        }
    public static  String VerificaLenguaje(ArrayList<Character>l,ArrayList<Character>p){
            String Pert="";
            String NoPert="";
            boolean e=false;
            int n=0;
            int m=0;
 
        do{
            if(p.get(n)==l.get(m)){
                Pert=Pert+p.get(n).toString();
                n++;
                m=0;
 
            } else{
                if(m==(l.size()-1)){
 
                    NoPert=NoPert+p.get(n).toString()+" ";
                    e=true;
                    m=0;
                    n++;
 
                }
                else{
                    m++;
                }
 
            }
        }while(n<p.size());
 
         if(e==true){
            return NoPert;
                }else{
                      return Pert;
                }
 
 
        }
 
    }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Lenguajes autómatas...capturar cualquier alfabeto y palabra y validar si pertenece los simbolos

Publicado por Kabuto (1381 intervenciones) el 10/02/2019 21:24:32
Hola.
Te propongo esta solución.
Contiene varios comentarios indicando lo que se hace así que supongo que no hace falta que me extienda demasiado con explicaciones, aún así pregunta cualquier duda que tengas o no entiendas.

Creo que cumple lo que se pide.

Para facilitar la legibilidad, los datos más importantes del programa los he puesto como variables globales (es decir, declarados como atributos de clase y no dentro del método main).
Así que tenemos un alfabeto, un lenguaje y una norma que dice si las palabras han de ser pares o impares. Bueno el enunciado indica algo más sobre esto, pero lo he simplificado a solo esas dos posibilidades, por lo tanto, nos servimos de un boolean para establecer esta norma

El alfabeto será un array de char, que representa los caracteres del alfabeto.
El lenguaje será un array de String, que representa las palabras del lenguaje.

Así que:
- Para pedir alfabeto:
Leo un String por teclado y automaticamente lo transformo a un array de char.

- Para pedir lenguaje:
Pido un String con "palabras" separadas por comas. Así, automaticamente puedo transformarlo en un array de String usando el método .split(), diciéndole que "divida" el String ahí donde encuentre comas.

Una vez tengo el lenguaje, comprueba si sus palabras cumplen con el alfabeto y con la norma par/impar

Si el lenguaje es validado, pido una palabra y para comprobar si es buena, tan solo me limito a comprobar si coincide con alguna de nuestro lenguaje validado.


Dicho así, suena fácil je je. Y en realidad no es tan difícil, pero si es importante saber apoyarse en varios métodos, cada uno ha de limitarse ha realizar pequeñas comprobaciones individuales.
Siempre es mejor hacer tres o cuatro métodos simples y sencillos, que no intentar resolverlo con un único método complejo.

Todos los métodos son de tipo boolean, es decir, se limitan ha decir si se cumple "sí/no" la comprobación que tienen asignada.

Pruébalo, coge ideas que te puedan ayudar a buscar una solución más acorde a tus preferencias, y pregunta lo que sea.
Un saludo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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.
	}
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Lenguajes autómatas...capturar cualquier alfabeto y palabra y validar si pertenece los simbolos

Publicado por Esme (1 intervención) el 08/04/2020 06:32:40
Excelente respuesta, me has ayudado con mi tarea!. Gracias! ♥
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Carlos Ramon

Lenguajes autómatas...capturar cualquier alfabeto y palabra y validar si pertenece los simbolos

Publicado por Carlos Ramon (1 intervención) el 22/05/2022 20:40:53
Hola KABUTO. A mi me dejaron esa tarea en la escuela también. No me imagine que encontrara la solucion en un foro. Mi equipo decidió copiar tal cual su codigo, es mas creo que toda la clase. Pero decidí seguir sus instrucciones, y no copie su codigo, por que ademas no lo entendi.

Así que decidí hacerlo como entendí sus instrucciones, pero para usar el ciclo for tengo aun problemas.
Podría por favor revisar mi código y darme algún consejo. Se lo agradecería enormemente. Por cierto yo use un array, por que quise que las entradas del usuario, cuando declara el alfabeto se guardaran algo asi como un conjunto. Espero me de a entender. A y también disculpe mis faltas de ortografía.
Captura-de-pantalla-2022-05-22-133543
Captura-de-pantalla-2022-05-22-133612
Captura-de-pantalla-2022-05-22-13370733

Le tome captura a mi codigo, no si esta es la forma correcta de compartir codigo. Como sea le agradezco mucho su respuesta proxima.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar