Недопустимый вывод программы конечного автомата - PullRequest
0 голосов
/ 07 декабря 2018

Я работаю над проектом, и мой код не работает, не знаю почему.Учитывая тестовую программу и общий класс, мне нужна программа, которая удовлетворяет следующему логическому регулярному выражению:

L1: для алфавита {a, b} все строки, содержащие нечетное число a и ровно одно b.

Тестовый ввод: aabaaaa, aaabaaaa, aabaaaab, baaaaaa, aaaaabaa

Какой он должен быть:

aabaaaa False

aaabaaaa True

aabaaaab false

baaaaaa false

aaaaabaa True

Вывод программы: (ture, true, true, false, true)

My Test program:

import java.util.Scanner;

// Test Finite State Machine Class
public class TestFSML1
{
  public static void main(String[] args){
    String A = "ab";
    int[][] ST = {{1,3,0},
            {1,2,1},
            {2,2,2},
            {3,3,3}};
    int[] AS = {0,0,1,0};
    Scanner in = new Scanner(System.in);
    String inString;
    boolean accept1 = false;
    FSM FSM1 = new FSM(A, ST, AS);

// Input string is command line parameter
    System.out.println("     Input       Accepted:");

    for(int i=0;i<args.length;i++) {
      inString = args[i];
      accept1 = FSM1.validString(inString);

      System.out.printf("%10s%13s\n",inString, accept1);
    }
  } // end main
} // end class

FSM Class

// Finite State Machine Class
public class FSM
{
  // Instance variables
  public  String alphabet;
  public  int    stateTrans[][];
  public  int    acceptState[];
  private int    cstate;

  // Constructor function

  public FSM(String A, int[][] ST, int[] AS)
  {
    int NSYMBOLS = A.length();
    int NSTATES  = AS.length;
    // Alphabet
    alphabet = "" + A;
    // State transition table
    stateTrans = new int[NSTATES][NSYMBOLS];
    for(int r = 0; r < NSTATES; r++)
      for(int c = 0; c < NSYMBOLS; c++)
        stateTrans[r][c] = ST[r][c];
    // Accept states
    acceptState = new int[NSTATES];
    for(int r = 0; r < NSTATES; r++)
      acceptState[r] = AS[r];
    // Start state
    cstate = 0;
  } 

  // Methods

  public int getState()
  {
    return cstate;
  }

  public void setState(int state)
  {
    cstate = state;
    return;
  }

  public int nextState(char symbol)
  {
    int nstate = -1;
    int col = alphabet.indexOf(symbol);
    if(col >= 0)
      nstate = stateTrans[cstate][col];
    return nstate;
  }

  public boolean accept(int state)
  {
    if(state < 0)
      return false;
    return (acceptState[state] != 0);
  }

  public boolean validString(String word)
  {
    cstate = 0;
    for(int k = 0; k < word.length(); k++){
      cstate = nextState(word.charAt(k));
      System.out.print(cstate);
      System.out.println("  " + word.charAt(k));
      if(cstate < 0)
        return false;
    }
    return accept(cstate);
  }


} // end class

Спасибо!

1 Ответ

0 голосов
/ 07 декабря 2018

Вот простой метод, который я набрал, чтобы выполнить задачу, которую вы хотели.

public static boolean validWord(String s) {

        int aCounter = 0;
        int bCounter = 0;
        char c;

        for (int i = 0; i < s.length(); i++) {

            c = s.charAt(i);

            if ((int) c == (int) 'a') {

                aCounter++;
            } else {

                bCounter++;
            }
        }

        return (aCounter % 2 == 1 && bCounter == 1);
    }

У меня были проблемы с пониманием того, как вы реализуете свой метод, и я думаю, что это может быть намного проще.Я уверен, что переменные экземпляра, которые вы включили в класс FSM, служат для другого использования, но вам не нужны никакие из них для анализа строки.Просто используйте что-то вроде этого, это должно быть достаточно просто для интеграции в ваш код, так как все, что нужно, это строка.Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...