Sunteți pe pagina 1din 23

public class Persona {

/* Dato enumerado, representa todos


los estados
que puede tener una persona */
public enum Estados{
DESPIERTO,
DORMIDO
};

// El estado actual de la persona


public Estado estadoActual;

// Indica si la persona tiene sus


ojos abiertos
public boolean ojosAbiertos;

/* Constructor Inicial, se debe


pasar en que estado inicial de la
persona
y en funcion a eso, asigna si el
usuario tiene los ojos abiertos. */
public Persona(Estados
estadoInicial){
estadoActual = estadoInicial;
ojosAbiertos = estadoActual ==
Estados.DESPIERTO;
}

// Retorna el estado actual de la


persona
public Estado getEstadoActual(){
return estadoActual;
}

// Asigna un nuevo estado a la


persona
public void setEstadoActual(Estados
estadoNuevo){
// Aseguro que el estado a
asignar sea diferente al estado actual.
if(estadoActual != estadoNuevo){
// Si el nuevo estado es
DESPIERTO, valido que el usuario tenga
los
// ojos cerrados
if(estadoActual ==
Estados.DESPIERTO && !ojosAbiertos){
estadoActual =
estadoNuevo;
}else if(estadoActual ==
Estados.DORMIDO && ojosAbiertos){
// Si el nuevo estado
es DORMIR, valido que el usuario tenga
los ojos
// abiertos
estadoActual =
estadoNuevo;
}
}
}
}
Programando mi primer
autómata en Java
Navegando en el foro de Java México me encontré
con un post en el que solicitan ayuda para
programar un autómata que reconozca el siguiente
patrón 0*(11)+0* Me pareció interesante la nota, el
Autómata debe aceptar cadenas con al menos un
par de 1, rodeados de uno, muchos o ningún cero.

Cadenas aceptadas:
11
00000110000
11000
0000011
01111000

Cadenas no aceptadas:
001100110
0000111
111000
0101011
110011

Me he tomado el tiempo de hacer el diagrama del


autómata
Aquí el código fuente

/*
* Automata11
* Copyright (C) 2017 Roberto Lopez
marcos.robrto.lopez@gmail.com
*
* This program is free software; you
can redistribute it and/or
* modify it under the terms of the GNU
General Public License
* as published by the Free Software
Foundation; either version 2
* of the License, or (at your option)
any later version.
*
* This program is distributed in the
hope that it will be useful,
* but WITHOUT ANY WARRANTY; without
even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the
* GNU General Public License for more
details.
*
* You should have received a copy of
the GNU General Public License
* along with this program; if not,
write to the Free Software
* Foundation, Inc., 59 Temple Place -
Suite 330, Boston, MA 02111-1307, USA.
*/
package com.rlopez.demo.automata;

import javax.swing.JOptionPane;

