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:
importjava.util.*;importjava.io.*;publicclassSentencas_ultimo_b_a_par{privatestaticStrings;privatestaticintp;privatestaticbooleanxp(Stringc){return(s.substring(p,p+1).equals(c));}privatestaticbooleannp(){p++;return(true);}privatestaticvoidler_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===============================================================");Scannerscan=newScanner(System.in);System.out.print("\nCadeia (formato xxx@): ");s=scan.nextLine();}publicstaticvoidmain(Stringargs[]){Stringfim="@";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.
R
rregorr
Obrigado, de antemão.
Tentei adaptar o codigo, mas não consegui. Onde eu colocaria esse código dentro do meu?
A
AbelBueno
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.
R
rregorr
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.
A
AbelBueno
Posta aqui como ficou o código que sempre retorna true.
R
rregorr
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. */importjava.util.*;importjava.io.*;publicclassSentencas_ultimo_b_a_par{privatestaticStrings;privatestaticintp;privatestaticbooleanxp(Stringc){return(s.substring(p,p+1).equals(c));}privatestaticbooleannp(){p++;return(true);}privatestaticvoidler_cadeia(){p=0;Scannerscan=newScanner(System.in);System.out.print("\nCadeia a inserir(#para final): ");s=scan.nextLine();}publicstaticvoidmain(Stringargs[]){Stringfim="#";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$"));}}}
A
AbelBueno
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ê?
R
rregorr
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?
A
AbelBueno
Mesmo código… que versao de java tá usando?
R
rregorr
java version "1.7.0_80"
Java™ SE Runtime Environment (build 1.7.0_80-b15)