Estou estudando ER e gostaria de saber como resolvo o seguinte problema: um programa com sentenças de modo que o numero de simbolos “a” seja par, e o ultimo simbolo seja “b”.
Exemplo: aab, aaaab, aaaaaaaab etc.
Estou usando o seguinte código, mas ele só da cadeia rejeitada. Nenhuma é aceita:
import java.util.*;
import java.io.*;
public class Sentencas_ultimo_b_a_par{
private static String s;
private static int p;
private static boolean xp(String c){
return(s.substring(p,p+1).equals(c));
}
private static boolean np() {
p++;
return(true);
}
private static void ler_cadeia() {
p = 0;
System.out.print ("===============================================================");
System.out.print ("\nReconhece cadeias que terminam com b, e a sendo pares");
System.out.print ("\nUse '@' no final para finalizar ");
System.out.print ("\n===============================================================");
Scanner scan = new Scanner(System.in);
System.out.print ("\nCadeia (formato xxx@): ");
s = scan.nextLine();
}
public static void main(String args[]){
String fim = "@";
ler_cadeia();
if(xp("b") && np()){
if(xp("a") && np());
}
while(xp("b") && np()){
if(xp("a") && np());
}
if (xp(fim)){
System.out.println("cadeia ACEITA! \n");
}else{
System.out.println("cadeia REJEITADA! \n");
}
}
}
A resposta em js (pq é mais simples fazer no console do browser), mas em java é a mesma coisa:
"aaaaaab".match(/^(aa)+b$/)
O ^
e $
pra garantir o início e fim da palavra, o sinal + indica que o valor tem que ser repetido uma ou mais vezes, e nesse caso o valor é o grupo (aa), ou seja, um par de letras a. Por último o b sozinho.
1 curtida
Obrigado, de antemão.
Tentei adaptar o codigo, mas não consegui. Onde eu colocaria esse código dentro do meu?
Você diz estar estudando ER, mas nao tem nenhuma no seu código. Você está fazendo o parse da string “na mao”, o que seria justamente onde você usaria a ER.
Toda string tem um método matches, que você usa como mostrado no exemplo acima. A única diferença é que você trocaria as barras por aspas.
Obrigado, mas não funcionou. Sempre retorna true, qualquer q seja o valor. aaab, ab, aaaaab, por exemplo, deveria ser false, aab, aaaab, aaaaaab etc deveria retornar true.
Posta aqui como ficou o código que sempre retorna true.
Eu adaptei o código pra armazenar na variável “s” (scan) o q for digitado pelo usuário, e usar essa variavel pra encontrar a expressão q case com as regras mencionadas(a par ultimo b impar):
/*
Construa e implemente em uma linguagem de programação à sua escolha um AFD M que aceite:
C) todas as sentenças de (a, b)* de modo que o último símbolo seja “b” e o número de símbolos “a” seja par.
*/
import java.util.*;
import java.io.*;
public class Sentencas_ultimo_b_a_par{
private static String s;
private static int p;
private static boolean xp(String c){
return(s.substring(p,p+1).equals(c));
}
private static boolean np() {
p++;
return(true);
}
private static void ler_cadeia() {
p = 0;
Scanner scan = new Scanner(System.in);
System.out.print ("\nCadeia a inserir(#para final): ");
s = scan.nextLine();
}
public static void main(String args[]){
String fim = "#";
ler_cadeia();
if(xp("b") && np()){
if(xp("a") && np());
}
while(xp("b") && np()){
if(xp("a") && np());
}
if (xp(fim)){
System.out.println("Processados os símbolos da fita, estado final com cadeia ACEITA! \n");
}else{
System.out.println("Processados os símbolos da fita, estado final com cadeia REJEITADA! \n");
System.out.println(s.matches("^(aa)+b$"));
}
}
}
Por que você manteve essas chamadas a xp e np? Qual é a funçao deles?
Procure sempre usar nomes claros para seus métodos, assim quem ler consegue entender o que está acontecendo.
Eu copie e colei o código que postou aqui e ele imprime false quando o número de a é impar e true se o número de a é par… nao tá acontecendo isso pra você?
Ok, foi mal, as outras variaveis não têm sentido agora, pois tava tentando adaptar
So esta retornando false em qualquer caso. Vc testou nesse mesmo codigo q mandei ou fez al guma alteração pra retornar true e false?
Mesmo código… que versao de java tá usando?
java version "1.7.0_80"
Java™ SE Runtime Environment (build 1.7.0_80-b15)
Eclipse com Ubuntu