/**
*
*/
public class Automata11 {
//init state

private static final int Q0 = 0;


private static final int Q1 = 1;
private static final int Q2 = 2;
private static final int Q3 = 3;
private int state;
public StringBuilder buffer;

public Automata11() {
state = Q0;
}

public int getState() {


return state;
}

public boolean accept(String str,


boolean debug) {
init();
for (char c : str.toCharArray()) {
int previousState = state;
appendChar(c);
System.out.println("'" + c + "' " +
getStateName(previousState) + " -> " +
getStateName(state));
}
return state == Q3;
}

private void init() {


state = Q0;
buffer = new StringBuilder();
}

private String getStateName(int


stateToGet) {
String stateName = "";
switch (stateToGet) {
case Q0:
stateName = "Q0";
break;
case Q1:
stateName = "Q1";
break;
case Q2:
stateName = "Q2";
break;
case Q3:
stateName = "Q3";
break;
}
return stateName;
}

private void appendChar(char character)


{
if (character != '1' && character !=
'0') {
System.err.println("Invalid
character");
return;
}
buffer.append(character);
switch (state) {
case Q0:
if (character == '1') {
state = Q1;
} else {
state = Q0;
}
break;
case Q1:
if (character == '1') {
state = Q3;
} else {
state = Q2;
}
break;
case Q2:
//not matter accept any character
state = Q2;
break;
case Q3:
if (character == '1') {
state = Q1;
} else {
state = Q3;
}
break;
default:
System.err.println("Error unknow
state");

}
}

public static void main(String args[])


{
String string =
JOptionPane.showInputDialog(null, "Enter
the string with 0 and/or 1");
Automata11 automata11 = new
Automata11();
System.out.println("The enter String
'" + string + " is accept?:" +
automata11.accept(string, true));

}
}
Programacion de
automatas!
Quisiera que me ayudaran, hace unos días
me dejaron un ejercicio en java, lo pude
hacer por utilizando "matches" y el profesor
me dijo que no lo quería así, utilizando
solamente cadeas (strings) el ejerció a
resolver es este:

(a|b?|c)+a
Quisiera que me ayudaran con un ejemplo
de como programarlo de antemano.
SEGUIR
1 RESPUESTA
RESPUESTA DE FBLUISG

fbluisg, He trabajado con java, c, c++, visual


basic, c#, sql, ruby

Esa es una expresión regular, lo que tienes


que hacer es resolverla por el método de
thompson o el método del árbol, esto te
despliega un autómata con estados, luego
para programarlo es bastante sencillo, por
cada estado es un case y por cada lazo es
un if.
Por lo que veo te van a salir dos estados
creo entonces irían dos case y como 6 o 7
if, aquí te dejo algo que hice así rapido
espero te ayude y cualquier pregunta ya
sabes que aquí estamos.
String cadena = "bcbcbaabcbcbabca";
int estado = 0;
int lon = 0;
while(cadena.length()!=lon){
char m = cadena.charAt(lon);
switch(estado){
case 0:
if(m=='a'){
estado = 1;
}
else if(m=='b'){
estado = 0;
}
else if(m=='c'){
estado = 0;
}
else {
estado = 3;
}
break;
case 1:
if(m=='a'){
estado = 1;
}
else if(m=='b'){
estado = 0;
}
else if(m=='c'){
estado = 0;
}
else{
estado = 3;
}
break;
}
lon++;
}
if(estado == 1){
System.out.println("cadena
aceptada");
}
else{
System.out.println("cadena no
aceptada");
}
Implementación de AFD en
JAVA
Unknown viernes, septiembre 21, 2012

Este es la implementacion de un automatas finito


determinista en JAVA, lee solo a's y b's; simula lo
siguiente:

package automata;
/**
*
*@authorDancourbano*/
import java.util.Scanner;

public class Automata {


int cont;
char [] car;
boolean aceptado;

public static void main(String[] args) {

String cadena;
//String cadena ="ababa";
Scanner teclado=new Scanner(System.in);
Automata aut = new Automata();// TODO code application logic here
cadena=teclado.next();

aut.car = cadena.toCharArray();
aut.inicio();
if(aut.aceptado)
System.out.println("aceptacion");
else System.out.println("no aceptacion");
}
public void inicio(){
cont =0;
q0();
}
public void q0(){
System.out.println("En q0");
aceptado=false;
if(cont<car.length){
if(car[cont]=='a'){
cont++;
q1();
}else if(car[cont]=='b'){
cont++;
q4();
}
}//else System.out.println("En error");

}
public void q1(){
System.out.println("En q1");
if(cont<car.length){
if(car[cont]=='b'){
cont++;
q2();
}}

//else System.out.println("En error");


}
public void q2(){
System.out.println("En q2");
if(cont<car.length){
if(car[cont]=='a'){
cont++;
q2();
}else if(car[cont]=='b'){
cont++;
q3();
}
}//else System.out.println("En error");

}
public void q3(){
System.out.println("En q3 ");
aceptado=true;
if(cont<car.length){

if(car[cont]=='a'){
cont++;
q3();
}else if(car[cont]=='b'){
cont++;
qerror();

}
}//else System.out.println("En aceptacion");

}
public void q4(){
System.out.println("En q4");
if(cont<car.length){
if(car[cont]=='a'){
cont++;
q4();
}else if(car[cont]=='b'){
cont++;
q5();
}
}//else System.out.println("En error");
}
public void q5(){
System.out.println("En q5 ");
aceptado=true;

if(cont<car.length){

if(car[cont]=='a'){
cont++;
q5();
}else if(car[cont]=='b'){
cont++;
qerror();

}
}//else System.out.println("En aceptacion");

public void qerror(){


System.out.println("En error");
aceptado = false;
return;
}

}
Autómata Finito Determinista
Que Reconoce el Lenguaje
[a.a*aa*]
Unknown jueves, julio 14, 2011

GRAFICO DEL AUTOMATA

CODIFICACIÓN EN C++

//AUTOMATAS DETERMINISTAS =
DEFINIDO
#include<iostream>
using namespace std;

int mover( int estado , char simbolo)


{
if( estado == 1 && simbolo == 'a' )
return 2;

if( estado == 2 && simbolo == '.' )


return 3;

if( estado == 3 && simbolo == 'a' )


return 4;

if( estado == 3 && simbolo == 'a' )


return 3;

if( estado == 4 && simbolo == 'a' )


return 4;

return 0;
}

int scanner(char palabra[10] )


{
int i = 0;
int estado = 1; //estado inicial

while(palabra[i])
{
estado = mover(estado,palabra[i]);
i++;
}

if ( estado == 4) //estado final


return 1;

return 0;
}

int main()
{
system("color f0");

while(1)
{
char palabra[10];

cout<<"\n\n\t\tIngrese Cadena : ";


gets(palabra);

if( scanner(palabra))
cout<<"\n\n\t\t\t Corecto !!! ";

else
cout<<" \n\n\t\t\t Error !!!!";

cout<<endl<<endl;
system("pause");
system("cls");
}
return 0;

S-ar putea să vă placă și