Agregado metodo comprobación paso a paso, agregado arraylist de estado validos y metodo reset en Maquina.java

This commit is contained in:
carlos 2017-07-03 17:30:30 +00:00
parent ad0ca3738a
commit 6744de19d5
2 changed files with 59 additions and 9 deletions

View File

@ -13,6 +13,7 @@ import java.util.ArrayList;
class Automata { class Automata {
private ArrayList<Estado> estados; private ArrayList<Estado> estados;
private ArrayList<Integer> estados_existentes;
Automata(Document document) { Automata(Document document) {
setEstados(new ArrayList<>()); setEstados(new ArrayList<>());
@ -50,6 +51,10 @@ class Automata {
System.exit(1); System.exit(1);
} }
} }
estados_existentes = new ArrayList<Integer>();
for(int i=0 ; i < getEstados().size() ; i++){
if(getEstados().get(i) != null) estados_existentes.add(getEstados().get(i).getQ());
}
} }
ArrayList<Estado> getEstados() { ArrayList<Estado> getEstados() {

View File

@ -14,12 +14,11 @@ class Maquina implements Cloneable {
private Estado estadoactual; private Estado estadoactual;
private Enlace enlaceactual; private Enlace enlaceactual;
private String cintaanterior; private String cintaanterior;
private int cabezal;
Maquina(Document document) { Maquina(Document document) {
maquina = new Automata(document); maquina = new Automata(document);
estadoactual = maquina.getEstados().get(0); reset();
enlaceactual = null;
cintaanterior = "";
} }
@Override @Override
@ -45,14 +44,23 @@ class Maquina implements Cloneable {
public String getCintaanterior() {return cintaanterior;} public String getCintaanterior() {return cintaanterior;}
public int getCabezal() {return cabezal;}
public void reset(){
estadoactual = maquina.getEstados().get(0);
enlaceactual = null;
cintaanterior = "";
cabezal = 0;
}
boolean comprobarCadena(StringBuilder cinta, int[] estadoFinal) { boolean comprobarCadena(StringBuilder cinta, int[] estadoFinal) {
//estadoactual = maquina.getEstados().get(0); //estadoactual = maquina.getEstados().get(0);
int cabezal = 0;
int i; int i;
for (i = 0; i < estadoactual.getEnlaces().size(); i++) { for (i = 0; i < estadoactual.getEnlaces().size(); i++) {
if (estadoactual.getEnlaces().get(i).getSi() == cinta.charAt(cabezal)) { if (estadoactual.getEnlaces().get(i).getSi() == cinta.charAt(cabezal)) {
cinta.setCharAt(cabezal, estadoactual.getEnlaces().get(i).getSj()); enlaceactual = estadoactual.getEnlaces().get(i);
switch (estadoactual.getEnlaces().get(i).getMovimiento()) { cinta.setCharAt(cabezal, enlaceactual.getSj());
switch (enlaceactual.getMovimiento()) {
case 'L': { case 'L': {
cabezal--; cabezal--;
if (cabezal == (-1)) { if (cabezal == (-1)) {
@ -70,19 +78,56 @@ class Maquina implements Cloneable {
} }
default: {/*Se mantiene*/} default: {/*Se mantiene*/}
} }
estadoactual = estadoactual.getEnlaces().get(i).getQj(); estadoactual = enlaceactual.getQj();
i = -1; i = -1;
} }
} }
for(i=0;i<estadoFinal.length;i++){ for(i=0;i<estadoFinal.length;i++){
if(estadoactual.getQ() == estadoFinal[i]) return true; if(estadoactual.getQ() == estadoFinal[i]){
reset();
return true;
} }
}
reset();
return false; return false;
} }
boolean comprobarCadenaS2S(StringBuilder cinta, int[] estadoFinal){ boolean comprobarCadenaS2S(StringBuilder cinta, int[] estadoFinal){
cintaanterior = cinta.toString(); cintaanterior = cinta.toString();
return false; // Programando ahora int i;
for (i = 0; i < estadoactual.getEnlaces().size(); i++) {
if (estadoactual.getEnlaces().get(i).getSi() == cinta.charAt(cabezal)) {
enlaceactual = estadoactual.getEnlaces().get(i);
estadoactual = enlaceactual.getQj();
cinta.setCharAt(cabezal, enlaceactual.getSj());
switch (enlaceactual.getMovimiento()) {
case 'L': {
cabezal--;
if (cabezal == (-1)) {
cinta.insert(0, "#");
cabezal++;
}
break;
}
case 'R': {
cabezal++;
if (cabezal == cinta.length()) {
cinta.insert(cabezal, "#");
}
break;
}
default: {/*Se mantiene*/}
}
return true;
}
}
for(i=0;i<estadoFinal.length;i++){
if(estadoactual.getQ() == estadoFinal[i]){
enlaceactual = null; // Indicar que no hay más transiciones
return true;
}
}
return false;
} }
} }